kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

AWS SSO環境でSSO対応していないコマンドをaws-vaultでラップする

ちょっと前に、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のユーザアカウントでログインします。

f:id:kun432:20200730152542p:plain

"Sign in to AWS CLI"をクリックします。

f:id:kun432:20200730152528p:plain

CLIの認証が行われました。ブラウザを閉じてターミナルに戻ります。

f:id:kun432:20200730173031p:plain

ターミナルに戻ると、さきほどの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-cliVPCの一覧を取得するのをラップしてみます。

$ 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"をクリックします。

f:id:kun432:20200730152528p:plain

Macの場合、aws-vaultのクレデンシャルはkeychainに保存されます。初回はaws-vaultのクレデンシャルにアクセスするためのパスワードを設定する必要があります。

f:id:kun432:20200730172747p:plain

2回目以降は、クレデンシャルが期限切れになった場合にパスワードの入力を求められますので、最初に設定したパスワードを入力します。

f:id:kun432:20200730172926p:plain

CLIの認証が完了しました。ターミナルに戻ります。

f:id:kun432:20200730173031p:plain

{
    "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はまた別途。