参考
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を作成
- awsマネジメントコンソールでIAMへ進む
- ナビゲーションでロールへ進む
- ロールの作成へ進む
- 一般的なユースケースでEC2を選択
- EC2がフォーカスされた状態で
次のステップ:アクセス
権限へ進む -
AmazonSSMManagedInstanceCore
のチェックボックスを選択 -
次のステップ:タグ
へ - タグは必要に応じて
-
次のステップ:確認
に進む - ロール名:
ec2_command_lambda_ssm
既存のEC2にロールを割り当てる
- サービスでec2を選択
- インスタンス一覧を表示
- 対象のインスタンスのチェックボックスを選択
- アクション->セキュリティ->IAMロールを変更
コンソールでssm sendCommand
できるか試してみる
下記で試す
AWS CLI を使って AWS Systems Manager Run Command を実行する
lambdaのためのiam roleを作成
- awsマネジメントコンソールでIAMへ進む
- ナビゲーションでロールへ進む
- ロールの作成へ進む
- 一般的なユースケースでlambdaを選択
- lambdaがフォーカスされた状態で
次のステップ:アクセス
権限へ進む -
AmazonEC2ReadOnlyAccess
とAmazonSSMFullAccess
をアタッチする
既存のlambda functionにロールをわりあてる
- 設定->実行ロールを確認
- 対象のロールを割り当てる
テストする
次のサンプルコード を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");
}
};