LoginSignup
7
1

More than 3 years have passed since last update.

Terraformでサーバレス顔認識を構築する(Amazon Rekognition)

Last updated at Posted at 2019-12-15

こんにちは、SREエンジニアやってます@hayaosatoです。
以前、Amazon Rekognition(以下、rekognition)を用いたサーバレスな動画の顔分析のアプリケーションを作りました。
その時の記事はこちら
今回はそのアプリケーションのインフラをTerraformで定義することで一気にサーバレスでフルコード化されたアプリケーションにしてやろうじゃないかという試みです。
コードはこちら

アプリケーション

前回のおさらいも兼ねてさらっとどのような機能を実装するかというと、
S3にあげられた動画をrekognitionのface_detectionで解析。
その後解析終了次第その解析結果のJSONをSlackにて通知するというものです。

インフラ

ここからが本題で、サーバレスなアプリケーションをTerraformで一気に作っていきたいと思います。
システム構成は以下のようになります。
顔面みっけ君システム.jpg
ここで、システムは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との連携系の記事は以前にこちらにも書いているので、是非ご覧いただけると。

 結果

以上でできました。
解析開始
スクリーンショット 2019-12-07 23.44.01.png
解析完了
スクリーンショット 2019-12-07 23.44.11.png
その後JSONファイルがSlackにアップロードされました。

最後に

今回はAWSのサービスを利用してサーバレスなアーキテクチャを構築しつつ、Terraformでインフラのコード化も行いました。
サーバレスは楽ですし、コード管理されていて変更が確認しやすいしいいですよね〜

参考

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1