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