こちらの記事で書いたリザーブドインスタンスの期限切れを通知する処理は、結局、 AWS コンソールで提供される機能を使うことになったため、不要になりました。
でも、この時クロスアカウントアクセスの設定方法が分かったので、複数アカウント管理を簡単にするために、これを活用しようと思います。
前述の記事を試す途中で、IAMユーザーでクロスアカウントアクセスするのは試したので、次は、CLIからクロスアカウントアクセスをやろうと思います。
これがうまくいけば、管理対象のアカウントの IAM ユーザーを削減できるので、楽になりそうです。
設定
下記の IAM のチュートリアルにあるやり方は、STS で一時クレデンシャルを取得して、そのたびに、環境変数を設定するという方法です。
IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任 - AWS Identity and Access Management
たぶん、まっとうな方法(先の記事中でAPI経由で扱う時はこれと同じですね)なんですが、毎回やるのはどう考えても面倒です。
で、いい方法ないかな?と調べてみると、ここの設定を自動でやってくれる書き方がありました。
- AWS CLIがAssumeRoleによる自動クレデンシャル取得とMFAに対応しました! | Developers.IO
- AWS CLI での IAM ロールの使用 - AWS Command Line Interface
- IAM ロールの切り替え (AWS CLI) - AWS Identity and Access Management
これだと、一度設定ファイルを書いておけば、CLI実行時のプロファイルを切り替えるだけで使えるので、現実的です。
~/.aws/config を次のようにしました。
[profile mor_test] region = ap-northeast-1 [profile mor_test_cross] region = ap-northeast-1 role_arn = arn:aws:iam::信頼するほうのアカウントID:role/引き受けられるロール名 source_profile = mor_test
mor_test がクロスアカウントを行うアカウント(信頼されるアカウント)になります。
ためす
さっそく試します。ec2 のリザーブドインスタンスの情報を取ってみます。
mor@DESKTOP-H6IEJF9:~$ aws ec2 describe-reserved-instances --profile mor_test_cross An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::信頼されるほうのアカウントID:user/mor_test is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::信頼するほうのアカウントID:role/引き受けられるロール名 mor@DESKTOP-H6IEJF9:~$
しかし、なぜかうまくいかないです。
ちょっとネットを調べるとこんな記事がありました。
クロスアカウントなAWS CLI処理でハマった話 | Developers.IO
あ、引き受けさせたいロールの条件として、MFAは必須にしてましたね。信頼する側のロールにアタッチされているポリシーが下記のようになってます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::信頼されるほうのアカウントID:root" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } ] }
でも、CLI で MFA どうやって扱うの?
ということで、MFAのやり方を調べてみます。
CLI での MFA
すぐにやり方は見つかりました。
AWS CLI での IAM ロールの使用 - AWS Command Line Interface
こちらを参考にして、クロスアカウント元になるユーザー(上記の例だと mor_test )に対して、MFAを設定します。
次に、 ~/.aws/config を編集して、 mfa_serial を追加します。
[profile mor_test] region = ap-northeast-1 [profile mor_test_cross] region = ap-northeast-1 role_arn = arn:aws:iam::信頼するほうのアカウントID:role/引き受けられるロール名 mfa_serial = arn:aws:iam::信頼されるほうのアカウントID:mfa/mor_test source_profile = mor_test
この状態にして確かめると、
mor@DESKTOP-H6IEJF9:~$ aws rds describe-reserved-db-instances --profile mor_test_cross Enter MFA code for arn:aws:iam::信頼されるほうのアカウントID:mfa/mor_test:
と画面に表示されて、信頼されるほうのアカウント mor_test の MFA のコードを入力するように求められます。 正しい、コードが入力できると、
{ "ReservedDBInstances": [ { (後略)
のように、応答が返ってきました。
なお、下記のページにあるように、
MFA 保護 API アクセスの設定 - AWS Identity and Access Management
- MFA に関する条件は、信頼する側(クロスアカウントされる側、または、引き受けられるロールを提供する側)で設定する
- 信頼される側のポリシーでは、MFA条件は設定しない
とするのがよいようです。
また、MFAに関する条件をいろいろと設定することもできるようです。下記などが参考になります。
AWS グローバル条件コンテキストキー - AWS Identity and Access Management
なにはともあれ、これでクロスアカウントアクセスがコンソールでもCLIでもできるようになったので、アカウント管理が(多少は)楽になりそうです。