AWS SSOの設定

AWS ECR(Elastic Container Registry)のプライベートリポジトリにDockerイメージをプッシュするまでの手順を記録します。手順はAWS CLIのインストール、AWSアカウントの作成、IAM Identity Centerでユーザーの追加・設定、AWS SSOの設定、Amazon ECRでDockerイメージのプッシュに分けます。無料枠での利用を想定しています。

# 環境
- CentOS7
- Dockerはインストール済み

# 手順
1\. [AWS CLIのインストール](https://qiita.com/aomrikti/private/0908000f4aa58098c761)　
2\. [AWSアカウントの作成](https://qiita.com/aomrikti/private/0e63569eeade661cf7b6)
3\. [IAM Identity Centerでユーザーの追加・設定](https://qiita.com/aomrikti/private/389672d4900989d447ad)
4\. [AWS SSOの設定](https://qiita.com/aomrikti/private/0ebb0bda84d631cd6ea1)（本記事）
5\. [Amazon ECRでDockerイメージのプッシュ](https://qiita.com/aomrikti/private/241fad7126657439491e)

# AWS SSOの設定
### SSO（シングルサインオン）とは
>ユーザーが 1 回限りのユーザー認証で複数のアプリケーションやウェブサイトにログインできるようにする認証ソリューション

#### AWS IAM Identity Center credentialsを取得
- AWSアクセスポータルにログインする
    - AWSアクセスポータルのURLはパスワード設定で受け取るメール本文中に記載がある
- トップ画面から「Access keys」をクリックする
- 「Get Credentials for <許可セット名>」の画面が表示されるので、現在使用しているOSの種類をタブから選択する。本記事は「macOS and Linux」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/977bde9a-b1a1-4436-ac97-c6445a8b7c14.png" width=100%>

#### SSO認証情報の登録
- 下記コマンドを実行し、任意の「SSO session name」、「SSO start URL」、「SSO region」、「SSO registration scopes」を入力する
    - 「SSO start URL」と「SSO Region」は「Get Credentials for <許可セット名>」の「AWS IAM Identity Center credentials (Recommended)」配下の記載内容を写す
    - 「SSO registration Scopes」は本記事内容に該当する「Access IAM Identity Center managed accounts and permission sets」は「sso:account:access」を入力する。その他は記事下部「参考」の「Access Scope」のリンク先で調べる
    
```
$ aws configure sso
SSO session name (Recommended): <セッション名>
SSO start URL [None]: https://my-sso-portal.awsapps.com/start　# 「Get Credentials for PowerUserAccess」の「SSO start URL」の内容を入力
SSO region [None]: us-east-1  # 「Get Credentials for PowerUserAccess」の「SSO Region」の内容を入力
SSO registration scopes [None]: sso:account:access
```
- デフォルトのブラウザが開くので、表示されているコードを確認
- ターミナルで出力されたコードと同じことを確認し、「confirm and continue」をクリックする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/71d33e55-9ab2-69c9-f257-6b1851af7e39.png" width=50%>

```
...
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.ap-northeast-1.amazonaws.com/

Then enter the code:

ZMJR-GFFB
```

- 下記の画面が表示されるので「Allow access」をクリックする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/c63a61d2-1d3a-2ff7-17e5-312dfcbe8a37.png" width=100%>

- 下記の画面で「Request approved」のメッセージを確認し、画面を閉じる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570127/7a92e9b0-9be0-d9d1-b3d3-603d177cdd20.png" width=100%>

- ターミナルの出力に従い、「client Region」、「output format」、任意の「profile name」を入力する
    - 「client Region」：コマンド実行の対象とするリージョン
    - 「output format」：コマンド実行結果の出力形式（AWS CLIはjson/yaml/YAMLストリーム形式/text/tableをサポート）
```
CLI default client Region [None]: ap-northeast-1 
CLI default output format [None]: json
CLI profile name [PowerUserAccess-XXXXXXXX]: <任意のプロフィール名>
```

- 下記の出力が確認できれば、設定が完了したことが確認できる
```
To use this profile, specify the profile name using --profile, as shown:

aws s3 ls --profile <設定したプロフィール名>
```

- 入力した内容でconfigファイルが作成されているので、下記のコマンドで内容を確認する
```
$ cat ~/.aws/config
[profile <設定したプロフィール名>]
sso_session = <設定したssoセッション名>
sso_account_id = 123456789011
sso_role_name = readOnly
region = ap-northeast-1
output = json

[sso-session <設定したssoセッション名>]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access
```
#### ログインとログアウトを確認
- 下記のコマンドを実行し、ログインに進む
```
$ aws sso login --profile <設定したプロフィール名>
```
- デフォルトのブラウザが開き、コードが表示されるのでターミナルで出力されたコードと同じかを確認して「Confirm and continue」をクリックする
- ターミナルで「Successfully logged into Start URL」の表示が確認できればログイン完了

```
Successfully logged into Start URL: https:XXXXXXX.awsapps.com/start/#
```
- 下記のコマンドを実行し、ログアウトする
```
$ aws sso logout
```

# 参考
- SSOについて
https://aws.amazon.com/jp/what-is/sso/#:~:text=%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3%20(SSO)%20%E3%81%AF,%E3%81%AB%E3%81%99%E3%82%8B%E8%AA%8D%E8%A8%BC%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%99%E3%80%82

- SSOの設定について
https://docs.aws.amazon.com/cli/latest/userguide/sso-configure-profile-token.html

- Access Scopeについて
https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#oidc-concept

- Output formatについて
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-output-format.html