【AWS】ひとりでもOrganizationsを使うと便利で勉強になる話(AWS SSOの始め方を手厚く)

# はじめに
NTTテクノクロスの三井一能です。NTTテクノクロス Advent Calendar 2021の初日の記事です。

# 何についての紹介か？
AWSが大好きなみなさんは、きっと個人でも検証用にAWSアカウントを所有していると思います。個人であれば一つ持っていることがほとんどなのではないでしょうか。AWSには、マルチアカウント管理向けに、AWS Organizations(以下、Organizationsと表記)という機能があります。でもアカウントが一つだけなので、自分には関係ないと思っていたりしませんか？
この記事では、アカウント一つでもOrganizationsを組む(ひとりでもオーガニと個人的に呼んでいます)ことで便利だよ、ということを伝えたいと思います。
記事の後半では、ハンズオンでAWS SSOを構築、動作確認していきます。スクリーンショット多めですが、この記事の内容だけで最後まで辿りつけるようにしたつもりです。

* 構築するサービス： AWS Organizations、AWS SSO
* 所要時間： 1時間ぐらい
* コストの目安： 無料

# AWS Organizationsとは

AWS Organizationsは、複数のアカウントを統合的に管理できるAWSのサービスです。Organizationsを構成することで、次のようなメリットを導入することができます。

請求の一元化

* 組織全体のAWSアカウントの請求を代表アカウント(マネジメントアカウント)に一元化できる

アカウント作成の自動化

* AWSアカウントの新規作成で、カード情報、連絡先の入力が不要となるため、CLIを使った自動化が可能になる

アカウントの集中管理

* AWS SSOを使ったAWSアカウントアクセスの一元化と簡素化を図れる
* AWSアカウントをグループ化してポリシーを適用し、利用サービスを制限できる
* AWSの他サービスと連携させることにより、システム環境を一元的に保護できる(Backup, Config, Security Hub, GuardDuty, CloudTrail)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/3fd87d98-6b71-47b2-8079-f25936bcc626.png)

# ひとりでもオーガニとは？

一つのAWSアカウントでOrganizationsを利用する構成のことです(自称)。Organizationsを導入することでメリットを享受することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/da64d9c4-70e4-6c56-5726-6a54485040ec.png)

### AWS SSOが利用できること(いちばんのメリット)

AWSアカウントにはどのようにアクセスしていますか？まさか rootアカウントで使っている人はいないと思いますが、通常はIAMユーザ でログインしていると思います。適切な権限で作業するために、スイッチロールを使うわけですが、面倒ではないでしょうか。

https://blog.serverworks.co.jp/tech/2020/05/21/aws-tutorial-access-management/

AWS SSO は、1回のサインインで、Organizations内のAWSアカウントへの権限アクセスを容易にしてくれるサービスです。言い換えると、上のスイッチロールの面倒さを意識せずに、適切な権限でAWSアカウントにアクセスすることができるのです。また、一時クレデンシャルもAWS SSOが発行してくれるので、長期クレデンシャルが必要なければIAMユーザーは不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/49071688-70cc-004c-eb8c-30668455bbfc.png)

### セキュリティガバナンスの仕組みを導入できる(学べる)
Organizations の機能であるサービスコントロールポリシー (SCP) を利用して、アカウントに対して使用可能な最大アクセス許可を設定することができます。具体的な例は次のサイトを参照してほしいですが、たとえば、AWSアカウントで使用するリージョンを東京(ap-northeath-1)と北部バージニア(us-east-1)に限定することができます。

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_examples_general.html

Security HubやGuardDuty はAWSアカウント単体で使うこともできますが、Organizationsで統括して管理することもできます。このあたりはマルチアカウント管理では必ず必要になってくるため、ひとりでもオーガニでも導入しておくと勉強になります。

https://dev.classmethod.jp/articles/security-hub-integrates-organizations/

https://dev.classmethod.jp/articles/organizations-guardduty-setup/

# この記事のゴール

この記事の後半では、ひとりでもオーガニ環境で、AWS SSOを導入し、マネジメントコンソールと、AWS CLI で操作ができるところまでの手順を紹介します。

# 対象とする読者

* AWS を 1アカウントから使い始めてマネジメントコンソールが使えるようになった初中級者の方
* OrganizationsやAWS SSOを使ったことがない方

# 準備するもの

この記事を見て、自分でもやってみようという方は、AWSアカウントを一つ用意してください。
また、AWS CLIによる動作確認をしたい場合は、AWS CLIバージョン2 をインストールした環境を準備してください。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

# AWS SSO用語の理解

AWS SSOを使用する場合、AWS SSOユーザーやアクセス権限セットという用語が出てきます。AWSアカウントのアクセス権限との関係を整理しておきましょう。

AWS SSOユーザー

* AWS SSOを利用する場合、利用者がサインインする対象です。複数のAWSアカウントを利用する場合もサインインはこの一回だけになります。

アクセス権限セット

* AWS SSO内で管理される権限のテンプレートです。AWS SSOユーザーがAWSアカウントのアクセスに利用するアクセス権限セットを選択すると、各AWSアカウントに対応するAWS SSO管理ロールが自動作成されます。一つのAWSにアカウントに対し複数のアクセス権限セットを選択することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/5eb4ee4b-b78c-13db-0e1b-227b60f67332.png)

# 構築

## Organizationsを作成する

AWSマネジメントコンソールを表示します。
Organizations のダッシュボードを表示し、「組織の作成する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/d9a885de-aaa0-4b79-5033-2db61cf84803.png)


組織のルート直下に、AWSアカウントが所属する形になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/6d82634c-9f8c-99f5-f3fa-5807a204cd77.png)


以上で、Organizationsの作成は完了です。

## AWS SSOを作成する

次にAWS SSOを作成していきます。
マネジメントコンソールでAWS SSOのダッシュボードを表示します。今回は東京リージョンにAWS SSOを作っていくため、リージョンが「東京」になっていることを確認してください。
「AWS SSOを有効にする」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/0285b4d4-841d-17e6-9547-b3b2f84b1d2d.png)


次のような画面が表示されます。画面下の「ユーザポータルのURL」は、あとでAWS SSOにアクセスする際に使用することを覚えておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/e32c3c3c-79bc-51d8-6ec4-220e3847e6a4.png)


# 設定

次に、AWS SSOを設定していきます。

## AWS SSOユーザーの作成

左メニューから「ユーザー」を選択し、「ユーザーを追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/1f7cda8e-b243-7177-7eec-95a457b152ba.png)


ユーザー情報を入力し、「次：グループ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/8bf1bb65-7394-f15d-eda0-348af876cc70.png)

今回はグループは作成しません。「ユーザーを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/6508c497-de93-21aa-726b-f1377c33b0bc.png)

マネジメントコンソールでの作業は以上です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/f8a38e7c-f0dc-3176-b1d7-8b85df24d829.png)

作成したユーザーに次のようなメールが届きます。「Accept invitation」をクリックして、パスワードを設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/5286f14f-d769-7206-be21-9fffc620b6a1.png)

## アクセス権限セットの作成

次は、アクセス権限セットを準備していきます。

左メニューの「AWSアカウント」を選択し、「アクセス権限セット」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/ceaeec0b-bef2-0bec-ae5b-5b79f0fe3d52.png)

「アクセス権限セットを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/dcfef3e4-d7a2-f8d7-3439-765faa635409.png)

アクセス権限セットの作成方法は、既存の事前定義済みの職務機能ポリシーから選択するか、独自のポリシーを作成するかを選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/5078714b-8e07-1be8-137e-ebdbb9f73489.png)

既存の事前定義済みの職務機能ポリシーとして、次のようなものが用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/773e87f6-68a9-c6fd-f77d-c7737f0d2c79.png)

ここでは、 `AdministratorAccess` と `ViewOnlyAccess` を選んでいきます。
まず、 `AdministratorAccess` から。 `AdministratorAccess` を選択し、「次：タグ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/55d09729-fca4-b4c0-f332-3f61d85faa69.png)

タグの追加は省略して、「次：確認」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/88029b2f-f13c-8eed-8574-b0975564e981.png)

詳細に表示されるセッション時間について補足します。この時間は、AWS SSOからこの権限でAWSアカウントにアクセスできる時間になります。デフォルトは1時間ですが、作成済みのアクセス権限の編集で、1時間から12時間の間で変更することができます。

「作成」をクリックし完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/eb4e87b2-e15e-0380-8f48-122efbcf40e7.png)

同じ要領で、 アクセス権限セット `ViewOnlyAccess` も作成します。

## アクセス権限セットをAWS SSOユーザーに割り当てる

今までに作成したAWS SSOユーザーとアクセス権限セット、AWSアカウントを関連付けます。

左メニューから「AWSアカウント」を選択し、アクセスしたいAWSアカウントをチェックし、「ユーザーの割り当て」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/6f8c3af8-91e6-b2a2-6dc7-a6930d0b9efd.png)

AWS SSOユーザーをチェックして、「次：アクセス権限セット」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/f971bfb5-8450-d538-a6cb-10efe5790751.png)

アクセス権限セット `AdministratorAccess` と `ViewOnlyAccess` をチェックし、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/cf6825c3-2ee2-3b15-d707-800be4607568.png)

左メニューの「AWSアカウント」を選択します。「Permission sets」 にAWSアカウントに割り当てられたアクセス権限セットが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/a7f7d07f-a216-ddfc-183f-76f88d235d26.png)

# 動作確認

## マネジメントコンソールアクセスに使用する

AWS SSO ユーザーポータルのURL(覚えていますか？)をWebブラウザで表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/414d28cb-741d-6c0f-ab95-22edce40397d.png)

「AWS account」、さらにAWSアカウントを選択すると、そのアカウントにアクセスできるアクセス権限セットの一覧が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/f6d1d812-dc87-fd26-1d48-5cab35a5c34a.png)

アクセス権限セットの右にある「Management console」をクリックすると、その権限でマネジメントコンソールにアクセスできます。アクセス権限が期待どおりか、 `ViewOnlyAccess` でアクセスしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/b2886617-6129-b3dc-5be0-dcd12015b519.png)

リードオンリーの権限しかないはずなので、たとえば S3 のバケットは作成できません。試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/4eb7c03e-ed23-e6b2-7a61-7ce31f891c12.png)

期待どおり、バケット作成に失敗しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/1e9fba30-ac3b-b40d-9cd9-473021b1b32e.png)

## AWS CLIに使用する

AWSアカウントにCLI でアクセスしたいという人もいると思います。AWS CLIバージョン2はAWS SSOに対応しています。
2種類の方法を紹介します。

### 一時クレデンシャルを環境変数で指定する

AWS SSO にサインインした画面で、アクセス権限セット `ViewOnlyAccess` の右に表示される「Command line or programmatic access」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/e5ffd5cf-fa97-689f-19d4-d31bb2c3735d.png)


AWS CLIの動作環境に合わせて、環境変数の設定コマンドをコピーします。今回はPowerShell を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/281d4372-592d-9589-9353-6e1895227410.png)


PowerShell を起動し、環境変数設定をペーストして実行します。

```
PS> $Env:AWS_ACCESS_KEY_ID="ASIXXXXXXXXXXXXXXXX" 
PS> $Env:AWS_SECRET_ACCESS_KEY="A0gXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
PS> $Env:AWS_SESSION_TOKEN="IQoJXXXXXX…..XXXXXXXXXXXXXXXXXXXXXXXXXXXX==" 
```

該当のアクセス権限セットは、`ViewOnlyAccess` なので、S3バケットは参照できますが、バケット作成・削除はできません。動作を確認してみましょう。

```
PS> aws s3 ls
2021-11-22 20:50:38 advent2021-santa-present

PS> aws s3 mb s3://advent2021-claus-present --region ap-northeast-1
make_bucket failed: s3://advent2021-claus-present An error occurred (AccessDenied) when calling the CreateBucket operation: Access Denied 
```

問題ないですね。

### AWS CLIのプロファイルを使用

AWS CLI バージョン2は、AWS SSOと連携して使用することができます。

AWS SSO用のプロファイルを作成します。

```
PS> aws configure sso
```

AWS SSOユーザーポータルのURLを入力します。

```
SSO start URL [None]: https://d-9XXXXXXXXX.awsapps.com/start
```

AWS SSOは、東京リージョンに作成したので、「ap-northeast-1」を入力します。

```
SSO Region [None]: ap-northeast-1
```

このあと、Webブラウザが起動し、AWS SSOユーザー認証が求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/228bf651-cd3a-3d8c-a91b-b1547c3a45b9.png)



次の画面が表示されたら、Webブラウザは閉じても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/62fac9ac-251a-eba0-72b0-1f47d460c18b.png)


アクセスするAWSアカウントを選択しますが、ひとりでもオーガニで一つしかないため、自動選択されました。

```
The only AWS account available to you is: 638XXXXXXXXX
Using the account ID 638XXXXXXXXX
```

次にアクセス権限セットを選択します。

```
There are 2 roles available to you.
Using the role name "ViewOnlyAccess"
```

あとは、AWS CLIのデフォルトのリージョン、出力フォーマットを入力します。

```
CLI default client Region [None]: ap-northeast-1
CLI default output format [None]: json
```

最後に、プロファイルの名前を入力します。

```
CLI profile name [ViewOnlyAccess-638XXXXXXXXX]: readonly
```

AWS CLIからの動作を確認しましょう。このアクセス権限セットは、参照権限しかないため、S3バケットは参照できますが、作成はできません。

```
PS> aws s3 ls --profile readonly
2021-11-22 20:50:39 advent2021-santa-present
PS> aws s3 mb s3://advent2021-claus-present --profile readonly
make_bucket failed: s3://advent2021-claus-present An error occurred (AccessDenied) when calling the CreateBucket operation: Access Denied
```
期待どおりに動作しています。

### セッション時間について

デフォルトのアクセス権限セットのセッション時間は1時間です。セッションが切れてしまった場合は次のようなメッセージが表示されます。

```
PS> aws s3 ls --profile readonly

The SSO session associated with this profile has expired or is otherwise invalid. To refresh this SSO session run aws sso login with the corresponding profile.
```

AWS CLIでSSOログインして、新しくセッションを開始してください。

```
PS> aws sso login --profile readonly
```

# ちょっとだけ仕組みをのぞく

AWS SSOのアクセス権限セットは、AWSアカウントに管理ロールを自動作成するという話をしました。確認してみましょう。

IAMダッシュボードで、IAMロールを表示してください。「AWSReservedSSO_」で始まるロール名が、AWS SSOがアクセス権限セットからAWSアカウントに対して自動作成したロールになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/0e8586ff-3783-b240-7b8a-2b593018f087.png)

ロール名をクリックしてみます。アクセス権限セットとロールの権限は同じであることを確認してください。AWS SSOからアクセス権限セットをクリックした場合、AWSアカウントに対してはこのロールの権限でアクセスしていることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/023fe4fc-8b49-0a18-5c48-2b8c93525bf5.png)

「信頼関係」を見てみます。ここでは、AWS SSOとIAMロールとの間で認証の連携が行われているんだな、ということだけ理解しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236603/a2db8583-9a79-56ed-6578-c0984b50db53.png)

# まとめ

この記事では、AWSアカウント一つの運用においても、Organizationsを使うことで、便利になったり、勉強になるということを紹介しました。AWS SSOを導入し、AWSアカウントへのアクセス権限の切り替えの方法を、マネジメントコンソールおよびAWS CLIで動作確認しました。
普段使いのAWSアカウントで、OrganizationsおよびAWS SSOを活用してみてください。

明日のNTTテクノクロス Advent Calendar 2021は、 @ea-yasuda による『リモート時代の「今どこにいるの？」をpythonで』に関する記事です。面白そうです。
お楽しみに！