由于accountId不匹配,AWS ECS DescribeContainerInstances生成InvalidParameterException

时间:2019-10-10 03:39:03

标签: amazon-web-services boto3 amazon-ecs aws-batch

我正在从以批处理方式运行的容器作业中提取正在运行该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,与工作角色不同。

1 个答案:

答案 0 :(得分:0)

这并不能真正解决权限问题,但是如果仅需要实例ID,则可以完全避免boto调用。

您可以通过instance's metadata来查看实例ID:

GET http://169.254.169.254/latest/meta-data/instance-id