AWS SSM で、EC2に任意のコマンドを実行する

ssm は、ssh で接続することなく、 必要な role があれば、特定の EC2 上へコマンドを送ることが出来ます。
Amazon Linux に対しても、実行できます。

EC2の自動セットアップを行いながらも、ssh キーの登録をしたくないようなときに役立ちます。

実行するリモートサーバー側に ssm-agent をインストールする。

cd /tmp
curl https://amazon-ssm-ap-northeast-1.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
yum install -y amazon-ssm-agent.rpm

実行するリモートサーバー側に role を設定する。

AmazonEC2RoleForSSM

コマンドを送る元に、role を設定する。

AmazonSSMFullAccess

実行方法

こんな感じ

def command(instance, commands):
  ssm = boto3.client('ssm')
  r = ssm.send_command(
    InstanceIds = [instance.instance_id],
    DocumentName = "AWS-RunShellScript",
    Parameters = {
      "commands": commands
    }
  )
  command_id = r['Command']['CommandId']

  while True:
    time.sleep(0.2)
    res = ssm.list_command_invocations(CommandId=command_id)

    invocations = res['CommandInvocations']
    if len(invocations) <= 0: continue

    status = invocations[0]['Status']
    if status == 'Success': return True
    if status == 'Failed': return False