我想在新启动的实例上通过 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 配置文件关联
“角色名称”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: