こんにちは、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してみたことについて紹介しました。
参考になれば幸いです。