CDK(Python)でIAMロールを作ってAssumeRoleしてみた
こんにちは、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してみたことについて紹介しました。
参考になれば幸いです。