LoginSignup
2
1

More than 1 year has passed since last update.

LambdaからEC2に対してAWS Run Command を実行する手順

Last updated at Posted at 2021-05-18

参考

How to execute command remotely on EC2 via Lambda function using SSM
コマンドのステータスについて

次の順番で進める

  • ec2のためのiam roleを作成
  • 既存のEC2にロールを割り当てる
  • コンソールでssm sendCommandできるか試してみる
  • lambdaのためのiam roleを作成
  • 既存のlambda functionにロールをわりあてる
  • テストする

ec2のためのiam roleを作成

  1. awsマネジメントコンソールでIAMへ進む
  2. ナビゲーションでロールへ進む
  3. ロールの作成へ進む
  4. 一般的なユースケースでEC2を選択
  5. EC2がフォーカスされた状態で次のステップ:アクセス権限へ進む
  6. AmazonSSMManagedInstanceCoreのチェックボックスを選択
  7. 次のステップ:タグ
  8. タグは必要に応じて
  9. 次のステップ:確認に進む
  10. ロール名:ec2_command_lambda_ssm

既存のEC2にロールを割り当てる

  1. サービスでec2を選択
  2. インスタンス一覧を表示
  3. 対象のインスタンスのチェックボックスを選択
  4. アクション->セキュリティ->IAMロールを変更

コンソールでssm sendCommandできるか試してみる

下記で試す
AWS CLI を使って AWS Systems Manager Run Command を実行する

lambdaのためのiam roleを作成

  1. awsマネジメントコンソールでIAMへ進む
  2. ナビゲーションでロールへ進む
  3. ロールの作成へ進む
  4. 一般的なユースケースでlambdaを選択
  5. lambdaがフォーカスされた状態で次のステップ:アクセス権限へ進む
  6. AmazonEC2ReadOnlyAccessAmazonSSMFullAccessをアタッチする

既存のlambda functionにロールをわりあてる

  1. 設定->実行ロールを確認
  2. 対象のロールを割り当てる

テストする

次のサンプルコード をlambdaで実行
サンプルコードはserverless frameworkを使う

'use strict';

const AWS = require('aws-sdk')
const ssm = new (require('aws-sdk/clients/ssm'))();
const REMOTE_WORKING_DIR = '/home/ec2-user'


module.exports.company_save = async event => {

  try {
    // 実行したいコマンド
    let command = 'sh test.sh'
    let params = {
      DocumentName: 'AWS-RunShellScript',
      InstanceIds: ['i-*************'],
      Parameters: {
        commands: [command, "echo hoge > /home/ec2-user/sample.txt"], // 配列で指定するので複数実行も出来る
        workingDirectory: [REMOTE_WORKING_DIR] // どの階層で実行するかを指定
      },
      // SSMの実行結果をCloudWatchにロギング
      CloudWatchOutputConfig: {
        CloudWatchLogGroupName: 'SSMLogs',
        CloudWatchOutputEnabled: true
      },
      // タイムアウト設定
      TimeoutSeconds: 3600 // 1 hour
    }

    const debug = (key, object) => { console.log(`DEBUG: ${key}\n`, JSON.stringify(object)); }
    const sendCommandResult = await ssm.sendCommand(params).promise();
    debug("sendCommandResult", sendCommandResult);    

  } catch(e){
    console.log("-----error");
  }

};
2
1
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
2
1