🔀

AWS CLIでクロスアカウントのスイッチロールを行う

2023/08/15に公開

モチベーション

私の使っているAWS環境では諸事情によりOrganizationsが使用できないので、AWSアカウント管理は以下のように行っています。

  • アイデンティティアカウントにのみIAM Userを作成する
    • アイデンティティアカウントには原則IAM関係のリソースしか作成しない
  • アイデンティティアカウント以外のAWSアカウント(子アカウントと呼んでいます)にはIAM Userは作成しない
    • 子アカウントにはIAM Roleを作成し、アイデンティティアカウントからスイッチロールして開発を行う

architecture

子アカウントで作業を行うためには毎回スイッチロールが必要になるのです。これがけっこう手間で面倒だったので対応を調べました。

スイッチロールをシームレスに行う

AWS CLIでは --profile オプションを使用することで、プロファイルを指定してコマンドを実行することができます。

これは .aws/credential に複数のアクセスキーを記載しているときに、どのアクセスキーを使用するかを選ぶためだけにあると思っていました。

以下のように、 .aws/config でうまく設定することで、 --profile オプションを指定するだけで、スイッチロールを意識することなく子アカウントでの作業ができることがわかりました。

.aws/credentialsにアイデンティティアカウントの認証情報を記述する

~/.aws/credential
[identity-account]
aws_access_key_id = <your access key id>
aws_secret_access_key = <your secret access key>

.aws/configにスイッチロールする際の設定を記述する

アイデンティティアカウントにMFA設定がある場合は、mfa_serial にMFAデバイスのARNを記載してください。

~/.aws/config
[profile identity-account] # アイデンティティアカウントの設定
region = ap-northeast-1
output = json

[profile dev-account] # プロファイル名は任意
mfa_serial = arn:aws:iam::123456789:mfa/your-mfa-device # 自分のMFAデバイスのARN
role_arn = arn:aws:iam::987654321:role/dev-account-role # スイッチしたい子アカウントのRole
source_profile = identity-account # ①で設定したアイデンティティアカウントのプロファイル名
region = ap-northeast-1
output = json

これで設定は完了です。

③プロファイルを指定してCLIを実行する

もうスイッチロールを意識せずとも、プロファイルを指定するだけで子アカウントのRoleでCLIを実行できます。

bash
$ aws sts get-caller-identity --profile dev-account
Enter MFA code for arn:aws:iam::123456789:mfa/your-mfa-device: 123456
{
    "UserId": "ARXXXXXXXXXXXXXXXX:botocore-session-1111111111",
    "Account": "987654321",
    "Arn": "arn:aws:sts::987654321:assumed-role/dev-account-role/botocore-session-1111111111"
}

初回はMFAコードを求められますが、2回目以降はstsの有効期限が切れるまでMFAコードは聞かれなくなります。

Discussion