Lambda関数の動作
S3の特定バケットへ画像のzipがアップされたら、それを自動で各サーバーにコピー&解凍する
使用する主なAWSサービス
Lambda関数、S3、EC2、SSM
作成までの手順
画像(zip)アップ先の3Sバケットを作成
- 名前:item-images
- リージョン:アジアパシフィック(東京)
- その他設定:特に無し
Lambda関数 作成「AWSコンソール → lamdbda → 関数の作成 → 一から作成」
一から作成(適当なのがあれば設計図等からでもOK)
- 名前:ItemImgSync
- ランタイム:Node.js 8.10 ※他にも C#,Go,Java,Python,Ruby などがあります
- ロール:1つ以上のテンプレートから新しいロールを作成
- ロール名:ItemImgSyncRole
- ポリシーテンプレート:特に無し(後でSSMの権限などを紐づけるのでここでは特に何もしません)
作成したLambda関数を選択し設定をする
- トリガーの追加:S3を選択
- バケット:画像アップ用に作成したバケットを選択
- イベントタイプ: PUT ※画像アップロード時に実行
- プレフィックス:item_img
- サフィックス:.zip
- トリガーの有効化は後からでOK
関数作成
- 用意されている「index.js」を編集
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));
};
テストイベントの設定
- 新しいテストイベントの作成
- イベントテンプレート:Amazone S3 Put
- イベント名:S3Put
ファイルコピー先EC2の設定
対象EC2インスタンスに必要ソフトのインストールと設定
yum install awscli
awscli --version
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
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実行の権限が割り当てられている。