EC2のRun CommandをAWS CLIで実行する

2016.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

実行中のEC2にSSH接続することなくコマンドを実行する「Run Command」という機能があります。今回はAWS CLIからこの機能を実行してみました。基本的にはチュートリアルに沿って行えば出来るのですが、いくつか(私の不注意により)引っ掛かったポイントがあったので、その辺りについても書いてみたいと思います。

インスタンスの用意、IAMロール権限設定

Run Commandを実行するEC2には、適切なIAMロールの設定とSSM Agentをインストールしておく必要があります。詳細な手順はチュートリアルを参考にして欲しいのですが、大まかな作業順序は以下となります。

  1. マネージドコンソールよりEC2インスタンスを作成する。
  2. インスタンス作成時にIAMロールを作成する。このIAMロールは「AWS サービスロール」として「Amazon EC2 Role for Simple Systems Manager」を選択する。
  3. 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
  4. (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 エージェントのインストール