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 にある。

その他の構成は「S3+CloudFrontをTerraformで設定してCircleCIで更新する」を踏襲している。

Terraformをapplyすると以下ができる。

S3 bucket

S3 bucket

Lambda function

Lambda function

SQS queue

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