EC2のRun CommandをAWS CLIで実行する
はじめに
実行中の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 エージェントのインストール