[AWS] SAM은 IAM 인증을 받은 API Gateway를 다른 계정의 Lambda에서 호출하는 구조를 시험적으로 제작하였다.

Qita에도 투고 중: https://qiita.com/engineer-taro/items/59bc66de255764748ae5
문장의 제목이 길어졌는데 주로 다음과 같이 구성되어 있다.
계정 A
  • APIGateway(IAM 인증 포함)
  • Lambda
  • 계정 B
  • Lambda
  • 유량
    계좌B.Lambda→계좌A.APIGateway→계좌A.Lambda
    잘 보세요.

    Giithub 창고


    나는 이번 보도에서 설명한 구성이 만들어진 소스를github에 밀어 넣었다.
    같은 구성을 만들어 고민하시는 분들이 있다면 소스를 만지작거리며 디자인해보세요!
    ※ 사용 시 자신의 환경에 따라 몇 개의 매개 변수를 설정해야 합니다.
    https://github.com/engineer-taro/apigateway-iamauthentication-crossaccount

    주의

  • 이 기사는 파이톤, AWS SAM을 사용합니다.
  • 파이토존은 보토 327aws_requests_auth의 프로그램 라이브러리도 사용한다.
  • 온갖 방법을 다 동원해서 만든 동작이기 때문에 더 좋은 구성과 설치, 잘못된 점이 있다면 지적해 주십시오.
  • 본 보도의 대상


    핵심 사례라 대상자가 별로 없을 수도 있다.그러므로메시지 없음기사를 쓰기로 했습니다.
  • AWS의 API Gateway, Lambda, IAM 역할을 아는 사람
  • "API Gateway에 대한 IAM 인증"을 알고 있는 사람
  • SAM 또는 CloudFormation을 이용하여 AWS 자원을 개발한 경험이 있는 사람
  • IAM 인증을 받은 API Gateway를 다른 계정의 람다에서 호출하려는 사람
  • 구성 정보


    APIGateway의 계정과 APIGateway를 호출하는 람다의 계정을 분리해 APIGateway에 IAM 인증이 필요한 구성도를 구현한 것이다.
    다음은 구성도입니다.
    構成図全体

    구성 상세 정보: APIGateway Acount


    우선, 제가 이곳의 구성 세부 사항을 설명해 드리겠습니다.
    構成図_A
    APIGateway Acout에서는 기본적으로 IAM 인증의 APIGateway, 호출자의 람바다로 구성된다.
    여기 있는 API Gateway는 다른 계정에서 호출되었고, 최종적으로 Lambda 함수의 결과가 되돌아왔습니다.
    이 계좌의 포인트는IAM 롤러의 존재.
    여기 IAM 스크롤 막대의 SAM 템플릿을 보십시오.전혀 볼 필요가 없다.요점 1, 요점 2 만 보세요.
    template.yaml
      APIGatewayRole:
        Type: "AWS::IAM::Role"
        Properties:
          RoleName: !Ref RoleName
          Path: "/"
          ManagedPolicyArns:
            - "arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs"
          Policies:
            - PolicyName: "authorizerLambdaInvokeAccess"
              PolicyDocument:
                Version: "2012-10-17"
                Statement:
                  - Effect: "Allow"
                    Action:
    #...............ポイント1:Lambda周りの権限も必要
                      - lambda:InvokeAsync 
                      - lambda:InvokeFunction
                      - execute-api:Invoke
                    Resource: "*"
    #...............ポイント2:このIAMロールを他で使えるようにAssumeRolePolicyを規定する
          AssumeRolePolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Sid: "AllowApiGatewayServiceToAssumeRole"
                Effect: "Allow"
                Action:
                  - "sts:AssumeRole"
                Principal:
                  AWS:
                    - !Sub "arn:aws:iam::${AnotherAccountID}:role/FromLambdaRole"
    
    요점 1: 주변 권한 필요
    요점 2: Asseume RolePolicy를 설정하여 IAM 캐릭터를 다른 곳에서 사용

    Lambda 주변의 권한이 필요합니다.


    이번 구성에서는 API Gateway에 걸친 인증 정보를 API Gateway 역할로 활용한다.
    자세한 내용은 아래 기사에 기재된 정보를 확인하세요.
    https://qiita.com/engineer-taro/items/073e73e65565ada27146
    이에 따라 APIGateway도 람다의 권한을 수행해야 해 부여했다.

    AssumeRolePolicy 설정


    Assume RolePolicy는 STS(Security Token Serivce)에서 Asseume Role을 사용할 때 사용하는 Policy입니다.
    그렇다면 STS의 Assume Role은 무엇일까요?
    IAM 역할이 소유한 권한을 다른 사용자 또는 역할에 일시적으로 부여하는 작업입니다.
    이번에는 APIGateway Acount에서 제작한 IAM 스크롤 막대를 통해 APIGateway의 IAM 인증이 이뤄지므로 램바다 어카운트의 IAM 스크롤 막대에 IAM 스크롤 막대 권한을 부여할 필요가 있다.
    따라서 AssumeRolePolicy 권한을 부여하는 대상이 기재되어 있습니다.
    아래를 좀 봅시다.
                Principal:
                  AWS:
                    - !Sub "arn:aws:iam::${AnotherAccountID}:role/FromLambdaRole"
    
    다른 계정의 IAM 캐릭터인 프롬람다롤레는'아슈미롤레 이용 가능'허가를 받았다.

    구성 세부 정보: Lambda Accento


    이어 람바다 계정 구성을 해설한다.
    構成図_B
    "APIGateway Acount의 IAM 역할"에서 사용 권한을 얻을 수 있음IAM 롤러네.
    IAM 스크롤 막대를 Lambda에 연결하여 "API Gateway Actunt의 IAM 스크롤 막대"를 Lambda에서 사용할 수 있습니다.또한 API Gateway Acount의 IAM 역할을 사용하여 Lambda에서 API Gateway를 호출할 수 있습니다.
    짖을 때의 소스를 보세요.
    app.py
        credentials = get_credentials() # ...............ポイント1: IAMの認証情報を取得する
        auth = AWSRequestsAuth(
            aws_access_key=credentials['AccessKeyId'],
            aws_secret_access_key=credentials['SecretAccessKey'],
            aws_host=aws_host,
            aws_region=REGION_NAME,
            aws_service='execute-api'
        )
        headers = {'x-amz-security-token': credentials['SessionToken']}
        # ............... ポイント2: IAMの認証情報を送る
        response = requests.post(
            url, json={"foo": "bar"}, auth=auth, headers=headers)
    
    def get_credentials():
        client = boto3.client('sts')
        IAM_ROLE_ARN = os.environ['IAM_ROLE_ARN']
        IAM_ROLE_SESSION_NAME = 'other_account_session'
        response = client.assume_role(
            RoleArn=IAM_ROLE_ARN,
            RoleSessionName=IAM_ROLE_SESSION_NAME
        )
        return response['Credentials']
    
  • 점1: IAM 인증 정보 획득
  • 점2: IAM 인증 정보 발송
  • STS를 사용하여 IAM 인증 정보 얻기


    방금 API Gateway Actunt 해설 때 나온 STS의 Asseume Role을 이용해 IAM 캐릭터 인증 정보를 획득했습니다.
    APIGateway를 호출할 때, 이를 눈썹에 건네주고, IAM 인증을 받은 APIGateway를 호출할 수 있다.

    IAM 인증 정보 보내기


    requests.포스터에서 IAM 역할에 대한 인증 메시지를 함께 보내주세요.
        response = requests.post(
            url, json={"foo": "bar"}, auth=auth, headers=headers)
    
    상기 방법을 통해 다른 계정에서 API를 호출할 수 있다.

    감상


    가장 힘든 일은SAM의 글씨를 쓰면서 쓰는 것이다.
    SAM은 사용하는 사람이 적기 때문에 정보가 적다.
    또 공식 문서도 최소한의 정보만 써서 힘들었다.일본어 번역이 뒤죽박죽이어서 그런대로 괜찮지만 영어로 읽어도 원하는 정보를 찾을 수 없다.
    다음 IaC 때 terraform 같은 걸 사용해 보고 싶어요.

    참고 문장


    https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-authentication-api-gateway/
    https://zenn.dev/ohsawa0515/articles/access-iam-authentication-api-gateway

    좋은 웹페이지 즐겨찾기