の使用)をご確認ください。 b. CodeUri:Lambdaのコードが展開されているデプロイされたディレクトリのルートです。 c. Handler:Lambda関数のパスです。フォルダ名(複数あってもOK).関数名でセットされます。 d. Events:Lambda関数を実行するイベントソースです。サンプルでは Apiがセットされ、API Gatewayとの 統合が指定されています。 2. 32〜44行目:CloudFormationスタックのアウトプットです。 43
b. S3 Pre-signed URLを介してアップロード 3. リストアップAPI a. アップロードしたファイルのメタデータ一覧を取得 4. 画像更新用API a. APIからダウンロード用の S3 Pre-signed URLとメタデータを取得 b. S3 Pre-signed URLを介してダウンロード 5. ダウンロード用APIは割愛(自由課題) a. 他のAPIで実施する技術要素の中で対応可能なため 65
SNSトピックに通知を行う c. DataTable i. リソースタイプ:AWS::Serverless::SimpleTable(SAMリソースでのDynamoDBテーブル) ii. キー項目:名前=>id、型=>string d. PutEventTopic i. リソースタイプ:AWS::SNS::Topic ii. その他設定:特になし e. PutEventPolicy i. リソースタイプ:AWS::SNS::TopicPolicy ii. 対象トピック:PutEventTopic iii. ポリシー設定:S3からPutEventTopicへのPublishを許可する 70
スタック内でのリソースの参照の仕方 a. !Ref関数 3. Makefileの役割 a. ハンズオン1で見てきたように、デプロイまでには SAM -> CloudFormationのパッケージングからデプロイ の流れが必要 b. 毎回手順を繰り返すのは面倒なので、デプロイ手順を Makefileのタスクで実施する 72
) ii. metadata_creator.py(メタデータを作成するビジネスロジック ) iii. logger/get_logger.pyとlogger/json_formatter.py(ログ出力のためのユーティリティ ) c. API連携のリソースを作る i. リソースタイプ:AWS::Serverless::Api(SAMでのAPI Gatewayリソースタイプ) ii. ステージ名:パラメータの StageNameを指定 iii. CORS設定:全メソッド(GET/PUT/POST/DELETE/OPTIONS)に以下のヘッダーを許可 1. 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' 74
Lambda関数作成 a. ハンドラーとコアロジックの分離 (ベストプラクティス) b. boto3を使ったAWSリソースのアクセス i. Lambdaの実行環境にインストール済み ii. DynamoDBとS3へのアクセス c. API GatewayのLambdaプロキシ統合でのInput/Outputの取り扱い d. Lambda関数リソースの作成 3. ロググループについての補足 a. CloudFormationで明示的に作成しなくても良い b. CloudWatch LogsのFilter機能などを使ってエラー通知も可能 i. この場合、事前にLogGroupを作成しておく必要がある 77
loggerはコピーする iii. src/PutS3EventFunctionをカレントディレクトリにして pip install pillowを実施 iv. index.py(Lambdaからコールされるハンドラ ) v. image_analyzer.py(画像からサイズ/横幅/縦幅を取得してDynamoDBのメタデータを更新する ) b. S3PutEventの設定 i. DataBucketのプロパティに以下を追加 1. NotificationConfiguration:通知設定 a. TopicConfigurations:SNSトピックへの通知 i. Event(S3の対象イベント):s3:ObjectCreated:* ii. Topic(イベント通知先のトピック ):!Ref PutEventTopic 79
iii. Handler(Lambdaがコールするファイルとメソッド名 ):index.handler iv. MemorySize(Lambda関数に割り当てるメモリサイズ ):1024 v. Timeout(Lambda関数のタイムアウト):300 vi. Policies(Lambda関数が必要とするリソースへのアクセスポリシー ): 1. arn:aws:iam::aws:policy/AmazonS3FullAccess 2. arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess vii. Events(Lambda関数のイベントソース ):PutTopic 1. リソースタイプ:SNS 2. Topic(対象トピック):!Ref PutEventTopic viii. 注意事項:画像を扱うためにメモリサイズとタイムアウト値を調整 80
Layerを使うケースもあり c. 今回のチュートリアルでは、デプロイする LambdaのディレクトリにPipenvを置いて依存関係をもち、 Makefile内でrequirements.txtを生成、デプロイパッケージとしてデプロイしている 2. Lambda関数におけるAPI Gateway以外のイベントソース a. S3の通知イベント設定 b. SNS Topicの使い方 83
--stack-name lambda-tutorial-sample-appを実行する b. ハンズオン1で作成したデプロイ用の S3バケットを削除する 3. ハンズオン2で作成したAPIの利用に伴うS3バケットをクリアする a. pycon-serverless-tutorialをカレントディレクトリにする b. STACK_NAME=PyconServerlessTutorial python make_bucket_empty.pyを実行 4. ハンズオン2で作成したスタック、リソースを削除する a. aws cloudformation delete-stack --stack-name PyconServerlessTutorialを実行 b. ハンズオン2で作成したデプロイ用の S3バケットを削除する 5. Cloud9の環境を消す a. 環境を選択してメニューから Delete b. ダイアログにDeleteと入力してDeleteボタンクリック 94