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 バケットにアップロードした 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