AWS Lambdaを利用したS3連携ハンズオン

##　はじめに
今回はAmazon S3にオブジェクトを保存した際にAWS Lambdaが起動する仕組みを作成します。

動きとしてはS3に手動でオブジェクト（sample.jpg）を保存した際に、Lambdaが起動して”オブジェクトが保存されました”というログを表示する処理を行います。

##　構成図
![スクリーンショット 2021-11-13 8.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/e8a18378-b0af-082b-1254-293e4bc54dd8.png)

##　実装
#### 1.Lambdaを設定する
##### 1.1 AWSマネジメントコンソールからLambdaを検索する
1.検索ウィンドウよりLambdaと打ち込む
![スクリーンショット 2021-11-13 8.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/25daf44c-3932-fac8-e996-ee731df34bee.png)
2.関数の作成を押下する
![スクリーンショット 2021-11-13 8.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/70d35047-5f29-f87c-31c9-efd0e13cb969.png)


##### 1.2 Lambda関数の作成をする
1.関数を新しく作成するので『一から作成』を選択
2.関数名は今回作成する関数の名前になるので各自で命名する
3.[ランタイム](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)で関数を実行するための言語を選択する（今回はPython3.9を選択しています）
4.以降はデフォルトのまま（実行ロールについても『基本的なLambdaアクセス権限で新しいロールを作成』のままで作成する）
![スクリーンショット 2021-11-13 8.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/c01e82a1-72b0-8631-ea94-1382a6a4a02f.png)



##### 1.3 作成されたLambda関数にコードを記述する
1.作成されたLambda関数のコードソースにはステータスコード200がリターンされる仕様が記述されている

![スクリーンショット 2021-11-13 12.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/f2886886-7df0-0e01-b8dd-0d7812ae7424.png)

2.コード5行目に”オブジェクトが保存されました”を表示されるように記述する
3.__『Deploy』__を押下して反映をさせる__（押さないと反映されないので注意）__

![スクリーンショット 2021-11-13 9.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/ee70daf4-33e4-67ba-96be-810233e8469c.png)

4.反映後
![スクリーンショット 2021-11-13 10.00.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/b29c59e7-3dc3-8a90-1cc1-9c39569c37e7.png)


##### 1.4 テストでLambda関数を確認する
1.『テスト』タグを選択して画面遷移する
2.テンプレート 一般『Hello World』を選択して任意の名前を打ちこむ
3.『テスト』ボタンを押下する

![スクリーンショット 2021-11-13 10.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/a0ad94fa-14b1-73cb-3c73-df9c4e25f603.png)

4.実行結果が表示される（『ログ出力』の画面において”オブジェクトが保存されました”が表示されていることが確認できる）
![スクリーンショット 2021-11-13 10.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/27710724-9eb7-f8e7-b2f7-8d9578063ec1.png)


ここまででLambdaの設定は終了です

#### 2.S3を作成する
##### 2.1　S3でバケットを作成する
1.S3の画面に遷移する
![スクリーンショット 2021-11-13 12.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/39dae059-6ee7-0702-21d3-fafeead2a67f.png)


2.バケット名に一意の名前をつける
3.AWSリージョンはLambdaのあるリージョンと同じであるか確認をする
4.画面下の『バケットを作成』を押下する

![スクリーンショット 2021-11-13 10.14.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/64d8c6e7-63c9-ddde-bdb6-5c176851ad89.png)


5.バケットが作成されたのを確認する
![スクリーンショット 2021-11-13 10.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/cd8e0882-2a26-a5fb-7d04-3af7b83db7f7.png)


##### 2.2　バケットにLambdaと連携するように設定をする
1.作成されたバケットのプロパティを選択する
2.イベント通知の『イベント通知を作成』を押下する
![スクリーンショット 2021-11-13 10.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/b9dba12d-0b1d-2cfc-f023-214f41b6643c.png)


3.イベント通知の名前を任意でつける
※プレフィックスは接頭語・サフィックスは接尾語として、保存されるファイル名に対しての指示をすることができる

__（例）__『サフィックス』欄に『.jpg』とした場合、『〜.jpg』のみに対応したイベント通知を設定することができる

4.イベントタイプを選択する（粒度を細かくできますが、今回は『すべてのオブジェクト作成イベント』としてチェックをしています）
![スクリーンショット 2021-11-13 10.40.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/1605d965-c268-ff0c-3a4d-49ec8ea644dd.png)


5.Lambda関数の項目より__1.Lambdaを設定する__で作成した『Lambda関数名』を選択する
6.変更の保存を押下する
![スクリーンショット 2021-11-13 10.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/47915a43-b00e-e352-a050-e30fb0bfe500.png)


7.正常に作成されたことが確認することができる
![スクリーンショット 2021-11-13 10.50.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/fb77506a-28df-1258-db6a-d3a8cf6611f1.png)

ここまででS3の設定は終了です

#### 3.再度Lambdaの画面に移動して設定を確認する
##### 3.1 画面の確認を確認する
1.トリガーとして先ほど作成したS3が確認することができる
2.イベントタイプが__2.2-4.イベントタイプを選択する__で選択したタイプになっていることが確認できる
3.通知名が__2.2-3.イベント通知の名前を任意でつける__でつけた名前が表示されていることが確認できる
![スクリーンショット 2021-11-13 10.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/254d3dc4-795d-ced6-a54f-300db4dba682.png)



##### 3.2 『設定』の『アクセス権限』を確認する
1.リソースの概要からLambdaがアクセス許可をした『Amazon CloudWatch Logs』が表示されていることが確認できる
→logs:CreateLogGroup（ロググループ作成の許可）
→logs:CreateLogStream（ログストリーム作成の許可）
→logs:PutLogEvents（ログイベント更新）

![スクリーンショット 2021-11-13 11.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/76187889-133f-c82c-cc81-23472eb4e8cd.png)

2.リソースベースのポリシー
S3のバケットがLambdaを使用することが許可されていることを確認できる
![スクリーンショット 2021-11-13 11.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/a9358f25-9547-94b0-8e8f-e2fe782d553b.png)

ここまででLambdaの設定確認は終了です

#### 4.S3にオブジェクトを保存した際にLambdaが挙動するか確認する
##### 4.1 S3にオブジェクトをアップロードする
1.S3にsample.pngをアップロードします
![スクリーンショット 2021-11-13 11.46.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/d39cfeae-2357-17b0-faae-21b194c704d8.png)


2.S3にアップロードが成功する
![スクリーンショット 2021-11-13 11.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/4116cd84-217b-01c3-8e53-ad0ea64b69d6.png)

##### 4.2 CloudWatchからLambdaの挙動を確認する
1.lambdaの『モニタリング』タグから『CloudWatchのログを表示』を押下する
![スクリーンショット 2021-11-13 11.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/b274650e-d658-131e-e16e-164942174cb3.png)


2.CloudWatchのロググループ画面に遷移して、ログストリームを選択する
![スクリーンショット 2021-11-13 11.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/cd1d936f-6730-f1fa-3066-27cae73909a1.png)


3.オブジェクトがS3に保存された際に”オブジェクトが保存されました”と表示されていることを確認することができる
![スクリーンショット 2021-11-13 11.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694365/a32b162f-e4f8-39fe-2846-fd5cafabfbd0.png)


ここまでで挙動の確認は終了です

#### 最後に
来週もLambdaを利用した構築をハンズオンの学習をしていきます

#### 参照
サイト
[AWS CloudTech](https://aws-cloud-tech.com/)のLambda講座
書籍
[Amazon Web Services パターン別構築・運用ガイド 改訂第2版](https://www.amazon.co.jp/Amazon-Web-Services-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%88%A5%E6%A7%8B%E7%AF%89%E3%83%BB%E9%81%8B%E7%94%A8%E3%82%AC%E3%82%A4%E3%83%89-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-ebook/dp/B07BMQL59H)