我正在从以批处理方式运行的容器作业中提取正在运行该AWS批处理作业的EC2实例的实例ID:
我要进行以下操作:
AWS_BATCH_JOB_ID
并调用boto3.client('batch').describe_jobs(jobs=[job_id])
containerInstanceArn
。格式为:"arn:aws:ecs:us-west-2:55555555:container-instance/3364c30a-aaaa-bbbb-cccc-03e68c347f00"
我用获得的Arn呼叫boto3.client('ecs').describe_container_instances(...)
。该响应中应包含EC2实例ID:
# this is run from the batch job environment -- inside the container instance
instances = ecs.describe_container_instances(
cluster=config['cluster_arn'],
containerInstances=[this_container_instance_arn],
include=['TAGS'])
但是,对DescribeContainerInstances
的呼叫给我一个错误:
botocore.errorfactory.InvalidParameterException:
An error occurred (InvalidParameterException) when calling the
DescribeContainerInstances operation: Identifier is for 12345678.
Your accountId is 55555555
我已经编辑了数字,但是55555555与containerInstanceArn中的前缀匹配。 12345678与我所有iam角色中的ID相匹配,例如arn:aws:iam::12345678:role/my-ecs-job-role
。
该作业是从CLI(从我的主要用户帐户)启动的。我猜该作业正在运行时扮演不同的角色,因为该实例是由某个AWS服务帐户自动启动的?
我需要在IAM中进行哪些更改以允许我的工作脚本使用boto查询ECS实例?
这是我在批处理作业定义中配置的作业角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
我还将以下政策文件附加到职位上。没有它,对describe_container_instances
的呼叫将被拒绝:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:DescribeContainerInstances"
],
"Resource": "*"
}
]
}
还有另一个我需要编辑的角色。我注意到还有一个ECS-instance-role,与工作角色不同。
答案 0 :(得分:0)
这并不能真正解决权限问题,但是如果仅需要实例ID,则可以完全避免boto调用。
您可以通过instance's metadata来查看实例ID:
GET http://169.254.169.254/latest/meta-data/instance-id