この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
実行中のEC2にSSH接続することなくコマンドを実行する「Run Command」という機能があります。今回はAWS CLIからこの機能を実行してみました。基本的にはチュートリアルに沿って行えば出来るのですが、いくつか(私の不注意により)引っ掛かったポイントがあったので、その辺りについても書いてみたいと思います。
インスタンスの用意、IAMロール権限設定
Run Commandを実行するEC2には、適切なIAMロールの設定とSSM Agentをインストールしておく必要があります。詳細な手順はチュートリアルを参考にして欲しいのですが、大まかな作業順序は以下となります。
- マネージドコンソールよりEC2インスタンスを作成する。
- インスタンス作成時にIAMロールを作成する。このIAMロールは「AWS サービスロール」として「Amazon EC2 Role for Simple Systems Manager」を選択する。
- SSHでEC2にログインしてSSM Agentのインストールを行う。インストーラを以下のcurlコマンドで取得するが、この時に「region」をEC2のリージョンに置き換える事を忘れないようにする。
curl https://amazon-ssm-region.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o /tmp/ssm/amazon-ssm-agent.rpm
- (Amazon Linuxの場合)以下のコマンドでSSM Agentが実行されているかを確認する。
sudo status amazon-ssm-agent
コマンドの送信
ローカルPCのAWS CLIからEC2にコマンドを送信します。コマンドの送信と実行結果の取得は、それぞれ別のコマンドとなります。
コマンド送信
lsコマンドをEC2に送信します。「instance-ids」にインスタンスID、「commands」に実行するコマンド(今回はlsコマンド)を渡します。
$ aws ssm send-command \
--document-name "AWS-RunShellScript" \
--comment "listing services" \
--instance-ids "インスタンスID" \
--parameters commands="ls /tmp/ssm" \
--region ap-northeast-1 \
--output text
COMMAND コマンドID listing services 0 AWS-RunShellScript 0 1480830851.24 50
480827251.24 Pending Pending 1
INSTANCEIDS インスタンスID
NOTIFICATIONCONFIG
COMMANDS ls /tmp/ssm
実行結果として「COMMAND」の横にコマンドIDが出力されます。このコマンドIDを使い実行結果を取得します。
実行結果の取得
コマンドIDを指定して実行結果を取得します。
$ aws ssm list-command-invocations --command-id "コマンドID" --details
{
"CommandInvocations": [
{
"Comment": "listing services",
"Status": "Success",
"CommandPlugins": [
{
"Status": "Success",
"ResponseStartDateTime": 1480827252.008,
"StandardErrorUrl": "",
"OutputS3BucketName": "",
"OutputS3Region": "ap-northeast-1",
"OutputS3KeyPrefix": "",
"ResponseCode": 0,
"Output": "amazon-ssm-agent.rpm\n",
"ResponseFinishDateTime": 1480827252.004,
"StatusDetails": "Success",
"StandardOutputUrl": "",
"Name": "aws:runShellScript"
}
],
"ServiceRole": "",
"InstanceId": "i-0fabd3523734c5776",
"DocumentName": "AWS-RunShellScript",
"NotificationConfig": {
"NotificationArn": "",
"NotificationEvents": [],
"NotificationType": ""
},
"StatusDetails": "Success",
"StandardOutputUrl": "",
"StandardErrorUrl": "",
"InstanceName": "",
"CommandId": "コマンドID",
"RequestedDateTime": 1480827251.343
}
]
}
JSON形式のコマンド実行結果に、lsコマンドの実行結果として「Output」欄に 「amazon-ssm-agent.rpm\n"」が出力されています。
まとめ
AWS CLIからEC2にコマンドを送信して実行することができました。複数のEC2への定型作業などで使うことができるかも知れません。
参考サイト
Tutorial: Remotely Manage Your Amazon EC2 Instances
Configuring Access to Systems Manager
SSM エージェントのインストール