🖥️

AWS CLI のいろんな認証方式

2023/01/04に公開

はじめに

AWS CLI を使用する場合、接続先の AWS アカウントに対して認証を行う必要があります。この認証方式には以下のような条件により複数のパターンが存在しており、覚えるのが少しめんどうです。

  • MFA の要否
  • スイッチロールの要否
  • IAM ユーザー Or AWS IAM Identity Center(旧 AWS SSO)を使用した SSO ユーザー

毎回設定方法を調べるのがツラくなってきたので、よく使用するパターンをまとめておこうと思います。なお、MFA を有効化していない環境はさすがにもう見なくなったので省略します。まだ MFA を有効化していない方はいますぐ設定しましょう👍

認証パターン別 AWS CLI プロファイル設定方法

比較的よく採用される認証パターンについて、AWS CLI の名前付きプロファイル設定とコマンド実行のサンプルをまじえて紹介します。

IAM ユーザー + MFA

MFA を強制する IAM ポリシーをアタッチされた IAM ユーザーに直接ログインするパターンです。

実は AWS CLI はこのパターンをきちんとサポートしていません。このパターンで AWS CLI を使用する場合は、一時クレデンシャルを払い出す必要があります。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/

一時クレデンシャルの有効期限は最長で 36 時間です(デフォルトは 12 時間)。そのため、だいたい 1 日のはじめに「一時クレデンシャル払出し」→「環境変数などに設定」を行う必要があります。AWS アカウントが複数あればその数だけこの作業が必要です。

~/.aws/config
[profile profile1]
region = ap-northeast-1
output = json
~/.aws/credentials
[profile1]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ aws sts get-session-token --profile profile1 --serial-number arn:aws:iam::123456789012:mfa/devicename --token-code 123456
{
    "Credentials": {
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
        "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE",
        "Expiration": "2020-05-19T18:06:10+00:00"
    }
}
$ export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
$ export AWS_SESSION_TOKEN=AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE

毎回一時クレデンシャルを設定するのはめんどうくさいので、多くの人が OSS に頼ったりスクリプトを作成するなどして自動化を試みているようです。
ちなみに個人的におすすめのツールは boltops-tools / aws-mfa-secure です。非常によくできたツールですのでぜひ使ってみてください。

https://github.com/boltops-tools/aws-mfa-secure

IAM ユーザー + MFA + スイッチロール

IAM ユーザーにログインした後、スイッチロールすることで必要な権限を取得するパターンです。

このパターンでは、ログインする IAM ユーザーとログイン後にスイッチするロールのそれぞれに対して名前付きプロファイルを作成します。スイッチロール用のプロファイルには source_profile を設定し、ロールを引き受ける IAM ユーザー用のプロファイルを指定します。
また、このパターンは MFA に対応しています。mfa_serial に MFA デバイスの ARN を指定しておくと、コマンド実行時に OTP を要求されます。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html#cli-configure-role-mfa

~/.aws/config
[profile profile1]
source_profile = profile2
mfa_serial = arn:aws:iam::123456789012:mfa/devicename
role_arn= arn:aws:iam::123456789012:role/rolename

[profile profile2]
region = ap-northeast-1
output = json
~/.aws/credentials
[profile2]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ aws iam list-users --profile profile1
Enter MFA code for arn:aws:iam::123456789012:mfa/devicename: 123456
{
    "Users": [
        {

SSO ユーザー

AWS IAM Identity Center で複数の AWS アカウントに対するアクセス権限を一元的に管理するパターンです。

AWS IAM Identity Center を使用する場合はログインプロセスが少し面倒です。以下の流れで行います。

  1. 名前付きプロファイルを設定する(~/.aws/config~/.aws/credentials
  2. aws sso loginコマンドを実行し、認証用の URL とコードを払い出す。
  3. ブラウザで認証用の URL を開いて、SSO ユーザーにログインする
  4. 認証リクエストを承認する

これでやっと AWS CLI の使用を開始できます。
なお、↑ のとおり、SSO ユーザーに対する認証はブラウザで行います。この手順はマネジメントコンソールにログインする手順と同じです。MFA を有効化している場合は、この時に OTP を入力します。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sso.html

~/.aws/config
[profile profile1]
sso_start_url = https://my-sso-portal.awsapps.com/start/
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = readOnly
region = ap-northeast-1
output = json
$ aws sso login --profile profile1
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://device.sso.us-east-1.amazonaws.com/

Then enter the code:

QCFK-N451
Successfully logged into Start URL: https://my-sso-portal.awsapps.com/start/

$ aws iam list-users --profile profile1
{
    "Users": [
        {

SSO ユーザー + スイッチロール

AWS IAM Identity Center で Jump アカウントにログインし、その後別の AWS アカウントにスイッチロールパターンです。

aws sso loginコマンドを実行する際に指定するプロファイルと、ログインに成功した後、通常のコマンドを実行する際に指定するプロファイルが異なる点にだけ注意です。

~/.aws/config
[profile profile1]
source_profile = profile2
role_arn = arn:aws:iam::123456789012:role/rolename
region = ap-northeast-1
output = json

[profile profile2]
sso_start_url = https://my-sso-portal.awsapps.com/start/
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = readOnly
$ aws sso login --profile profile2
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://device.sso.us-east-1.amazonaws.com/

Then enter the code:

QCFK-N451
Successfully logged into Start URL: https://my-sso-portal.awsapps.com/start/

$ aws iam list-users --profile profile1
{
    "Users": [
        {

おわりに

今年から少しずつアウトプットを増やしていきたいと思って Zenn をはじめました。基本的には自分用のメモですが、どなたかのお役に立てば幸いです🙇‍♂️
ちなみに、(あたり前ですが)本記事に記載されているアクセスキーなどはサンプルです。AWS の公式ドキュメントから引用しています。この手の情報をインターネットに公開するときは、うっかり本当のアクセスキーをのっけてしまわないよう気をつけましょう。

Discussion