AWS LambdaでS3からEC2へファイルコピー

## Lambda関数の動作
S3の特定バケットへ画像のzipがアップされたら、それを自動で各サーバーにコピー＆解凍する

## 使用する主なAWSサービス
Lambda関数、S3、EC2、SSM

## 作成までの手順

### 画像(zip)アップ先の3Sバケットを作成
- 名前：item-images
- リージョン：アジアパシフィック(東京)
- その他設定：特に無し

### Lambda関数 作成「AWSコンソール → lamdbda → 関数の作成 → 一から作成」
#### 一から作成（適当なのがあれば設計図等からでもOK）
![2019-01-30_16h31_22.png](https://qiita-image-store.s3.amazonaws.com/0/262751/c57e8958-c9b8-3022-cacf-aaf71a8505f5.png)

- 名前：ItemImgSync
- ランタイム：Node.js 8.10　※他にも C#,Go,Java,Python,Ruby などがあります
- ロール：１つ以上のテンプレートから新しいロールを作成
- ロール名：ItemImgSyncRole
- ポリシーテンプレート：特に無し（後でSSMの権限などを紐づけるのでここでは特に何もしません）

#### 作成したLambda関数を選択し設定をする
![2019-01-30_16h44_18.png](https://qiita-image-store.s3.amazonaws.com/0/262751/5ab7e5dd-19a3-bd8e-adf5-b70525b3a2d3.png)
![2019-01-30_17h28_17.png](https://qiita-image-store.s3.amazonaws.com/0/262751/6103fe9c-e409-a1b4-965e-2a4a978482a9.png)

- トリガーの追加：S3を選択
- バケット：画像アップ用に作成したバケットを選択
- イベントタイプ: PUT ※画像アップロード時に実行
- プレフィックス：item_img
- サフィックス：.zip
- トリガーの有効化は後からでOK

#### 関数作成
- 用意されている「index.js」を編集

```javascript:index.js
// Require
const aws = require('aws-sdk');
// aws service instance
const ssm = new aws.SSM({apiVersion: '2014-11-06'});

exports.handler = async (event, context) => {
  // run commands        
  const bucket = 'item-images';
  const key = 'item_img.zip';
  const itemImgDir = '/var/www/html/app/public/images/item/';  //copy directry (ec2)
  const commands = [
    'aws s3 sync s3://'+bucket+' '+itemImgDir, //sync s3 → ec2
    'unzip -u '+itemImgDir+key +' -d '+itemImgDir, //unzip
    'rm '+itemImgDir+key,   //remove zip
  ];
  const params = {
    DocumentName: 'AWS-RunShellScript', //必須
    InstanceIds: ['i-aaaaaaaaaaaaaaaaa', 'i-bbbbbbbbbbbbbbbbb', 'i-ccccccccccccccccc'], //対象インスタンスidを指定
    Parameters: {
      commands: commands,
      executionTimeout: ['300']
    },
    TimeoutSeconds: 600 //この時間に達してもコマンドがまだ実行を開始していない場合は、実行されません。
  };
  return await ssm.sendCommand(params).promise().catch(e => console.error(e));
};
```
#### テストイベントの設定
![2019-01-30_17h31_58.png](https://qiita-image-store.s3.amazonaws.com/0/262751/2d5cd6de-8a07-740f-6834-53b1b3c23b00.png)

- 新しいテストイベントの作成
- イベントテンプレート：Amazone S3 Put
- イベント名：S3Put

### ファイルコピー先EC2の設定
#### 対象EC2インスタンスに必要ソフトのインストールと設定
- [AWS CLI インストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)

```
yum install awscli
awscli --version
```

- 設定 [aws configure コマンドを実行しawscliの設定を行う](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html)

```
aws configure
AWS Access Key ID [None]: IAM ユーザーのAccess Key
AWS Secret Access Key [None]: IAM ユーザーのSecret Access Key
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

- [SSMのインストールと設定](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html)

```
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
sudo systemctl status amazon-ssm-agent
```

### IAMロールの作成
#### EC2にアタッチ(関連付け)するIAMロールを作成
  - ロール名：ec2-role
  - アタッチロール
    - AmazonEC2RoleforSSM（EC2からSystemsManagerAPI(SSM)を利用する為必要）

#### Lambda関数の実行ロールに必要なロールをアタッチ
  - ロール名：ItemImgSyncRole（Lambda関数作成時に作ったロール）
  - アタッチロール
    - AmazonSSMFullAccess（SSM(AWS Systems Manager：AWS リソースを設定および管理できる機能)の機能を使用したい場合に使用。ssmでもコマンド実行でインスタンスの起動,停止など可能。今回はデータのコピー,解凍などに使用）
    - AWSLambdaVPCAccessExecutionRole（VPC内のリソースにアクセスする Lambda関数を作成する場合に必要。EC2がVPC内にある為必要）
    - AWSLambdaBasicExecutionRole-92530034-eea5-4cd4-941e-a9937122235b（Lamdba関数作成の際に自動で作られるロール）

#### IAMロールのアタッチ
- 作成したロール(ec2-role)を対象のEC2インスタンスにアタッチする。AWSコンソール → EC2 → インスタンス → 上部 アクションボタン → インスタンス設定 → IAM ロールの割り当て/置換
- インスタンスを再起動 ※IAMロールにアタッチしても直には反映されない為。Apache(httpd)などを自動起動設定してない場合は起動を忘れない
- コマンド実行の確認：AWSコンソール → EC2 → (Systems Manager Services)コマンドの実行 → コマンドを実行 → Linux対象コマンドドキュメント選択 → インスタンスの選択 で対象のインスタンスが表示されればSSM実行の権限が割り当てられている。

## 動作確認
- AWSコンソールにて作成したLamdbda関数を開き「テスト」を実行
- S3にzipをアップし動作検証 ※トリガーの有効化を忘れずに
![2019-01-31_11h02_49.png](https://qiita-image-store.s3.amazonaws.com/0/262751/37dfaf15-84b8-593b-1691-02ca220159d2.png)