- 1. AWS LambdaでTypeScriptのコードを動かす最小の構成 with AWS SAM
- 2. 【小ネタ】Lambda の Dockerイメージをコードから作成した話
- 3. AWS CDK – Node.js 18 TypeScript での Lambda 実装
- 4. [Python / AWS lambda] AWS Lambda実行時にnumpyのRuntime.ImportModuleError
- 5. lambda Amazon API Gateway APIキー認証を用いた認証付きAPIを作ってみる
- 6. PythonであるLambda関数から別のLambda関数を呼び出す
- 7. AWS Lambdaの再試行回数によって処理を分岐させる方法
- 8. 非同期処理で立ち上げたlambdaのDLQはFIFOキューに入れられない
- 9. クラウドで堂々のシェア1位!AWS(Amazon Web Services)
- 10. AWS SAMでGo+API Gateway+Lambda+DynamoDBのサーバレスAPI構築をIaC化した
- 11. ハイパフォーマンスLambdaエコノミクス
- 12. AWS TimestreamのtimeカラムをLambdaでJSTに変換する際のTips
- 13. AWS SDK V3 のDynamoDBで、いくつか動作確認した話(AWS SDK V2 → V3 移行Tips)
- 14. AWS SSM RunCommandを利用してlambdaからEC2インスタンスを操作する
- 15. Stripe WebhookイベントのデータをKinesisのCosumer(Lambda)で受け取り、何らかのデータ更新をする
- 16. Lambdaのtimeoutを検知してSlackに通知する
- 17. メトリクスフィルター設定後、自動的にCloudWatchAlarmが作成されるようにしてみた
- 18. Lambda がマウントする EFS エンドポイントの Posix ユーザの嵌り
- 19. S3 イベント通知でLambdaを実行する構築ハンズオン
- 20. DynamoDB テーブルに保存されている項目にLambda 関数で、アクセスしたい時
AWS LambdaでTypeScriptのコードを動かす最小の構成 with AWS SAM
# はじめに
AWS Lambdaってお手軽に使えるんでしょ?と思いながら簡単なLambdaを書いたのですが、初心者の私はTypeScriptの知識もないために、デプロイするまでが難しかったです。
AWS SAM CLIを使ってテンプレートから作成するとゴチャゴチャしていて分かりにくいと感じたので、Lambdaとして実行するための必要最小限の構成を手動で作る手順を残しておきます。
# 開発環境
– Windows 10
– Git bash
– Node v16.18.1 / npm 8.19.2
– aws-cli/2.9.9 Python/3.9.11 Windows/10 exe/AMD64 prompt/off
– SAM CLI, version 1.67.0# 基本的なセットアップ
SAMでは `$ sam init` で対話型でテンプレートからプロジェクトを生成することが可能ですが、今回は使わずに一からプロジェクトを作ります。
ちなみに、Windows版のAWS SAM CLIをインストールすると、bashで `$ sam` を使うためにはひと工夫必要でし
【小ネタ】Lambda の Dockerイメージをコードから作成した話
# はじめに
[Releaseタグ作成からEKSへのデプロイを自動化した話](https://qiita.com/ijufumi/items/c8c54c2295baf04113b2) でやった内容のうち、 `Lambda` に焦点を当てた内容です。
載せているコードは一部だけなので、全体を見たい方は上記の記事から辿ってください。
# 環境
* `Kubernetes`: `1.24`
* `AWS CDK for Golang`: `v2.56.1`# やったこと
## Lambda用のコードを準備
`lambda` ディレクトリに、必要なファイルを用意します。
`Dockerfile` のみ載せています。
他は、`Github` リポジトリを参照。* `Dockerfile`
“`Dockerfile
FROM public.ecr.aws/lambda/python:3.9COPY . ${LAMBDA_TASK_ROOT}
COPY requirements.txt .
RUN pip install –upgrade pip && pip3
AWS CDK – Node.js 18 TypeScript での Lambda 実装
# 前提条件
– IaC は CDK(CDK v2)
– Lambda のランタイムは Node.js 18(拡張子は.mjs)
– Lambda の実装は TypeScript(AWS SDK for JavaScript v3)# ファイル 構成
`cdk init`で自動生成される構成から多少変更している。
[実践!AWS CDK #7 ファイル分割](https://dev.classmethod.jp/articles/cdk-practice-7-split-file/)を参考に、AWS リソースごとにリソース定義ファイルを分割している。
Lambda のコンパイル用に別途`tsconfig.json`を用意する。“`
├─ src/
│ ├─ lib/
│ │ ├─ api-gateway/
│ │ │ ├─ handlers/
│ │ │ │ └─ sample-api/
│ │ │ │ └─ index.ts // Lambdaコード
[Python / AWS lambda] AWS Lambda実行時にnumpyのRuntime.ImportModuleError
# エラー内容
“`bash:Cloudwatch Logsのロググループで確認
[ERROR] Runtime.ImportModuleError: Unable to import module ‘src.handlers.filename’:IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!
Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.We have compiled some common reasons and troubleshooting tips at:
https://numpy.org/devdocs/user/troubleshooting-importerror.html
Please note and check
lambda Amazon API Gateway APIキー認証を用いた認証付きAPIを作ってみる
# 概要
– lambdaとAPI Gatewayを使ってAPIキー認証を使った認証付きAPIを作ってみたので方法をまとめる。
# 情報
– 筆者はMacOSの端末を使っている。
# 方法
## lambdaの準備
1. 下記の情報でlambda関数を作成する。
– 関数の種別:一から作成
– 関数名:returnHello
– ランタイム:Node.js 18.x
– アーキテクチャ:x86_64
– 基本的な Lambda アクセス権限で新しいロールを作成
1. 関数作成時に作成されたindex.mjsの内容は特に変更せず、Testを実行して、200のステータスと「Hello from Lambda!」の文字列が返されることを確認する。## API Gatewayの準備
1. lambdaの「関数の概要」から「トリガーを追加」をクリックする。
![returnHello_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0
PythonであるLambda関数から別のLambda関数を呼び出す
最近あるLambda関数から別のLambda関数を呼び出す処理をする際に少し調べたのでメモ。
# 環境
| ランタイム | Python 3.9 |
| — | — |# 今回の想定ケース
特定のLambdaから別のLambdaをまるごと呼び出す処理を想定。
今回は、以下の`testFunction01`から`testFunction02`を呼び出すような処理を実現していく。“`python:testFunction01
def lambda_handler(event, context):
print(‘[testFunction01] testFunction01’)
“`“`python:testFunction02
def lambda_handler(event, context):
print(‘[testFunction02] Called by testFunction01’)
return {‘message’: ‘called by testFunction01’}
“`# 実現方法
基本的には[inv
AWS Lambdaの再試行回数によって処理を分岐させる方法
業務の都合でAWS Lambdaの処理を再試行回数によって分岐させる必要が出てきたので、その実装を含めシェアします。
# 実現できることのイメージ
※Lambdaは最大2回まで再試行を設定可能です。“`Java
if (再処理回数 == 0) {
// 処理A
} else if (再処理回数 == 1) {
// 処理B
} else {
// 処理C
}
“`# とりあえず考えられる方法
基本的に以下の方法は **「Lambdaが再試行されるときはリクエストIDが同じになるのでそれをどうカウントするか」** という考え方が基になっています。なお、リクエストIDはUUIDっぽいので、他のリクエストIDとは被ることはないという前提です。
– CloudWatch Logsのログを読み取ってリクエストIDをカウントする ([参考](https://zenn.dev/shimo_s3/articles/c2895880138d19))
– DynamoDBなどのDBに記録しつつそれを読み取ってリクエストIDをカウントする ([参考](https:
非同期処理で立ち上げたlambdaのDLQはFIFOキューに入れられない
当たり前といえば当たり前かもしれないですが、設計時点で気が付かなかったのでメモ。
非同期実行の例としてS3, API Gatewayを想定しています。青い矢印は正常に疎通が取れます。
![名称未設定ファイル.drawio (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882979/1db77976-0ba3-d5dd-fd2d-12ffa2bb4715.png)
# なぜこうなるのか
非同期実行でLambdaへ処理が流れてきたときに、Lambda内で並列的に同時実行されるためだと思います。要するに、流れてきたときには処理A, 処理B, 処理C, …という順序で流れてきたものが、再試行後の失敗時にはその順序が(例えば) 処理C, 処理A, 処理B, …と変わってしまっている可能性が高いためです。
そのためFIFOキューの特徴である順序を保つということが保証できなくなり、仕様上送信できないのではないかと思われます。
**※ですが、console上ではFIFOキューをDLQとし
クラウドで堂々のシェア1位!AWS(Amazon Web Services)
![aws.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/fc7040ff-915a-e4de-99bd-f8262b8c4bfc.jpeg)
エスプリフォートでは積極的に新しい事を取り入れつつ、ビジネスシーンに合わせたインフラ及びシステム構成、セキュリティ、BCP対策などを考慮したご提案を心がけています。
これら磨きあげた技術力が、お客様に高いクオリティでシステムを提供する一助になっています。## はじめに
[今では当たり前!クラウドコンピューティング導入](https://qiita.com/espritfort_tech/items/4b5fc2c8b8a4b733ac88)
[新たなアプローチ!サーバーレスアーキテクチャ](https://qiita.com/espritfort_tech/items/83883ece946bf38f8bac)上記記事でご紹介した通り、クラウドサービスは今ではあらゆるシステムにとってなくてはならないサービスの一つになっていることは、既
AWS SAMでGo+API Gateway+Lambda+DynamoDBのサーバレスAPI構築をIaC化した
# はじめに
前回Goで作成したAPIの環境構築をSAMでIaC化しました。https://qiita.com/tkhs1121/items/7b193dcce19539f16761
# 環境
MacBook Air M1
開発言語 Go# 手順
AWS CLIとSAM CLIをインストールします。
“`shell
brew install awscli
brew tap aws/tap
brew install aws-sam-cli
“`AWSコンソールのIAMからアクセスキーを作成して、クレデンシャルを設定します。
“`shell
aws configure
“`前回のソースディレクトリにSAMの`template.yaml`を追加します。
https://github.com/tkhs1121/go-serverless-app-3
## ソースコード
“`yaml:template.yaml
AWSTemplateFormatVersion: ‘2010-09-09’
Transform: AWS::Serverless-2016-10-
ハイパフォーマンスLambdaエコノミクス
# はじめに
遅くれるとよくないもの、それは納期とAPIのレスポンスです。
納期はお客さんや仲間からの信頼を失い、APIのレスポンス遅延はエンドユーザを失います。
webAPI構築にLambdaを利用するシーンについてパフォーマンスを改善していくのかをお話できればと思います。Lambdaエコノミクスと謳っているとおり、Lambdaの前段にApiGatewayを配置したときのよくある構成をベースに、ボトルネックとなりなりうる箇所を紹介していきます。
![無題のプレゼンテーション_-_Google_スライド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389053/60af2620-170b-51d3-fd75-77e33adbd0b3.png)# 対象読者層
・DynamoDB使ってみたいけど何に気をつければいいかわからない人
・RDS Proxy使ってみたいけど何に気をつければいいかわらかない人
・同じ構成でパフォーマンスがでなくて困ってる人# 負荷試験をはじめるまえに
まず、プロ
AWS TimestreamのtimeカラムをLambdaでJSTに変換する際のTips
# 問題
Timestreamにて“`time“`カラムが下記のように“`タイムゾーン無し&文字列“`として出力される場合があります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/d7f9fc4f-e0fa-2736-f51a-c3b3d9380dc2.png)
Lambdaで時間処理を行う場合、文字列では不便ですのでJSTに変換しなければなりません。
ですが、単純に“`str → date“`では変換できない事象が発生しましたので共有したいと思います。
できれば、レイヤーも追加せず簡単に行う方法かつ、python3.9に合うモダンな方法にしたい。# 解決策
そのままの状態では、dateフォーマットに合わないことがわかりました。
最初に文字列として取得できるので、**末尾の桁数を調整**することでやや力技ですが解決できました。“`python
from datetime import datetime
from zoneinfo impor
AWS SDK V3 のDynamoDBで、いくつか動作確認した話(AWS SDK V2 → V3 移行Tips)
# はじめに
https://qiita.com/Syoji_Yonemoto/items/e619d8199b7c8354248f
V3移行の動作確認の初手に、Firehoseを選んだせいかもしれないですが、V2で使ってたメソッドの互換があるか保証がないことが分かったので、普段、Lambdaで利用するAPIについては一通り、動作確認をしていっています。
今回は、DynamoDB編です。
# 結論
DynamoDBに関しては、私が普段使うメソッド群については、問題ありませんでした。
# V2 と同じ使い方で問題なく動作確認できたメソッド
+ putItem
+ batchGetItem
+ query
+ updateItem
+ updateTable# 余談
性能試験や、TTL未実装の時などには、createTableやdeleteTableも実行していた時もありましたが、日常的に使う物でもなく、その時がきたら追試をします。# まとめ
DynamoDBくらい主要どころになると、しっかり下位互換もされているようです。
引き続き、小ネタシリーズとして、
AWS SSM RunCommandを利用してlambdaからEC2インスタンスを操作する
# 目標
オートスケールで動かしているEC2インスタンス全てに対してLambda関数を実行することで、SSM RunCommand経由でコマンドを実行する# ドキュメント
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html# lambda関数の作成
ランタイム: Python3.9
アーキテクチャ: x86_64# コード
“`
import boto3
def lambda_handler(event, context):
boto3.client(‘ssm’).send_command(
Targets=[{‘Key’:’tag:Name’, ‘Values’: [‘ssm-test’]}],
Parameters={
‘commands’:[
‘touch test.txt’
],
},
Documen
Stripe WebhookイベントのデータをKinesisのCosumer(Lambda)で受け取り、何らかのデータ更新をする
## はじめに
本記事では、以下の図のようにStripeのWebhookをAPI Gateway→Lambda→Kinesisという構成で、API GatewayでWebhookを受け取り、それをKinesis Data Streamに流す、というイベント駆動の処理で、Kinesisに流れたデータを受け取り、何らかのデータ更新を行うサーバレスアプリケーション、具体的にはStripeのデータを更新するConsumer(Lambda)を開発してみたいと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/5ea06a37-dc64-3948-3eeb-e989848c1e6b.png)※上記の構成のメリットとして、KinesisのConsumer(データを受け取る側)を複数配置する事ができるので、マイクロサービスが複数あればそれぞれのマイクロサービスに関連する処理を別のサーバーレスアプリケーションを開発可能である、というのがあるだろう(図中の`Lambda→RDS Pr
Lambdaのtimeoutを検知してSlackに通知する
Lambdaのtimeoutを検知してSlackに通知する。
検知Lambdaが、検知対象のLambdaCloudwatchのtimeoutをトリガーとして、SNSを配信する。
# やること概要
* SNSを作成する
* timeout_checkのLambdaを作る
* テスト用Lambdaを作る# SimpleNoticeService(SNS)
## トピックを作成
名前と表示名 `lambda_timeout_check`
`スタンダード方式` (FIFOでも変わらないと思う)## サブスクリプションの作成
プロトコル: `EMAIL`
宛先: `Slackのチャンネルのメール`サブスクリプションを作成すると初回のみ認証メールが届くので、メール内リンク `Confirm` を押す。
# テスト用Lambda
## コード
意図的にタイムアウトするよう処理を書きます。
`hoge-timeout-tester`“`python:
import json
import timedef lambda_handler(event, context):
メトリクスフィルター設定後、自動的にCloudWatchAlarmが作成されるようにしてみた
# はじめに
こんにちは、山田です。
今回はメトリクスフィルターが設定されたら、自動的にCloudWatchAlarmが作成されるようにLambda関数を作成したので記載していきます。
よろしくお願いいたします。
# 概要図
概要図は以下の通りです。
![](https://storage.googleapis.com/zenn-user-upload/51c99428a733-20221225.png)
①:メトリクスフィルターとCLoudWatchAlarmの一覧を取得する。
②:取得した結果、CloudWatchAlarmに名前がないものに関しては、アラームを作成する。
**※前提条件※
メトリクスフィルター名とCLoudWatchAlarm名は同名とします。**
# Lambda関数
作成したLambda関数は以下になります。
“`python
import json
import boto3
import timecloudwatch_client = boto3.client(‘cloudwatch’)
logs_client = boto3.client(‘l
Lambda がマウントする EFS エンドポイントの Posix ユーザの嵌り
Lambda 関数を作成して、EFS にファイルを書き込もうとしたら、エラーになってしまう。
ちなみに、読み込みは問題なくできる。
一例では、ユーザIDを、1000にしろとか、1001 にしろとかなっているが、エラーになってしまう。何が悪いのか、設定が悪いのか、と思って確認しても、特に悪いところがない。
原因は、root がオーナーのファイルシステムに書き込もうとしていたためであった。
読み込みはできるということは、AWS 特有のポリシとかではないのは明らか。
ユーザーID を 0 にしたところ、問題なく書き込みができた。
(参考)
https://aws.amazon.com/jp/premiumsupport/knowledge-center/efs-mount-with-lambda-function/
S3 イベント通知でLambdaを実行する構築ハンズオン
## はじめに
『S3にオブジェクトが作成されると、EventBridgeを利用して後続のStepFunctionsを起動して、、、』のような案件を経験して、完全に『S3からのイベント通知の際はEventBridgeだ!』という凝り固まった偏見を持っていました。
全然そんなことはなく、S3のイベント通知には`Lambda関数`,`SNSトピック`,`SQS キュー`の方法がありますので、凝り固まらないように『S3にオブジェクトが生成されるとイベント通知を行い、Lambdaが実行される』構築を行っていきます。————
## 構成図
![](https://cloud5.jp/wp-content/uploads/2022/12/スクリーンショット-2022-12-25-9.02.14-640×250.png)————
## ハンズオン
### 構築の流れ
#### 1.Lambda作成
#### 2.S3作成
#### 上記の順番で構築を行なっていきます。
最終的には、S3からのイベント通知を受けて、Lambdaのログ(CloudWatchLo
DynamoDB テーブルに保存されている項目にLambda 関数で、アクセスしたい時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/5cde6041-14ee-708d-00d9-ea2b22ea82f5.png)
___
__DynamoDB テーブルに保存されている項目にアクセスするLambda 関数を作成したい時に、使う項目を確認してみた。__
___AWSのサービスからAWSの別のサービスを利用する時にする事の基本は、
IAM ポリシーを作成し、IAM ロールにアタッチする。事だと、改めて、基本的な事を確認した。
DynamoDB テーブルへのアクセスを許可する IAM ポリシーを作成し、
このポリシーを Lambda 関数の IAM ロールにアタッチする。AWSのブログが、わかりやすかったので、ご紹介致します。
IAM ポリシーとロールを使用してアクセスを制御することで、認証情報をコードに埋め込む必要がなく、Lambda 関数がアクセスできるサービスを厳密に制御できます。このポリシーには、Lambda 関数が Amazon Clo