Как назначить роль IAM для задачи ECS

Задачи ECS могут быть назначены роли IAM, чтобы обеспечить возможность взаимодействия с API AWS без необходимости передавать учетные данные пользователя в задачу. Это работает как для интерфейса командной строки AWS, так и для SDK. Здесь есть неплохая документация здесь, но я не смог найти подходящий пример, охватывающий все детали, я создам вопрос для самостоятельного ответа, чтобы избавить других от боли.


person adam.sandor    schedule 16.09.2017    source источник


Ответы (1)


Я создал репозиторий Git с полным примером. Важные моменты:

  • Создание определения роли IAM с помощью AssumeRolePolicyDocument.
  • Присвоение задаче роли IAM.
  • Используя AWS JS SDK.

    IAMRole:
    Type: AWS::IAM::Role
    Properties:
        RoleName: !Sub role-task-${AWS::StackName} # Doesn't matter too much but let's make it nice anyway
        Path: / # No idea about this one but / seems to work
        # This is the funky stuff.. don't try to understand just copy-paste. Source: http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_IAM_role.html
        AssumeRolePolicyDocument: |
            {
                "Statement": [{
                    "Effect": "Allow",
                    "Principal": { "Service": [ "ecs-tasks.amazonaws.com" ]},
                    "Action": [ "sts:AssumeRole" ]
                }]
            }
        Policies:
            - PolicyName: !Sub ecs-task-${AWS::StackName}
              # You can add any actions here you want your container to be allowed to execute.
              PolicyDocument:
                {
                    "Version": "2012-10-17",
                    "Statement": [{
                            "Effect": "Allow",
                            "Action": [
                                "cloudwatch:PutMetricData" # more actions if needed
                            ],
                            "Resource": "*"
                    }]
                }
    

Инициализация AWS SDK. AWS SDK автоматически обнаружит, что контейнер имеет доступ к учетным данным роли, и инициализирует себя. Вам не нужно выполнять никакой инициализации, кроме создания объектов API.

 var AWS = require('aws-sdk');

 var cw = new AWS.CloudWatch();
 var s3 = new AWS.S3();
person adam.sandor    schedule 16.09.2017
comment
Вам не нужно вручную получать учетные данные или инициализировать SDK с этими учетными данными; все SDK (после того, как функция была введена) должны делать это автоматически. Проверьте здесь для минимальных версий SDK. - person Samuel Karp; 18.09.2017
comment
Как тогда выглядел бы код инициализации? Только 1_ ? Я пытался заставить его работать без ручного получения учетных данных, но мне это не удалось. - person adam.sandor; 20.09.2017
comment
Я не знаком с SDK для JavaScript, но похоже, что цепочка поставщиков учетных данных по умолчанию верна: github.com/aws/aws-sdk-js/blob/ - person Samuel Karp; 22.09.2017
comment
Таким образом, решение состоит в том, что вам вообще не следует возиться с AWS.Config. Можете ли вы сейчас проверить, правильно ли это @SamuelKarp? - person adam.sandor; 27.09.2017