こんにちは、SREエンジニアやってます@hayaosatoです。
以前、Amazon Rekognition(以下、rekognition)を用いたサーバレスな動画の顔分析のアプリケーションを作りました。
その時の記事はこちら
今回はそのアプリケーションのインフラをTerraformで定義することで一気にサーバレスでフルコード化されたアプリケーションにしてやろうじゃないかという試みです。
コードはこちら
アプリケーション
前回のおさらいも兼ねてさらっとどのような機能を実装するかというと、
S3にあげられた動画をrekognitionのface_detection
で解析。
その後解析終了次第その解析結果のJSONをSlackにて通知するというものです。
インフラ
ここからが本題で、サーバレスなアプリケーションをTerraformで一気に作っていきたいと思います。
システム構成は以下のようになります。
ここで、システムはrekognition以前と以降の大きく2つに分かれるのですが、rekognitionの解析を呼び出す時点でSNSなどはできている必要があるので
一気に説明してしまいます。
構成
IAM系
この構成の場合、Lambdaが実行するためのIAM、RekognitionがSNSにメッセージを発行するためのIAMが必要です。
RekognitionのためのIAMRoleもこのように作ります。
Lambda自身へのRekognitionの呼び出し等のIAMRoleもこのように作ります。
また、SNSには配信再試行ポリシー (HTTP/S)
も定義する必要があるので、このように作りました。
IAM系はポリシーチューニングがとてもつらみが深いので管理するかどうかは別ですが、できることなら管理したいなぁと思いつつ、、、(察し)
Lambda関数
Lambda自身にもいくつか付随するリソースを作る必要があり、CloudWatch Log Groupもこのように作ります。
Lambdaの場合はarchiveプロバイダのarchive_file
を利用することでソースコードをzipに固めてそのままアップロードすることができます。
これをすることによって、Terraformにソースコードの更新を組み込むことでterraform apply
で再作成なしにソースコードの更新をすることができます。
Lambda関数についてはこのように作成しており、get_face_detectionもほぼ同様に作成できます。
トリガ系
今回Lambda関数のトリガとなるリソースはS3とSNSです。
S3はこのように、SNSのトピックはこのようにそれぞれ作ります。
しかし、それぞれリソースを作成するだけではLambda関数は起動してくれず、Lambda側のトリガ設定(aws_lambda_permission
)が必要になります。
S3のトリガはこのように、SNSのトリガはこのように作成します。
SNSとLambdaとの連携系の記事は以前にこちらにも書いているので、是非ご覧いただけると。
## 結果
以上でできました。
解析開始
解析完了
その後JSONファイルがSlackにアップロードされました。
最後に
今回はAWSのサービスを利用してサーバレスなアーキテクチャを構築しつつ、Terraformでインフラのコード化も行いました。
サーバレスは楽ですし、コード管理されていて変更が確認しやすいしいいですよね〜