AWS Batch CLIENT_ERROR无效的IamInstanceProfile

时间:2017-09-17 14:38:51

标签: amazon-web-services amazon-ec2 amazon-ecs

最初发布到ServerFault,但发布在此处希望有人可能遇到我的问题。

我正在尝试设置一个在AWS Batch上运行的容器。我没有做任何花哨的事情,或多或少只是遵循默认设置的一切。我收到的错误似乎与实例角色或与实例角色关联的权限有关。

首先,设置顺利进行。我设置了我的计算环境,然后是我的队列,然后我将一个基本作业添加到队列中。作业最终陷入可运行状态,然后在20分钟左右后,我的计算环境变为“无效”,出现此错误:

CLIENT_ERROR - Invalid IamInstanceProfile: arn:aws:iam::001234567890:role/ecsInstanceRole (Service: AmazonAutoScaling; Status Code: 400; Error Code: ValidationError; Request ID: blah)

我读了this troubleshooting guide,它似乎解决了相关问题(尽管它们并不完全匹配)。我尝试过5到6次重复环境,没有运气。我也尝试删除现有角色并让管理员重新创建它们。故障排除指南中的大多数问题似乎源于在AWS CLI中错误设置的角色或某些非批处理控制台需求。该指南甚至会读到“AWS Batch控制台仅显示对计算环境具有正确信任关系的角色”。但是我使用的所有角色都是通过控制台选择的,这似乎意味着他们得到了正确的许可。

不知道该怎么做,感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

有点令人困惑的是,AWS Batch Compute Environment的instanceRole属性必须引用IAM 实例配置文件 ARN而不是IAM 角色 ARN。也就是说,instanceRole值应该看起来像arn:aws:iam::123456789012:instance-profile/ecsInstanceRole而不是arn:aws:iam::123456789012:role/ecsInstanceRole。但是,错误消息实际上提到了实例配置文件。

以下CloudFormation代码段会创建有效的批处理计算环境:

Parameters:
    VPC:
        Type: String
        Description: VPC ID of the target VPC
    Subnet:
        Type: List<AWS::EC2::Subnet::Id>
        Description: VPC subnet(s) for batch instances
    SG:
        Type: List<AWS::EC2::SecurityGroup::Id>
        Description: VPC Security group ID(s) for batch instances

Resources:
    MyBatchEnvironment:
        Type: "AWS::Batch::ComputeEnvironment"
        Properties:
            Type: MANAGED
            ServiceRole: !GetAtt MyBatchEnvironmentRole.Arn
            ComputeResources:
                MaxvCpus: 8
                SecurityGroupIds: !Ref SG
                Subnets: !Ref Subnet
                InstanceRole: !GetAtt MyBatchInstanceProfile.Arn
                MinvCpus: 0
                DesiredvCpus: 0
                Type: EC2
                InstanceTypes:
                    - optimal

    MyBatchEnvironmentRole:
        Type: "AWS::IAM::Role"
        Properties:
            AssumeRolePolicyDocument:
                Version: '2012-10-17'
                Statement:
                    - Effect: Allow
                      Principal: {Service: "batch.amazonaws.com"}
                      Action: "sts:AssumeRole"
            Path: /service-role/
            ManagedPolicyArns:
                - "arn:aws:iam::aws:policy/service-role/AWSBatchServiceRole"

    MyBatchInstanceRole:
        Type: "AWS::IAM::Role"
        Properties:
            AssumeRolePolicyDocument:
                Version: '2012-10-17'
                Statement:
                    - Effect: Allow
                      Principal: {Service: "ec2.amazonaws.com"}
                      Action: "sts:AssumeRole"
            Path: /
            ManagedPolicyArns:
                - "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"

    MyBatchInstanceProfile:
        Type: "AWS::IAM::InstanceProfile"
        Properties:
            Path: "/"
            Roles:
                - !Ref MyBatchInstanceRole

答案 1 :(得分:3)

感谢您提请我们注意。我们已经解决了此问题的根本原因,控制台现在应该按预期工作。如果您遇到任何进一步的错误,请再试一次,告诉我们。

来自AWS Batch团队的Jamie

答案 2 :(得分:2)

我有完全相同的问题。我发现,在ec2InstanceRole下,它使用AmazonEC2ContainerServiceforEC2Role作为将EC2 Container Service作为服务的策略。这个服务有一个黄色三角形,结果是有一个无法识别的动作,即UpdateContainerInstancesState。

与Alex一样,我已将所有IAM保留为AWS批处理控制台自动创建。用于创建AmazonEC2ContainerServiceforEC2Role的JSON确实包含UpdateContainerInstancesState。但是,在AWS文档中它没有,因为它是AWS控制的角色,所以我无法改变任何内容。

非常感谢任何帮助。