AWS Lambdaを使ってみる① | のび太とジャイアンのあの関係？

はじめてAWS Lambdaを使ってみたので、備忘録もかねて遊んだ内容をここに記します。

AWS Lambdaを使って、あるS3バケットにデータをアップロードすると別のS３バケットにそれをコピーして保存するということを実現したいと思います（バックアップもどきみたいな）

そこで今回はのび太とジャイアンと名付けられた２つのS3バケットを用意して、のび太バケットにデータをアップロードすると、ジャイアンバケットに同じものが保存されるということをやります。

つまり、「オマエノモノハオレノモノ」ということです。

奪っているわけではないので、言わば、まさに、その中で、健全だということを申し上げたいと思っている次第であります。

※Lambdaの実行環境はをNode.js 12.xを使います

## のび太バケットとジャイアンバケットをつくる
S3バケットをつくります
Bucket nameを入れてcreateするだけでOKです（それ以外なにも設定しなくてOK）
![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/d7fbd087-d4cc-2a68-8d69-61a7f042f123.png)



## IAM でロールをつくる
LambdaをつくるにはそのLambda関数にロールを与えなければいけないからです。

Services > IAM > Roles > Create roleをclick
1). Lambdaを選択してNext: Permision
2). 今回はお勉強のためにポリシーを自分で書いてみたいと思うので、Create policyをclick(別タブでポリシーを作る用の画面が開きます)
3). JSONタブを押して以下を直書きしてReview Policy

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "のび太バケットのARN/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "ジャイアンバケットのARN/*"
            ]
        }
    ]
```
4). 名前をつけてCreate policy (OmaeNoMonoHaOreNoMonoという名前にしてみました)
5). ロールの設定画面に戻り、Filter Policyを選択してCustomer managedにチェックをいれると、↑でつくったOmaeNoMonoHaOreNoMonoポリシーが見つかります
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/9deea856-e4fd-612d-6f08-5fb15f650943.png)

6). OmaeNoMonoHaOreNoMonoポリシーにチェックしたらNext: Tags
7). なにも書かないでOK、Next: Review
8). Role nameを決めてCreate role(whats_yours_is_mineと名付けてみました)

- Rolesの一覧に追加されていることを確認します
![３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/8b3a845c-a041-9fcc-36c6-5cfc8b23b51e.png)

- whats_yours_is_mineロールの中身をみてみると、OmaeNoMonoHaOreNoMonoポリシーが適用されていることがわかります
![7aae9826-4b9c-4181-9472-785b824a4370-1920x475r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/c5f24619-5382-f67f-bce8-a98b4999e936.png)

## いざ、Lambda
Services > Lambda > Create functionをclick

1). lambdaGianismという名前にして以下の設定で作成
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/e90d774b-17c2-5bff-9bcc-6ce022145077.png)


2). のび太バケットにデータがアップロードされたらこのLambda関数が発動されるようにトリガーを設定します。Add trggerを押して以下の設定にしてAdd
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/c0cddc54-2fd3-bbcd-1bab-22dc12e8f527.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/cb043022-5014-5091-59c4-96cee7f8da4a.png)

3). index.jsにコードを書いてく
参考: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/cdba5483-0ad2-fc62-b8c9-8f77d190b2b0.png)

```js
const AWS = require("aws-sdk");
const s3 = new AWS.S3();

exports.handler = (event) => {
    const sourceBucket = "nobi-nobita";
    const destinationBucket = "goda-takeshi-aka-gian";
    const objectKey = event.Records[0].s3.object.key;
    const copySource = encodeURI(sourceBucket + "/" + objectKey);
    const copyParams = { Bucket: destinationBucket, CopySource: copySource, Key: objectKey };
    s3.copyObject(copyParams, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            console.log('オマエノモノハ');
        }
    });
};

```

## のび太バケットになんかアップロードしてみる
![2020-05-30-231558.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/0ba8897b-7cec-a7b7-d2d6-6a7b7272e8d1.gif)


参考:
https://www.youtube.com/watch?v=97q30JjEq9Y
これを元に作りました。
ちなみに動画通りだと実現できないです。