ちょっと前に、Organizations+SSOで作ったマルチアカウント環境を使って、開発/ステージング/本番環境を同じCIDRにしてVPCでつなげるということをやりました。
で、同じ環境を手動で複数作るのは手間ですよね。できれば自動化したいですよね、ということで、Terraformでまるっと環境構築してみたいなと思うのですが、TerraformはSSOのプロファイルに対応していないそうです。そこでSSOのトークンを取得してくれた上でコマンドをラップして実行することになります。
上記ではaws2-wrapが紹介されているのですが、TerraformのSSOに関するissueのスレッドを追っかけていくとaws-vaultというのがあるのを知り、一番良さそうな感じがしたのでそれでやってみたいと思います。
事前準備
OrganizationsおよびSSOの設定も済ませてあることとします。
準備
aws-cliのインストール。v2を使います。homebrewで。
$ brew install awscli $ aws --version aws-cli/2.0.34 Python/3.8.5 Darwin/19.5.0 botocore/2.0.0dev38
SSOのプロファイルの作成
aws-cli v2ではAWS SSOに対応していますので、シングルサインオンすることでaws-cliの実行に必要な一時的なクレデンシャルを発行することが可能です。
最初にaws configure sso
でプロファイルを作成します。対話形式となりますので順に見ていきましょう。
$ aws configure sso
最初にSSOのユーザポータルのURLを設定します。
SSO start URL [None]: https://XXXXXXXXXXXX.awsapps.com/start
SSOを設定したリージョンを設定します。
SSO Region [None]: us-east-1
すると以下のようなメッセージが表示され、ブラウザが自動で起動します。ブラウザがうまく開かない場合は、以下メッセージにあるように手動でブラウザを開いてURLにアクセス、コードを入力することができるようです。
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: XXXX-XXXX
ブラウザが自動的に開きます。SSOのログイン画面が出てくるので、SSOのユーザアカウントでログインします。
CLIの認証が行われました。ブラウザを閉じてターミナルに戻ります。
ターミナルに戻ると、さきほどのSSOユーザアカウントに紐づいているAWSアカウントが一覧表示されます。プロファイルを作成したいAWSアカウントを選択します。
There are 4 AWS accounts available to you. > AWS shared, shared@example.com (XXXXXXXXXXXX) AWS production, production@example.com (YYYYYYYYYYYY) AWS Staging, staging@example.com (ZZZZZZZZZZZZ) AWS Development, development@example.com (AAAAAAAAAAAA)
ロール情報などもここで表示されます。
Using the account ID XXXXXXXXXXXX The only role available to you is: PowerUserAccess Using the role name "PowerUserAccess"
デフォルトのリージョンを設定します。
CLI default client Region [None]: ap-northeast-1
出力形式を設定します。
CLI default output format [None]: json
プロファイル名を設定します。どのアカウントになっているかを明示したほうがわかりやすいと思います。
CLI profile name [PowerUserAccess-XXXXXXXXXXXX]: shared
実際に使う場合は以下のように--profile プロファイル名
で使えば良いようです。
To use this profile, specify the profile name using --profile, as shown: aws s3 ls --profile shared
.aws/configを見ると以下のように新しいプロファイルが追加されています。
[profile shared] sso_start_url = https://XXXXXXXXXXXX.awsapps.com/start sso_region = us-east-1 sso_account_id = XXXXXXXXXXXX sso_role_name = PowerUserAccess region = ap-northeast-1 output = json
これを各AWSアカウント分繰り返します。
これで各AWSアカウントごとのプロファイルが作成されました。
aws-vaultのインストール
こちらもhomebrewでインストールできればいいのですが、caskに登録されているのはstableな5.4.4なので、SSOに対応しているのは6.0.0-beta5以上となっています。ということでこちらはgithubのreleaseから直接dmgを落としてきて手動で入れます。
$ wget https://github.com/99designs/aws-vault/releases/download/v6.0.0-beta5/aws-vault-darwin-amd64.dmg $ hdiutil mount aws-vault-darwin-amd64.dmg ...snip... /dev/disk5s1 41504653-0000-11AA-AA11-0030654 /Volumes/aws-vault $ cd /Volumes/aws-vault $ ls -lt total 30480 -rwxr-xr-x 1 xxxxx xxxxx 15601872 5 19 08:57 aws-vault $ cp aws-vault /usr/local/bin/.
では早速試してみましょう。SSOのプロファイルを指定して実行するには aws-vault exec プロファイル名 -- コマンド
で実行します。試しにaws-cliでVPCの一覧を取得するのをラップしてみます。
$ aws-vault exec development -- aws ec2 describe-vpcs Opening the SSO authorization page in your default browser (use Ctrl-C to abort) https://device.sso.us-east-1.amazonaws.com/?user_code=XXXX-XXXX
サイドブラウザが開きますので、ログイン&"Sign in to AWS CLI"をクリックします。
Macの場合、aws-vaultのクレデンシャルはkeychainに保存されます。初回はaws-vaultのクレデンシャルにアクセスするためのパスワードを設定する必要があります。
2回目以降は、クレデンシャルが期限切れになった場合にパスワードの入力を求められますので、最初に設定したパスワードを入力します。
CLIの認証が完了しました。ターミナルに戻ります。
{ "Vpcs": [ { "CidrBlock": "172.31.0.0/16", "DhcpOptionsId": "dopt-xxxxxxxx", "State": "available", "VpcId": "vpc-xxxxxxxx", "OwnerId": "XXXXXXXXXXXX", "InstanceTenancy": "default", "CidrBlockAssociationSet": [ { "AssociationId": "vpc-cidr-assoc-xxxxxxxx", "CidrBlock": "172.31.0.0/16", "CidrBlockState": { "State": "associated" } } ], "IsDefault": true } ] }
aws sso login --profile
を実行しなくてもaws-vaultでSSOのクレデンシャルを取得してaws-cliが実行できていますね。これで他のコマンドでも行けそうです。
Terraformはまた別途。