LoginSignup
14
15

More than 5 years have passed since last update.

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

Posted at

Lambda関数の動作

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

使用する主なAWSサービス

Lambda関数、S3、EC2、SSM

作成までの手順

画像(zip)アップ先の3Sバケットを作成

  • 名前:item-images
  • リージョン:アジアパシフィック(東京)
  • その他設定:特に無し

Lambda関数 作成「AWSコンソール → lamdbda → 関数の作成 → 一から作成」

一から作成(適当なのがあれば設計図等からでもOK)

2019-01-30_16h31_22.png

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

作成したLambda関数を選択し設定をする

2019-01-30_16h44_18.png
2019-01-30_17h28_17.png

  • トリガーの追加: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));
};

テストイベントの設定

2019-01-30_17h31_58.png

  • 新しいテストイベントの作成
  • イベントテンプレート: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実行の権限が割り当てられている。

動作確認

  • AWSコンソールにて作成したLamdbda関数を開き「テスト」を実行
  • S3にzipをアップし動作検証 ※トリガーの有効化を忘れずに 2019-01-31_11h02_49.png
14
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15