☁️

AWS AmplifyでIAM Identity Center(AWS SSO)を使用する方法

2023/08/04に公開

1. はじめに

Amplifyの認証情報をIAM Identity Center(AWS SSO)経由で取得する時に苦労したので、手順をまとめます。 未検証ですが、CDKでも同じ方法でいけると思います。

IAM Identity Centerは以前はAWS SSOと呼ばれていたもので名前だけ変わりました(CLIのコマンドは今でもaws ssoです)。

aws-sso-util という3rd Partyのパッケージを使う方法はすでに下記記事でまとめて頂いていますが、AWS CLI v2からはaws ssoコマンドが追加され、必須ではなくなりました。
セキュリティの観点からできるだけパッケージの追加をしたくなかったため、AWS CLI v2だけで設定する方法を試しました。
https://zenn.dev/pantone170145/articles/aws-amplify-use-sso-account

2. 事前準備

  • OrganizationsとIAM Identity Centerの有効化
  • AWS CLI v2の"最新版"のインストール
    • バージョンが古いと作成されるProfileが異なり、うまく動かないので最新版にしてください。

3. AWS IAM Identity Centerを使う理由

AWSは用途ごとにAWSアカウント自体を分離するマルチアカウント構成を推奨しています。
https://aws.amazon.com/jp/builders-flash/202007/multi-accounts-best-practice/?awsf.filter-name=*all

複数のアカウントに共通の認証情報でログインするためにAWS IAM Identity Center(AWS SSO)が使われます。

Amplify用のIAM Userをアカウントごとに作成してアクセスキー経由で認証する方法もありますが、アクセスキーは永続的なであり、流出した時のリスクが高いです。
一方で、IAM Identity Centerでは認証する度に一時的なクレデンシャルが発行されるため、よりセキュアであり、IAM Identity Centerの方が推奨されています。

4. AWS IAM Identity Center(AWS SSO)の設定

ここから実際の設定をしていきます。
aws configure ssoを実行して、順番に質問に答えていきます。

$ aws configure sso 
SSO session name (Recommended): dev-session
SSO start URL [None]: https://XXXXXX.awsapps.com/start#/ 
SSO region [None]: us-east-1
SSO registration scopes [sso:account:access]:
Using the account ID: XXXXXXXXXXXX
Using the role name "AdministratorAccess"
CLI default client Region [None]: ap-northeast-1
CLI default output format [None]: json
CLI profile name [AdministratorAccess-XXXXXXXXXXXX]: dev
  • SSO session name: 任意の名前をつけてください。上ではdev-sessionとしています。
  • SSO start URL: XXXXXXを自身のSSOのログインURLに置き換え
  • SSO region: AWS IAM Identity Centerが有効化されているリージョンです。 CLIのデフォルトリージョンではない点に注意(こちらは後で設定します)
  • CLI default client Region: CLIで--regionオプションをつけない時にデフォルトで設定されるリージョンです。
  • CLI profile name: 任意の名前をつけてください。デフォルトはIAM Role名+アカウントIDです。

これで~/.aws/configにprofileとsso-sessionという項目ができています。 ~/.aws/credentialsには何も保存されていないため、永続的なクレデンシャルが設定されていないことが分かります。

[profile dev]
sso_session = dev-session
sso_account_id = XXXXXXXXXXXX
sso_role_name = AdministratorAccess
region = ap-northeast-1

[sso-session dev-session]
sso_start_url = https://X-YYYYYYYYYY.awsapps.com/start#/
sso_region = us-east-1
sso_registration_scopes = sso:account:access

これでIAM Identity Centerでログインする設定ができました。
ただし、このままだとprofileかsso-sessionをAmplifyで使おうとするとaccessKeyIdがないというエラーが発生します。

$ amplify init
...
? Select the authentication method you want to use: AWS profile
? Please choose the profile you want to use dev
🛑 Failed to get profile credentials
Cannot read properties of undefined (reading 'accessKeyId')

そのため、Amplify用のProfileをさらに追加します。
~/.aws/configの末尾に下記を追加します。
Profile名は任意、--profileは上記で作成したProfile名を指定してください。

[profile amplify-dev]
credential_process = aws configure export-credentials --profile dev
region = ap-northeast-1

credential_processの内容を実行してみるとAccessKeyIdSecretAccessKeyがレスポンスで返ってきます。 このProfileを選ぶと毎回裏側でクレデンシャルが出力され、ログインできるという仕組みのようです。
詳細はAWSのドキュメントに記載があります。

 aws configure export-credentials --profile dev
{
  "Version": 1,
  "AccessKeyId": "XXXXXXXXXXXXXXXXXXXX",
  "SecretAccessKey": "YYYYYYYYYYYYYYYYYYYYYYYYY",
  "SessionToken": "ZZZZZZZZZZZZZZZZZZZZZZZ",
  "Expiration": "2023-08-04T16:25:28+00:00"
}

5. AWS AmplifyでのSSOの設定

後は、aws sso login --profile devで認証した後、amplify initでの初期化時にProfile amplify-devを指定すればOKです。
しばらくすると自動的にログアウトされるので、再開時に下記のエラーが出た場合は再度aws sso login --profile devを実行してログインしなおします。

🛑 Failed to get profile credentials
credential_process returned error

6. まとめ

AWS CLI v2のみを使用して、AWS IAM Identity Center(AWS SSO)をAmplifyで使用する方法を紹介しました。

Discussion