読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

AWS lambda をpythonコードで使ってみる〜S3からのイベント設定編

概要

残りの設定を追加し、Amazon S3 がオブジェクト作成イベントを AWS Lambda に発行し、Lambda 関数を呼び出せるようにします。

参考サイト

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example-configure-event-source.html

やってみたこと

ステップ 3: イベントソースを追加する(イベントを発行するように Amazon S3 を設定する)

  • Lambda 関数のアクセスポリシーに、この関数の呼び出しを Amazon S3 に許可するアクセス権限を追加します。
  • 通知設定をソースバケットに追加します。通知設定で、以下の項目を指定します。
    • Amazon S3 がイベントを発行するイベントタイプ。このチュートリアルでは、s3:ObjectCreated:* イベントタイプを指定し、オブジェクトが作成されたときに Amazon S3 がイベントを発行するようにします。
    • 呼び出す Lambda 関数。

ステップ 3.1: Lambda 関数のアクセス権限ポリシーにアクセス権限を追加する

そのまま引用

  • 以下の Lambda CLI add-permission コマンドを実行して、Amazon S3 サービスプリンシパル(s3.amazonaws.com)に lambda:InvokeFunction アクションを実行するためのアクセス権限を付与します。次の条件を満たす場合にのみ関数を呼び出すアクセス権限が Amazon S3 に付与されることに注意してください。
    • オブジェクト作成イベント(画像のアップとか)が、特定のバケットで検出されます。
    • バケットは、特定の AWS アカウントによって所有されます。バケット所有者がバケットを削除した場合は、他のAWS アカウントが同じ名前でバケットを作成できるため、特定の AWS アカウントのみが Lambda 関数を実行できるように設定しておく。
$ aws lambda add-permission \
--function-name CreateThumbnail \
--region us-west-2 \
--statement-id some-unique-id \
--action "lambda:InvokeFunction" \
--principal s3.amazonaws.com \
--source-arn arn:aws:s3:::sourcebucket \
--source-account bucket-owner-account-id \
--profile adminuser
* bucket-owrner-accunt-idは バケット作ったアカウントのid。12桁の数字。コンソール画面のアカウント設定とかから確認できる。
  • AWS CLI get-policy コマンドを呼び出すことで、関数のアクセスポリシーを確認します。
$ aws lambda get-policy \
--function-name function-name \
--profile adminuser

ステップ 3.2: バケットの通知を設定する

オブジェクト作成イベントを Lambda に発行するよう Amazon S3 にリクエストするため、ソースバケットで通知設定を追加します。設定で、次のように指定します。

  • 街灯のS3バケットのプロパティ画面を開く->イベントの項目を開く

  • イベントタイプ - このチュートリアルでは、ObjectCreated (All) Amazon S3 イベントタイプを選択します。

  • Lambda 関数 - これは Amazon S3 が呼び出す Lambda 関数です。

docs.aws.amazon.com

ステップ 3.3: セットアップのテスト

S3コンソールから画像をアップしてみる。。。。無事resizeにアップされているのを確認! 結構単純な機能だけど、設定に時間かかったなぁ(^ ^;)

やってみた感想

  • 初心者にはセットアップが難しい。チュートリアルみながらでもかなり時間がかかった。特にroleとかの設定が、やや煩雑に感じたなぁ。
  • 静的サイト+lambdaというのは簡単に動的サイトぽく見せられるということでありかもしれない。いわゆるこれがサーバーレスアーキテクチャーというやつなのかなぁ。
  • 逆に、動的サイトで作成しているなら、初めからlambdaありきで作成しなくてもいいかも。件数が増えて処理が重くなってくるとか、その時に、選択肢として考えるのはありなのかなぁ。
  • あと、本番のサイトを修正して、lambdaのコードの修正とかをしなければいけない場合にちょっとめんどくさそう。多分実際はlambdaのコードを修正というか、新しいlambdaを作る感じになると思うけど、どうなんだろうな。