【AWS】S3のPUTイベントをトリガーにLambda(Node.js 14.x)を起動する

## きっかけ
案件でS3ファイルのPUTをトリガーにLambdaを動かして、PUTされたファイルを加工するような処理が必要なため、仕組みの具体的な設定内容の確認をしたかったため。

## やりたいこと概要
![S3_copied.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/af12e225-7fa9-4e37-d54f-64a2678b3fc4.png)

## 前提
- AWS: 社用アカウント利用

## 構築Step
1. S3バケット作成
1. Lambdaの構築、ソース修正
1. Lambdaに紐づくIAMロール修正
1. Originバケット PUTトリガー設定
1. 動作確認

### 1. S3バケット作成
- デフォルト設定のまま、Origin、Copiedバケットを作成
![screencapture-s3-console-aws-amazon-s3-bucket-create-2021-07-31-00_17_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/78c43946-e721-77a1-5897-17354538b970.png)
![screencapture-s3-console-aws-amazon-s3-bucket-create-2021-07-31-00_28_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/e7977119-e58f-424d-7a5b-b297be03d6f6.png)

### 2. Lambdaの構築、ソース修正
- デフォルト設定(ランタイム:Node.js 14.x)でLambdaを構築
![screencapture-ap-northeast-1-console-aws-amazon-lambda-home-2021-07-31-00_33_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/3e43cca3-a08b-cd85-0dbf-8a613cac0fc2.png)

Lambdaのソースコードを以下の内容に修正、デプロイを実施

```javascript:index.js
'use strict';

const aws = require('aws-sdk');
const s3 = new aws.S3();

exports.handler = async (event) => {
    //S3から送られたトリガー内容を確認
    console.log(event);

    const bucket = event['Records'][0]['s3']['bucket']['name'];
    const key = event['Records'][0]['s3']['object']['key'];
    console.log(bucket);
    console.log(key);
    
    //S3.copyObjectを実施(params内Bucket,CopySource, Keyは必須) 
    const params = {
        Bucket: "copied-bucket-210731/210731", 
        CopySource: bucket+'/'+key, 
        Key: key
    };
	const result = await s3.copyObject(params).promise();
    
    console.log(result)
};
```

### 3. Lambdaに紐づくIAMロール修正
- Lambdaに紐づいているLambda実行ロールにAmazonS3FullAccessをアタッチ
(ベストプラクティスでは最小権限原則ですが今回は割愛)
![screencapture-console-aws-amazon-iam-home-2021-07-31-01_10_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/a0615d2c-46a4-7874-9881-2de815d33596.png)

### 4. Originバケット PUTトリガー設定
- S3のOriginバケットでプロパティ>イベント通知からイベント通知を作成
![スクリーンショット 2021-07-31 004222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/68855c68-fb55-de35-710c-9fb48f58e467.png)

- 任意のイベント名を設定、イベントタイプを"PUT"に設定、送信先を今回作成したLambda関数を指定してトリガーを設定
![screencapture-s3-console-aws-amazon-s3-bucket-origin-bucket-210731-property-notification-create-2021-07-31-00_43_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/ddb0d40f-074d-df87-10cf-daacf4f29ff3.png)

### 5. 動作確認
- OriginバケットにAWS CLIでファイルをアップロードする
- AWS CloudShellを起動、適当なテキストファイルを作成、CLIコマンドによりS3のOriginバケットへファイルをアップロードする
![スクリーンショット 2021-07-31 015328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/0fc26dc0-1061-6ad1-20fc-5736872ec2a1.png)

- Originバケットにファイルがアップロードされていることの確認
![スクリーンショット 2021-07-31 015346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/95003e19-90f3-8f0b-37ba-6aa1042a206b.png)

- Copiedバケットにファイルがコピーされていることの確認
![スクリーンショット 2021-07-31 015412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/1797df41-57b5-d81a-e82f-8683b65c04e7.png)

- Lambdaの実行ログの確認
![スクリーンショット 2021-07-31 015515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/ec307f03-082d-d9da-3fe7-ddff2b0980af.png)


## 参考サイト

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/NotificationHowTo.html

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property