S3 + Lambda + SQSでファイル処理する仕組みをTerraformで構築する
画像や音声を S3 にアップロードすると Lambda でいい感じに前処理をして SQS に通知くれるような仕組みを想定して作ってみる。
名前は仮に「media-processor」とした。
(が、今回はファイル名やファイルタイプを SQS に送るダミー機能まで)
Terraform を使ってできるだけ手オペなしでやってみた。
構成
構成図描くとこんな感じ。
図は https://www.draw.io/ で描いた。

ソースコードは https://github.com/mazgi/mazgi-sandbox-aws.provisioning/tree/v20180417.0 にある。
- terraform.tf
- 今回使用する AWS アカウント全体の tf ファイル
- Terraform の設定くらいしかしていない
- media-processor.tf
- 今回メインの tf ファイル
- S3, Lambda, SQS および必要な IAM Role 等を作成する
- media-processor-lambda-preprocess-function/media-processor-lambda-preprocess-function.py
- Lambda の中身
- AWS のサンプルをちょっといじっただけ
- ファイル名長すぎた
その他の構成は「S3+CloudFront を Terraform で設定して CircleCI で更新する」を踏襲している。
Terraform を apply すると以下ができる。
S3 bucket Lambda function SQS queue
動作
メディアファイルを用意する。

S3 bucket にアップロードする。

Lambda function が動く。

SQS queue に通知される。

無事思った通りの動作になった。
なお S3 バケットにアップロードした JPEG 画像はこれ。優しい。
「ぱくたそ」からお借りした。

ポイント
S3 bucket
S3 bucket に aws_lambda_permission
で Lambda 実行を許可する必要がある。
https://github.com/mazgi/mazgi-sandbox-aws.provisioning/blob/v20180417.0/media-processor.tf#L10-L16
その上で aws_s3_bucket_notification
を設定してオブジェクト作成時に通知が飛ぶようにしている。
https://github.com/mazgi/mazgi-sandbox-aws.provisioning/blob/v20180417.0/media-processor.tf#L18-L28
Lambda function
Lambda function のソースコードを zip で git 管理したくなかったので archive_file
で apply 時に zip を作るようにしている。
https://github.com/mazgi/mazgi-sandbox-aws.provisioning/blob/v20180417.0/media-processor.tf#L33-L37
zip ファイルを参照しているのはこちら
https://github.com/mazgi/mazgi-sandbox-aws.provisioning/blob/v20180417.0/media-processor.tf#L40-L41
SQS queue の URL は環境変数として export している。
https://github.com/mazgi/mazgi-sandbox-aws.provisioning/blob/v20180417.0/media-processor.tf#L49

function 内では普通に os.environ['SQS_URL']
のように参照できる。
https://github.com/mazgi/mazgi-sandbox-aws.provisioning/blob/v20180417.0/media-processor-lambda-preprocess-function/media-processor-lambda-preprocess-function.py#L25