[AWS] SAM은 IAM 인증을 받은 API Gateway를 다른 계정의 Lambda에서 호출하는 구조를 시험적으로 제작하였다.
문장의 제목이 길어졌는데 주로 다음과 같이 구성되어 있다.
계정 A
계좌B.Lambda→계좌A.APIGateway→계좌A.Lambda
잘 보세요.
Giithub 창고
나는 이번 보도에서 설명한 구성이 만들어진 소스를github에 밀어 넣었다.
같은 구성을 만들어 고민하시는 분들이 있다면 소스를 만지작거리며 디자인해보세요!
※ 사용 시 자신의 환경에 따라 몇 개의 매개 변수를 설정해야 합니다.
주의
본 보도의 대상
핵심 사례라 대상자가 별로 없을 수도 있다.그러므로메시지 없음기사를 쓰기로 했습니다.
구성 정보
APIGateway의 계정과 APIGateway를 호출하는 람다의 계정을 분리해 APIGateway에 IAM 인증이 필요한 구성도를 구현한 것이다.
다음은 구성도입니다.
구성 상세 정보: APIGateway Acount
우선, 제가 이곳의 구성 세부 사항을 설명해 드리겠습니다.
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 역할로 활용한다.
자세한 내용은 아래 기사에 기재된 정보를 확인하세요.
이에 따라 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
이어 람바다 계정 구성을 해설한다.
"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']
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 같은 걸 사용해 보고 싶어요.
참고 문장
Reference
이 문제에 관하여([AWS] SAM은 IAM 인증을 받은 API Gateway를 다른 계정의 Lambda에서 호출하는 구조를 시험적으로 제작하였다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/taroman_zenn/articles/55ed2921484291텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)