CDK(Python)でIAMロールを作ってAssumeRoleしてみた

2023.02.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、soraです。

今回は、CDK(Python)でIAMロールを作ってAssumeRoleしてみたことについて書いていきます。
AssumeRoleとはみたいな話は、わかりやすく説明されている記事が他にあるため、今回は割愛させていただきます。

今回やってみること

アカウントBにIAMロールを作成して、アカウントAのIAMユーザがアカウントBのIAMロールにスイッチロールできることを確認します。
イメージ的には、検証環境(アカウントA環境)から本番環境(アカウントB環境)にスイッチロールするみたいなことです。

ロール作成には、Cloud9上に構築した開発環境でCDK(Python)を使います。

(.venv) $ python --version
Python 3.7.16
(.venv) $ cdk --version
2.63.0

やってみた

それではロール作成してテストしていきます。

ロール作成

ソースコードは以下です。
スタックを呼び出すapp.pyは、処理を追加していないため割愛します。

test_python_stack.py

from constructs import Construct
from aws_cdk import (
    Stack,
    aws_iam as _iam,
)

class TestPythonStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        ## IAM
        # ロール作成
        role = _iam.Role(self, "Role",
            role_name="test-assume",
            # アカウントID(:root)で指定するなら場合は
            # assumed_by=_iam.AccountPrincipal("<スイッチ元のアカウントID>")
            # arnで指定してMFAの有効化も条件とする
            assumed_by=_iam.ArnPrincipal("arn:aws:iam::<スイッチ元のアカウントID>:user/<ユーザ名>").with_conditions({"Bool": {"aws:MultiFactorAuthPresent": "true"}})
        )
        # 許可ポリシーの追加
        role.add_managed_policy(_iam.ManagedPolicy.from_aws_managed_policy_name("AWSCodePipeline_FullAccess"))

        # 許可ポリシーなし版の同様のロール作成
        role2 = _iam.Role(self, "Role2",
            role_name="test-assume2",
            assumed_by=_iam.ArnPrincipal("arn:aws:iam::<スイッチ元のアカウントID>:user/<ユーザ名>").with_conditions({"Bool": {"aws:MultiFactorAuthPresent": "true"}})
        )

ソースコードができたため、差分を確認した後に実行します。

# (不要な場合は省略)仮想環境への切り替え
$ source .venv/bin/activate

# 実行時の差分確認+実行
(.venv) $ cdk diff
(.venv) $ cdk deploy

確認

まずはロールが作成されていることを確認します。

次にスイッチロールできることを確認します。
画像2枚目は、スイッチ先のアカウントIDとロール名を入力してください。

最後に許可ポリシーに従って、アクセス制御できているかを確認します。
CodePipelineを見てみると、想定通り、権限が振られている[test-assume]ではエラーにならず、権限が振られていない[test-assume2]ではエラーになっています。

最後に

今回は、CDK(Python)でIAMロールを作ってAssumeRoleしてみたことについて紹介しました。
参考になれば幸いです。