プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

クロスアカウントを CLI でも使う

こちらの記事で書いたリザーブドインスタンスの期限切れを通知する処理は、結局、 AWS コンソールで提供される機能を使うことになったため、不要になりました。

でも、この時クロスアカウントアクセスの設定方法が分かったので、複数アカウント管理を簡単にするために、これを活用しようと思います。

前述の記事を試す途中で、IAMユーザーでクロスアカウントアクセスするのは試したので、次は、CLIからクロスアカウントアクセスをやろうと思います。

これがうまくいけば、管理対象のアカウントの IAM ユーザーを削減できるので、楽になりそうです。

設定

下記の IAM のチュートリアルにあるやり方は、STS で一時クレデンシャルを取得して、そのたびに、環境変数を設定するという方法です。

チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任 - AWS Identity and Access Management

たぶん、まっとうな方法(先の記事中でAPI経由で扱う時はこれと同じですね)なんですが、毎回やるのはどう考えても面倒です。

で、いい方法ないかな?と調べてみると、ここの設定を自動でやってくれる書き方がありました。

これだと、一度設定ファイルを書いておけば、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でもできるようになったので、アカウント管理が(多少は)楽になりそうです。