ECS에서 Lambda를 실행할 때 필요한 IAM 역할

하고 싶은 일



ECS Task에서 Lambda를 호출하고 싶습니다.

ECS와 이에 부여하는 IAM 역할은 CloudFormation에서 정의하고 있지만, IAM 역할이 올바른 곳에 대해 설정되어 있지 않으면 오류가 발생한다.

오류 예


message:Unable to locate credentials

환경


  • 기동 타입
  • Fargate

  • OS
  • linux(alpine)


  • 쓰기



    자세한 내용은 후술

    sample.yml
    AWSTemplateFormatVersion: 2010-09-09
    
    Resources:
      TaskRole:
        Type: AWS::IAM::Role
        Properties:
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Principal:
                  Service:
                    - ecs-tasks.amazonaws.com
                Action:
                  - sts:AssumeRole
          RoleName: TaskRoleNameHoge
    
      RolePolicy:
        Type: AWS::IAM::Policy
        Properties:
          PolicyName: TaskRolePolicyNameHoge
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: Hoge
                Effect: Allow
                Action:
                  - lambda:InvokeFunction
                Resource: 
                  - <実行したいLambdaのArn>
          Roles:
            - TaskRoleNameHoge
    
      TaskDefinition:
          ExecutionRoleArn: ecsTaskExecutionRole
          TaskRoleArn : !Ref TaskRole
    
         <その他TaskDefinition省略>
    
    

    ExecutionRole과 TaskRole과 TargetRole의 차이



    TaskDefinition에서 Role을 지정하는 곳은
  • ExecutionRoleArn
  • TaskRoleArn

  • 있다.

    또한 ECS 작업을 예약하는 경우
  • Targets: RoleArn

  • 도 있다.

    이 어디에 Lambda 실행 정책을 붙이면 좋을지 모르기 때문에 꽤 미주했기 때문에 본 기사를 썼다.
    (우선 전제로서 이 근처 가 혼란하고 있던 것도 미주의 일인)

    결론으로서는 상기의 sample에 쓴 대로, TaskRoleArn에 지정하면 된다.
    그것은 그것으로 ExecutionRole과 TaskRole과 TargetsRole은 어떻게 다른가.

    이미지는 이런 느낌


    ExecutionRole



    Amazon ECS 컨테이너 에이전트 또는 Fargate 에이전트에 AWS API 호출을 대체할 수 있는 권한을 부여하는 작업 실행 역할.
    목적이나 서비스마다 여러 개의 태스크 실행 역할을 가질 수 있습니다.

    Fargate를 이용하고 있다면, 주로 컨테이너 이미지를 가져와 컨테이너 로그를 Amazon CloudWatch에 출력할 권한이 부여되어 있으면 된다.
    ECS 콘솔 최초 실행에 ecsTaskExecutionRole 라는 Role이 자동 생성되므로 기본 policy가 되는 AmazonECSTaskExecutionRolePolicy
    따라서 ECS에 SSM에서 기밀 정보를 전달합니다. 경우에는 여기에 ssm에 대한 권한도 첨부해 둘 필요가 있다.

    컨테이너 인스턴스에서 실행되는 컨테이너는 컨테이너 인스턴스 프로파일에 제공된 자격 증명에 액세스 할 수 없으므로 최소한의 권한을 유지하는 것이 좋습니다.

    참고 : 개발자 가이드 Amazon ECS 작업 실행 IAM 역할

    TaskRole



    ECS 작업의 엔터티가 되는 컨테이너에 AWS API를 호출할 수 있는 권한을 부여하는 IAM 역할의 ARN.
    AWS 자격 증명을 생성하여 컨테이너에 배포하거나 EC2 인스턴스 역할을 사용하는 대신 ECS 작업 정의 및 RunTask API 작업에 IAM 역할을 연결할 수 있습니다.

    이 역할을 사용하여 작업 컨테이너의 애플리케이션은 AWS SDK 및 CLI를 사용하여 허가된 AWS 서비스에 대한 API 요청을 수행할 수 있습니다.

    그래서 이번 'ECS Task에서 Lambda를 호출하고 싶다'를 위해서는 여기에 Lambda 실행 권한을 부여하면 된다.

    참고 : 개발자 가이드 작업에 대한 IAM 역할

    AWS::Events::Rule Targets 아래의 Role



    규칙이 트리거될 때 해당 대상에 사용되는 IAM 역할의 ARN.
    하나의 룰이 복수의 타겟을 트리거하는 경우, 타겟 마다 다른 IAM 롤을 사용할 수가 있다.

    다른 계정의 이벤트 버스를 대상으로 설정하고 계정이 직접 계정 ID가 아닌 조직을 통해 계정에 권한을 부여하는 경우 이 매개 변수에서 적절한 권한을 가진 RoleArn을 여기에 지정할 필요가 있다.

    참고 : 사용 설명서 AWS::Events::Rule Target

    참고


  • AWS IAM 정책 이해
  • 사용 설명서 AWS::ECS::TaskDefinition
  • 「그 컨테이너로 하는 의미 안의?」 헤매는 어린 양에게 바치는 컨테이너 환경 철저 비교
  • 좋은 웹페이지 즐겨찾기