티스토리 뷰

AWS

aws update iam policy python (boto3)

fendys 2024. 9. 2. 20:12
반응형
import boto3
from botocore.exceptions import ClientError
import json
def get_policy_document(iam_client, policy_arn):
    """
    IAM 정책의 문서를 가져옵니다.
    :param iam_client: Boto3 IAM 클라이언트
    :param policy_arn: 조회할 IAM 정책의 ARN
    :return: 정책 문서 (JSON 형식)
    """
    try:
        response = iam_client.get_policy(PolicyArn=policy_arn)
        policy_version_id = response['Policy']['DefaultVersionId']
        response = iam_client.get_policy_version(
            PolicyArn=policy_arn,
            VersionId=policy_version_id
        )
        policy_document = response['PolicyVersion']['Document']
        return policy_document
    except ClientError as e:
        print(f"Error getting policy document: {e}")
        return None
def create_policy_version(iam_client, policy_arn, policy_document):
    """
    IAM 정책에 새 버전을 생성하고 기본 버전으로 설정합니다.
    :param iam_client: Boto3 IAM 클라이언트
    :param policy_arn: 정책의 ARN
    :param policy_document: 정책 문서 (JSON 형식)
    """
    try:
        # 새 정책 버전 생성
        response = iam_client.create_policy_version(
            PolicyArn=policy_arn,
            PolicyDocument=json.dumps(policy_document),
            SetAsDefault=True
        )
        # 가장 오래된 정책 버전을 삭제 (기본 버전이 아닌 경우)
        policy_versions = iam_client.list_policy_versions(PolicyArn=policy_arn)
        versions = sorted(policy_versions['Versions'], key=lambda v: v['CreateDate'])
        # 기본 버전 외에 다른 모든 버전 삭제
        for version in versions[:-1]:  # 최신 버전은 유지
            if version['IsDefaultVersion']:
                continue
            iam_client.delete_policy_version(
                PolicyArn=policy_arn,
                VersionId=version['VersionId']
            )
        print(f"Updated policy {policy_arn} with a new version.")
    except ClientError as e:
        print(f"Error creating policy version: {e}")
if __name__ == "__main__":
    # 다중 계정의 프로파일 리스트 정의
    account_profiles = [
        {"profile_name": "fendys-prod", "account_id": "123456789012", "policy_name": "fendys_policy"}
        {"profile_name": "fendys-dev", "account_id": "123456789013", "policy_name": "fendys_policy"}
        # 추가적인 계정을 여기에 추가
    ]
    for account in account_profiles:
        profile_name = account["profile_name"]
        account_id = account["account_id"]
        policy_name = account["policy_name"]
        # Boto3 IAM 클라이언트 생성
        session = boto3.Session(profile_name=profile_name)
        iam_client = session.client('iam')
        # 수정할 정책의 ARN 동적으로 생성
        policy_arn = f"arn:aws:iam::{account_id}:policy/{policy_name}"
        # 정책 문서 가져오기
        policy_document = get_policy_document(iam_client, policy_arn)
        if policy_document:
            # 수정할 정책 문서 적용
            # 예를 들어, 정책 문서에 새 권한 추가
            policy_document['Statement'].append({
                "Effect": "Allow",
                "Action": "s3:*",
                "Resource": "*",
                "Condition": {
                "StringEquals": {
                    "aws:RequestTag/maker": "fendys"
                }
            }
            })
            # 정책 버전 생성 및 업데이트
            create_policy_version(iam_client, policy_arn, policy_document)
        else:
            print(f"Policy {policy_name} does not exist in account {account_id}.")
반응형