IAM初心者がAWS CLIでスイッチロールするまで

2021.03.04

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

こんにちは。

サービスGの金谷です。

これまでIAMの設定を自分でやることがあまりなく、スイッチロールで何が起きているのか全然理解できていなかったのでまとめようと思います。

まず大前提

AWSアカウント≠ IAMユーザー です。

当然といえば当然なのですが別物です。

ざっくり説明するとAWSアカウントの中にIAMユーザーがいるといった形で、AWSアカウント=ルートユーザーのようなイメージです。

私個人の経験としてはプライベートでAWSを学び触り始めたばかりのときは

IAMを何も設定せずに他のサービスを触ったりしていましたが、通常は使用するべきではないです。

ちゃんとIAMユーザーを作成してそちらで作業するようにしましょう。

スイッチロールとは

名前の通りIAMロールを切り替える機能です。

アカウントを跨いだロールの切り替えも可能です。(というかこちらをメインに使います)

上図ではスイッチ元のアカウントAから、スイッチ先のアカウントBのロールにスイッチロールできます。

よくあるユースケースとしては以下の記事にあるように、環境毎にAWSアカウントを作成するなどして

その環境毎で権限やユーザーを管理したりすることが多いです。

【IAM】スイッチロールの運用について考えてみた

そもそも何が嬉しいのか

スイッチロール自体のメリットは一度ログアウトしてから、もう一度別のアカウントでログインする必要がなくなるのが楽になるというところかと思います。

ですが、そもそもアカウントをなぜ分ける必要があるのか?と疑問に思われる方も多いかもしれません。

こちらについてはこの記事では詳しく言及しませんが、例えば上記のような構成であれば

各環境ごとの利用費の見通しを良くしたり、アクセス制御の設定をシンプルにしたりすることが可能です。

以下の記事がとてもまとまっていて良いかと思いますのでぜひ参考にしてください。

AWSアカウントとVPC、分ける? 分けない?: 分割パターンのメリット・デメリット

実際にスイッチロールしてみる

IAMのスイッチロールを理解したい

手順については上記の記事で丁寧に解説されています。

TestSwitchRoleというロールでスイッチロールできるようにします。

(私の場合はスイッチ元のアカウントにすでにAssumeRoleを許容するポリシーが管理者によって設定されていたので、ポリシーの設定は特にしていません)

AWS CLIでのスイッチロール

マネジメントコンソールからスイッチロールができたので、今度はAWS CLIからスイッチ先のロールで操作してみます。

AWS CLIのバージョンは以下です。

❯ aws --version
aws-cli/2.1.25 Python/3.9.1 Darwin/19.6.0 source/x86_64 prompt/off

まずは~/.aws/credentialsにアクセスキーを設定します。

ここにはスイッチ元のアクセスキーを設定します。

(defaultの部分は任意、TestSwitchRoleの部分は前の手順で作成したロールに適宜置き換えてください)

[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

次に~/.aws/configを設定します。

[profile default]
region = ap-northeast-1
output = json

[profile test]
role_arn = arn:aws:iam::スイッチ先のID:role/TestSwitchRole
source_profile = default

これでおおよそは動作するかと思いますが、MFAを有効にしている場合にはその設定も必要になります。

(自分が触った際はA client error (AccessDenied) occurred when calling the AssumeRole operation: User arn:aws:iam::〇〇:user/XXXXX is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::△△:role/□□みたいなエラーが出ました。)

以下のように追記しましょう。(私はここでハマりました)

[profile default]
region = ap-northeast-1 
output = json 

[profile test] 
role_arn = arn:aws:iam::スイッチ先のID:role/TestSwitchRole 
source_profile = default 
mfa_serial = arn:aws:iam::スイッチ元のID:mfa/スイッチ元のユーザー  // 追記した箇所

これでCLIでもスイッチ先のロールで操作ができるはずです。

aws s3 ls --profile test

参考にさせていただいた記事

公式 AWS CLI での IAM ロールの使用

AWS アカウント、IAM ユーザー、IAM グループ、IAM ロールの違い

IAMのスイッチロールを理解したい

[小ネタ] 同一のAWSアカウント内でスイッチロールする(マネジメントコンソール)

クロスアカウントなAWS CLI処理でハマった話

AWSアカウントとVPC、分ける? 分けない?: 分割パターンのメリット・デメリット