GCP to AWS with IAM Roles

realBro·2024년 10월 31일

GCP에 있는 Service 들에서 AWS에 있는 Service에 접근 하려고 할 때, IAM Role 기반 인증을 통해 접근하는 방법에 대해 기술 하려고한다.

개요

  • GCP의 Service Account;SA를 IAM Role의 resources로 지정
  • GCP SA를 통해 Token을 발급
  • 발급 받은 토근을 통해 AWS STS를 통한 임시 자격 획득
  • 해당 임시 자격으로 AWS에 있는 특정 Service에 접근

IAM Role 을 사용하는 이유

IAM 이 뭔지에 대해서는 smileshark블로그에서 상당히 잘 설명 해 놨다.

내가 이해한 IAM role을 사용해야 하는 이유는 다음과 같다

  • 특정 resource에서만 접근 할 수 있게 할 수 있다.
  • 임시 자격 증명을 통해 권한을 부여 하기 때문에 보안상 유리하다.

결국 보안상 User 기반 인증보다 유리해서 IAM Role 기반 인증으로 모두 전환하고 있는 느낌이다.

IAM Role 생성

  • GCP의 Service Account를 생성 후 해당 Service Account의 Unique ID(client_id)를 다음과 같이 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"
                }
            }
        }
    ]
}

사용 방법

  • GCP Service Account에 대한 권한과 IAM Role의 Policy에 대해서 필요한 만큼 설정하면 Infra(?) 적 설정은 끝이난다.
  • 이후로는 코드 단에서 어떻게 사용하는지에 대한 내용이다.
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']
)

0개의 댓글