AWS CLIで簡単にAssumeRole(スイッチロール)

記事タイトルとURLをコピーする

マネジメントコンソールでスイッチロールができることは、皆さまご存知と思います。 IAM Userにsts:AssumeRoleの権限を与えることで、IAM Roleの権限を引き受けることができます。

AWS CLIでも、もちろん同じことができます。

1. credentialsファイルの編集

ファイル「~/.aws/credentials」が無ければ作成し、以下のように記述(追記)する。

[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

※自分のIAM Userのクレデンシャルを記載

2. configファイルの編集

ファイル「~/.aws/config」が無ければ作成し、以下のように記述(追記)する。

[profile tempsession]
role_arn = <引き受けるIAMロールのARNを記載>
source_profile = default

※tempsessionはプロファイル名であり任意
※source_profile = 以降の内容は、元となるプロファイル名(「~/.aws/credentials」に記述されているもの)なのでdefault以外を指定も可

3. CLI実行

AssumeRoleしてAWS CLIを実行したいときは以下のように--profileオプションをつけて実行する。

aws s3 ls s3://bucketname --profile tempsession 
#もしくは
aws --profile tempsession s3 ls s3://bucketname

あるいは環境変数AWS_DEFAULT_PROFILEを設定すれば、毎回--profileオプションを設定しなくてもよい

export AWS_DEFAULT_PROFILE=tempsession
aws s3 ls s3://bucketname

4. Role側でMFAを必須としている場合

AssumeRole 先 IAM Role の信頼関係ポリシーで、Condition句を下記のように設定することで MFA を使っている場合だけ AssumeRole を許可するように設定できます。
IAM Roleがこのように設定してある場合には AWS CLI での AssumeRole 時にも MFA を用いる必要があります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}

こういった信頼関係ポリシーが設定された IAM Role はマネジメントコンソールで下記のように表示されます。

f:id:swx-yuma-sugimura:20200815131636p:plain
AssumeRoleされるときにMFAが必須なIAM Role

このような IAM Role を AssumeRole するには ファイル「~/.aws/config」の profile ブロックに下記のように mfa_serial という設定値を追記します。

[profile tempsession]
role_arn = <引き受けるIAMロールのARNを記載>
source_profile = default
mfa_serial = <MFAデバイスのARNを記載>

MFA デバイスの ARN は IAM マネジメントコンソールの以下の画面で確認できます。
(IAM Userの所属するAWSアカウントにて自分の IAM User を選択し「認証情報」タブ)

f:id:swx-yuma-sugimura:20200815131727p:plain
MFAデバイスのARNの確認

profile に mfa_serial 値を設定しておけば AWS CLI の実行時に MFA のワンタイムトークン(OTP)を聞かれます。 一度 OTP を入力して認証してしまえば、IAM Role に設定してある最大セッション時間の間は、再度 OTP を聞かれることはありません。

杉村 勇馬 (記事一覧)

クラウドインテグレーション部 技術3課 課長

マルチAWSアカウント管理運用やネットワーク関係のAWSサービスに関するブログをよく書いています

2020年10月現在、ハマっているものはポケモン ソード(遅い)