AWS - 将EC2与SSM关联以启用ssm.client.send_command

时间:2018-01-15 01:47:54

标签: python amazon-ec2 cloud boto3 aws-ssm

我想在新推出的实例上通过boto3运行一系列bash命令。

从某些研究来看,似乎需要将这个新实例与SSM相关联。

下面是否有明显的错误或错过的步骤?还有更好的方法来实现既定目标吗?

第1步 - 获取客户端和资源

import boto3

ec2c = boto3.client('ec2')
ec2r = boto3.resource('ec2')
ssmc = boto3.client('ssm')

第2步 - 创建并等待实例

instances = ec2r.create_instances(
    ImageId = 'ami-####',
    InstanceType = 't2.micro',
    MinCount = 1,
    MaxCount = 1,
    SecurityGroupIds = ['sg-####'])

instance_ids = [i.id for i in instances]
instance = instances[0]

instance.wait_until_running()

步骤3 - 将实例与IAM配置文件关联

“RoleName”附加了AmazonEC2RoleforSSM政策

res = ec2c.associate_iam_instance_profile(
    IamInstanceProfile={
        'Arn': 'arn:aws:iam::###:instance-profile/RoleName',
        'Name': 'RoleName'
    },
    InstanceId = instance.id
)

第4步 - 检查关联

print(ssmc.describe_instance_information()['InstanceInformationList'])

> []

(我认为这个空列表是下一步失败的原因)

步骤5 - 运行命令

resp = ssmc.send_command(
    DocumentName = "AWS-RunShellScript",
    Parameters = {'commands': [mkdir app]},
    InstanceIds = instance_ids
)

> botocore.errorfactory.InvalidInstanceId: An error occurred ...
> ... (InvalidInstanceId) when calling the SendCommand operation:

1 个答案:

答案 0 :(得分:0)

您正在获取InvalidInstanceId异常,因为您的实例上没有运行ssm代理。