AWS CLIを使用して、AWS IAM Identity Centerの認証情報を設定し、AWSの各種サービスにアクセスする手順
概要
AWS CLIからAWSサービスを操作する際、IAMユーザーのアクセスキーを使わずに、AWS IAM Identity Center(旧AWS Single Sign-On)を使うことで、安全にアクセスする手順をまとめました。
IAMユーザーのアクセスキーを使う方法は、有効期限などもないため漏洩したときのリスクが高く、ローテーションや失効の処理を適切に行う必要があるため、今は推奨されていないようです。
前提条件
・AWS CLI バージョン 2.22.0以降を前提としています。
・IAM Identity Center内でSSO認証へのアクセス権を既に持っていることを前提としています。
前提条件の詳細については以下のリンクに詳しく書いてあります。
レガシーな方法と推奨方法の違いについて
接続する前にまずは設定を行いますがポイントとして、レガシーに分類されている従来の方法ではプロファイルのみで設定を行なっていましたが、AWSが現在推奨している方法では新たにセッションという概念が追加されています。
従来は一つ一つのプロファイルに毎度IAM Identity Centerの情報を保存していましたが、推奨方法ではIAM Identity Centerの情報を、名前付きのセッションに保存しておき、プロファイルからそのセッション名を指定するやり方になっています。そのため複数のプロファイルで共通のセッションを再利用して使うことが可能になっています。今回はこちらの推奨方法をまとめていきます。
設定手順
aws configure sso
というコマンドで開始するウィザードでセッションとプロファイルを設定します。
aws configure sso-session
というコマンドもあるのですが、今回は使いません。こちらのコマンドはセッションだけを先に作成したり、既にあるセッションを更新する際に使うコマンドになります。
aws configure sso
というコマンドは、セッションとプロファイルを両方一度に作成・更新する際に使います。ではコマンドを実行してウィザードを開始します。
$ aws configure sso
1. セッション情報を入力する
まずは、セッション名を作成し、IAM Identity Centerの開始URL、または発行者URL、IAM Identity Center ディレクトリをホストするAWSリージョン、および登録スコープを指定します。
自分の組織のSSO start URLがわからない場合は、ブラウザからAWS access portalのページへアクセスして、そのページのURLを見るのがいいと思います。もしくはそのページにあるいずれかのAWSアカウントをクリックすると「アクセスキー」というリンクが出てくるのでクリックすると「SSO の開始 URL」という情報が出てくるので、そちらでもわかります。
SSO session name (Recommended): my-sso
SSO start URL [None]: https://{固有の値}.awsapps.com/start
SSO region [None]: ap-northeast-1
SSO registration scopes [sso:account:access]:
値を入力しながらエンターキーで進めていくとブラウザが起動し、以下のような画面が表示されます。
「アクセスを許可」をクリックして認証が完了すると以下のような画面が出てログイン済みになります。
2. AWSアカウントを選択する
使用する権限のあるアカウントが1つだけの場合はプロンプトがスキップされますが、複数ある場合は以下のようなリストが出てくるので1つを選択します。
There are 2 AWS accounts available to you.
> DeveloperAccount, developer-account-admin@example.com (123456789011)
ProductionAccount, production-account-admin@example.com (123456789022)
3. IAMロールを選択する
使用できるロールが1つしかない場合はプロンプトがスキップされますが、複数ある場合は以下のようなリストが出てくるので1つを選択します。
Using the account ID 123456789011
There are 2 roles available to you.
> ReadOnly
FullAccess
4. プロファイル情報を入力する
CLI default client Region [ap-northeast-1]:
CLI default output format [json]:
CLI profile name [123456789011_ReadOnly]: my-dev-profile
To use this profile, specify the profile name using --profile, as shown:
aws s3 ls --profile my-dev-profile
設定はこれで完了です。 my-dev-profile
というプロファイルと、 my-sso
というセッションが作成されました。 ~/.aws/config
ファイルを見てみると以下の記述が新たに追加されていることが確認できます。
[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = ReadOnly
region = ap-northeast-1
output = json
[sso-session my-sso]
sso_start_url = https://{固有の値}.awsapps.com/start
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access
ここからさらにプロダクション用に別のプロファイル「 my-prod-profile
」なども同じセッションで作成したいとなった場合は、手動で設定することもできます。以下に詳しく書かれていますのでここでは割愛します。
ログイン手順
設定直後は既にログインしている状態だと思いますが、有効期限が切れると、再度ログインすることが必要になるため、その手順です。方法は2通りあり、プロファイルを指定してログインする方法と、セッションを指定してログインする方法があります。特に記載はありませんがプロファイルを指定してログインする方法は、従来型との互換性のために残してあるのかなと個人的には思っており、セッションを指定してログインする方法は、従来型では使えません。普段使う時はセッションを指定する方法が自然な気がします。まぁ、プロファイルを指定するのに慣れてしまっているので、癖が消えるまでは違和感がありますが。
セッションを指定する方法
$ aws sso login --sso-session my-sso
プロファイルを指定する方法
$ aws sso login --profile my-dev-profile
AWS CLIで各種サービスにアクセス
設定とログインが終わりましたので、あとはいつも通りプロファイルを指定してAWS CLIコマンドを実行するだけです。
S3
$ aws s3 ls --profile my-dev-profile
EC2インスタンスに接続
$ aws ssm start-session --profile my-dev-profile --target {EC2インスタンスID}
EC2インスタンスを踏み台にしてAurora DB クラスターへのトンネリング
$ aws ssm start-session \
--profile my-dev-profile \
--target {EC2インスタンスID} \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters "portNumber={クラスターのポート},localPortNumber={ローカルのポート},host={クラスターエンドポイント}"
※ssmセッションが起動している間はlocalhost:{ローカルのポート}でDBに接続できます。
ログアウト手順
ログアウトのコマンドには、オプションは特になさそうで全てのセッション情報がローカルのキャッシュから削除されるようです。
$ aws sso logout
まとめ
IAMユーザーのアクセスキーを使わずにAWS CLIを実行する手順をまとめました。途中の各種サービスにアクセスする方法はアクセスキーを使った方法との違いはないので、最初の設定とログインだけが違うという雰囲気が伝わればいいかなと思って書きました。
Discussion