GCP에 있는 Service 들에서 AWS에 있는 Service에 접근 하려고 할 때, IAM Role 기반 인증을 통해 접근하는 방법에 대해 기술 하려고한다.
IAM 이 뭔지에 대해서는 smileshark블로그에서 상당히 잘 설명 해 놨다.
내가 이해한 IAM role을 사용해야 하는 이유는 다음과 같다
결국 보안상 User 기반 인증보다 유리해서 IAM Role 기반 인증으로 모두 전환하고 있는 느낌이다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Federated": "accounts.google.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
// gcp service account의 Unique ID(client_id)
"accounts.google.com:sub": "1111111111111"
}
}
}
]
}
import boto3
from google.oauth2 import id_token
from google.auth.transport.requests import Request
audience = "https://sts.amazonaws.com/"
# GOOGLE_APPLICATION_CREDENTIALS 환경 변수에 GCP Service Account의 key path 설정
# 해당 json을 사용해서 token 요청
id_token_value = id_token.fetch_id_token(Request(), audience)
sts_client = boto3.client('sts')
# 해당 토큰을 sts client에 role과 함께 넘겨줘 assumed role 획득
assumed_role = sts_client.assume_role_with_web_identity(
RoleArn="arn:aws:iam::~~~",
RoleSessionName="ex-session-name",
WebIdentityToken=id_token_value
)
credentials = assumed_role['Credentials']
# 발급받은 임시 자격 증명을 통해 aws에 원하는 service에 접근해서 사용
client = boto3.client(
'{aws_service}',
region_name='ap-northeast-2',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken']
)
# 혹은 session을 받아와서 사용 하는 방법도 있음
session = boto3.Session(
region_name='ap-northeast-2',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken']
)