

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Account Factory for Terraform を使用して複数のアカウントのアクセス許可セットを管理する
<a name="govern-permission-sets-aft"></a>

*Amazon Web Services、Anand Krishna Varanasi と Siamak Heshmati*

## 概要
<a name="govern-permission-sets-aft-summary"></a>

このパターンは、[AWS Control Tower Account Factory Terraform (AFT) ](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html)を と統合[AWS IAM アイデンティティセンター](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)して、複数の に対するアクセス許可を AWS アカウント 大規模に設定するのに役立ちます。このアプローチでは、カスタム AWS Lambda 関数を使用して、組織として管理 AWS アカウント される への[アクセス許可セット](https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsetsconcept.html)の割り当てを自動化します。これにより、プラットフォームエンジニアリングチームによる手動介入が必要なくなるため、プロセスが合理化されます。このソリューションでは、運用効率、セキュリティ、一貫性を高めることができます。これにより、 の安全で標準化されたオンボーディングプロセスが促進され AWS Control Tower、クラウドインフラストラクチャの俊敏性と信頼性を優先する企業にとって不可欠です。

## 前提条件と制限
<a name="govern-permission-sets-aft-prereqs"></a>

**前提条件**
+ AWS アカウント、 で管理されます AWS Control Tower。詳細については、[「 の開始方法 AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/getting-started-with-control-tower.html)」を参照してください。
+ Account Factory for Terraform が環境内の専用アカウントにデプロイされていること。詳細については、「[Deploy AWS Control Tower Account Factory for Terraform](https://docs.aws.amazon.com/controltower/latest/userguide/aft-getting-started.html)」を参照してください。
+ IAM アイデンティティセンターインスタンスが環境内でセットアップされていること。詳細については、「[Getting started with IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)」を参照してください。
+ アクティブな IAM アイデンティティセンター[グループ](https://docs.aws.amazon.com/singlesignon/latest/userguide/users-groups-provisioning.html#groups-concept)が設定されていること。 詳細については、「[Add groups to your IAM アイデンティティセンターディレクトリ](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)」を参照してください。
+ Python 3.9 以降がインストールされている

**制限事項**
+ このソリューションは、 AWS Control Towerを通じて管理されているアカウントでのみ使用できます。このソリューションは、Account Factory for Terraform を使用してデプロイされます。
+ このパターンには、ID ソースとの ID フェデレーションをセットアップする手順は含まれません。このセットアップを完了する方法の詳細については、IAM アイデンティティセンターのドキュメントの「[IAM Identity Center identity source tutorials](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)」を参照してください。

## アーキテクチャ
<a name="govern-permission-sets-aft-architecture"></a>

**AFT の概要**

AFT は、 AWS Control Towerでアカウントのプロビジョニングとカスタマイズを支援する Terraform パイプラインをセットアップします。AFT は、アカウントプロビジョニングのプロセスを自動化する GitOps モデルに従います AWS Control Tower。*アカウントリクエストの Terraform ファイル*を作成し、それをリポジトリにコミットします。これにより、アカウントプロビジョニングのための AFT ワークフローが開始されます。アカウントプロビジョニングが完了すると、AFT は追加のカスタマイズ手順を自動的に実行できます。詳細については、 AWS Control Tower ドキュメントの[「AFT アーキテクチャ](https://docs.aws.amazon.com/controltower/latest/userguide/aft-architecture.html)」を参照してください。

AFT には、次のメインリポジトリが用意されています。
+ `aft-account-request` – このリポジトリには、 AWS アカウントを作成または更新するための Terraform コードが格納されています。
+ `aft-account-customizations` – このリポジトリには、アカウントごとにリソースを作成またはカスタマイズするための Terraform コードが格納されています。
+ `aft-global-customizations` – このリポジトリには、すべてのアカウントのリソースを大規模に作成またはカスタマイズするための Terraform コードが格納されています。
+ `aft-account-provisioning-customizations` – このリポジトリは、AFT によって作成され、管理される特定のアカウントにのみ適用されるカスタマイズを管理します。例えば、このリポジトリを使用して、IAM アイデンティティセンターでユーザーまたはグループの割り当てをカスタマイズしたり、アカウント閉鎖を自動化したりできます。

**ソリューションの概要**

このカスタムソリューションには、 AWS Step Functions ステートマシンと、複数のアカウントのユーザーとグループに権限セットを割り当てる AWS Lambda 関数が含まれています。このパターンでデプロイされたステートマシンは、既存の AFT `aft_account_provisioning_customizations` ステートマシンと一緒に動作します。ユーザーは、新しい AWS アカウント の作成時またはアカウントの作成後に、IAM Identity Center のユーザーとグループの割り当てを更新するリクエストを送信します。そのために、`aft-account-request` リポジトリの変更をプッシュします。アカウントの作成または更新のリクエストを送信すると、[Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) でストリームが開始されます。これにより、ターゲットの IAM Identity Center ユーザーとグループを更新する Lambda 関数が開始されます AWS アカウント。

以下に示すのは、ターゲットユーザーとグループへのアクセス許可セットの割り当てのために Lambda 関数で指定できるパラメータの例です。

```
custom_fields = {
    "InstanceArn"         = "<Organization ID>",
    "PermissionSetArn"    = "<Permission set ARN>",
    "PrincipalId"         = "<Principal ID>",
  }
```

このステートメントのパラメータは次のとおりです。
+ `InstanceArn` - 組織の Amazon リソースネーム (ARN)
+ `PermissionSetArn` - アクセス許可セットの ARN
+ `PrincipalId` - アクセス許可セットが適用される IAM アイデンティティセンターのユーザーまたはグループの識別子

**注記**  
このソリューションを実行する前に、ターゲットのアクセス許可セット、ユーザー、グループを作成する必要があります。

`InstanceArn` 値は一定とする必要がありますが、Lambda 関数は、複数のターゲット ID に複数のアクセス許可セットを割り当てるように変更することができます。アクセス許可セットのパラメータは `PermissionSetArn` で終わる必要があり、ユーザーとグループのパラメータは `PrincipalId` で終わる必要があります。両方の属性を定義する必要があります。以下に、複数のアクセス許可セットとターゲットユーザーおよびグループを定義する方法の例を示します。

```
custom_fields = {
    "InstanceArn"                    = "<Organization ID>",
    "AdminAccessPermissionSetArn"    = "<Admin privileges permission set ARN>",
    "AdminAccessPrincipalId"         = "<Admin principal ID>",
    "ReadOnlyAccessPermissionSetArn" = "<Read-only privileges permission set ARN>",
    "ReadOnlyAccessPrincipalId"      = "<Read-only principal ID>",
  }
```

次の図は、ソリューションがターゲット内のユーザーとグループのアクセス許可セットを AWS アカウント 大規模に更新する方法のstep-by-stepのワークフローを示しています。ユーザーがアカウント作成リクエストを開始すると、AFT は `aft-account-provisioning-framework` Step Functions ステートマシンを起動します。このステートマシンは `extract-alternate-sso` Lambda 関数を開始します。Lambda 関数は、ターゲット内のユーザーとグループに権限セットを割り当てます AWS アカウント。これらのユーザーまたはグループは、IAM アイデンティティセンターで設定された任意の ID ソースから取得できます。ID ソースの例としては、Okta、Active Directory、Ping Identity などがあります。

![\[アカウントが作成または更新されたときのアクセス許可セットの更新ワークフロー。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/14751255-3781-48db-a6b7-1a03e28c1020/images/d1de252d-8ac9-4f7d-a559-4ab3e852f325.png)


この図に、新しいアカウントが作成されたときの次のワークフローを示します。

1. ユーザーが `aft-account-request` リポジトリに `custom_fields` 変更をプッシュします。

1. AWS CodePipeline は、ユーザー定義メタデータを `aft-request-audit` Amazon DynamoDB テーブルに記録する AWS CodeBuild ジョブを開始します。このテーブルには、ユーザー定義メタデータを記録する属性があります。`ddb_event_name` 属性では、AFT オペレーションのタイプを定義します。
   + 値が の場合`INSERT`、ソリューションは新しい AWS アカウント の作成時にターゲット ID に設定されたアクセス許可を割り当てます。
   + 値が の場合`UPDATE`、ソリューションは の作成後にターゲット ID に設定されたアクセス許可を割り当て AWS アカウント ます。

1. Amazon DynamoDB Streams が `aft_alternate_sso_extract` Lambda 関数を開始します。

1. `aft_alternate_sso_extract` Lambda 関数は、 AWS Control Tower 管理アカウントで AWS Identity and Access Management (IAM) ロールを引き受けます。

1. Lambda 関数は、IAM アイデンティティセンターに an AWS SDK for Python (Boto3) [create\$1account\$1assignment](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sso-admin/client/create_account_assignment.html) API コールを実行して、アクセス許可セットをターゲットユーザーとグループに割り当てます。`aft-request-audit` Amazon DynamoDB テーブルからアクセス許可セットと ID の割り当てを取得します。

1. Step Functions ワークフローが完了すると、アクセス許可セットがターゲット ID に割り当てられます。

**自動化とスケール**

AFT は、スケーラビリティの高い CodePipeline、 AWS CodeBuild、DynamoDB、Lambda AWS のサービス などを使用して大規模に動作します。さらなる自動化のために、このソリューションを Jira などのチケットまたは問題管理システムと統合できます。詳細については、このパターンの「[追加情報](#govern-permission-sets-aft-additional)」セクションを参照してください。

## ツール
<a name="govern-permission-sets-aft-tools"></a>

**AWS のサービス**
+ [Account Factory for Terraform (AFT)](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html) は、このソリューションの主要なツールです。`aft-account-provisioning-customizations` リポジトリには、カスタム IAM Identity Center ユーザーやグループの割り当てなど AWS アカウント、 のカスタマイズを作成するための Terraform コードが含まれています。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) は、 AWS Lambda 関数と他の を組み合わせてビジネスクリティカルなアプリケーション AWS のサービス を構築するのに役立つサーバーレスオーケストレーションサービスです。

**その他のツール**
+ 「[Python](https://www.python.org/)」は汎用のコンピュータプログラミング言語です。
+ 「[Terraform](https://www.terraform.io/)」は、HashiCorp の infrastructure as code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。

**コードリポジトリ**

AFT のコードリポジトリは、GitHub の [AWS Control Tower Account Factory for Terraform](https://github.com/aws-ia/terraform-aws-control_tower_account_factory) リポジトリで入手できます。このパターンのコードは、[Account Factory for Terraform (AFT) リポジトリ AWS アカウント を使用するための SSO 割り当ての管理](https://github.com/aws-samples/aft-custom-sso-assignment)で使用できます。

## ベストプラクティス
<a name="govern-permission-sets-aft-best-practices"></a>
+ [AWS 責任共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)を理解します。
+ のセキュリティに関する推奨事項に従ってください AWS Control Tower。詳細については、[「 のセキュリティ AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/security.html)」を参照してください。
+ 最小権限の原則に従います。詳細については、「[最小特権アクセス許可を適用する](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)」を参照してください。
+ グループとビジネスユニット向けに、特定の焦点を絞ったアクセス許可セットと IAM ロールを構築します。

## エピック
<a name="govern-permission-sets-aft-epics"></a>

### 解決策をデプロイする
<a name="deploy-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| IAM ロールを作成します。 |  AWS Control Tower 管理アカウントで、Terraform を使用して IAM ロールを作成します。このロールは、クロスアカウントアクセスと、ID プロバイダーからのフェデレーションアクセスを許可する信頼ポリシーを備えています。また、 を介して他の アカウントへのアクセスを許可するアクセス許可も付与されます AWS Control Tower。Lambda 関数がこのロールを引き受けます。以下の操作を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps、クラウドアーキテクト | 
| 環境に合わせてソリューションをカスタマイズします。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps、クラウドアーキテクト | 
| ソリューションのデプロイ | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps、クラウドアーキテクト | 
| コードリポジトリ接続をセットアップします。 | 設定ファイルを保存するコードリポジトリと 間の接続を設定します AWS アカウント。手順については、 AWS CodePipeline ドキュメントの[CodeConnections を使用してパイプラインにサードパーティーのソースプロバイダーを追加する](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-connections.html)」を参照してください。 | AWS DevOps、クラウドアーキテクト | 

### ソリューションを使用する
<a name="use-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AFT パイプラインを開始して新しいアカウントをデプロイします。 |  AWS Control Tower 環境に[新しい を作成するパイプラインを開始するには、「AFT を使用して新しいアカウントをプロビジョニング](https://docs.aws.amazon.com/controltower/latest/userguide/aft-provision-account.html)する AWS アカウント 」の手順に従います。アカウントの作成プロセスが完了するのを待機します。 | AWS DevOps、クラウドアーキテクト | 
| 変更を検証します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps、クラウドアーキテクト | 

## トラブルシューティング
<a name="govern-permission-sets-aft-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| アクセス許可セットの割り当てが機能しません。 | グループ ARN、組織 ID、Lambda パラメータが正しいことを確認します。例については、このパターンの「*ソリューションの概要*」セクションを参照してください。 | 
| リポジトリ内のコードを更新しても、パイプラインが開始されません。 | この問題は、 AWS アカウント と リポジトリ間の接続に関連しています。で AWS マネジメントコンソール、接続がアクティブであることを確認します。詳細については、 AWS CodePipeline ドキュメントの[GitHub 接続](https://docs.aws.amazon.com/codepipeline/latest/userguide/connections-github.html)」を参照してください。 | 

## 追加情報
<a name="govern-permission-sets-aft-additional"></a>

**チケット管理ツールとの統合**

このソリューションを Jira や ServiceNow などのチケットまたは問題管理ツールと統合することを選択できます。次の図に、このオプションのワークフロー例を示します。チケット管理ツールと AFT ソリューションリポジトリを統合するには、ツールのコネクタを使用します。Jira コネクタについては、「[Integrate Jira with GitHub](https://support.atlassian.com/jira-cloud-administration/docs/integrate-jira-software-with-github/)」を参照してください。ServiceNow コネクタについては、「[Integrating with GitHub](https://www.servicenow.com/docs/bundle/washingtondc-it-asset-management/page/product/software-asset-management2/concept/integrate-with-github.html)」を参照してください。プルリクエストの承認の一環としてユーザーにチケット ID の提供を求めるカスタムソリューションを構築することもできます。AFT AWS アカウント を使用して新しい を作成するリクエストが承認された場合、そのイベントは `aft-account-request` GitHub リポジトリにカスタムフィールドを追加するワークフローを開始できます。ユースケースの要件を満たすカスタムワークフローを設計できます。

![\[GitHub Actions とチケット管理ツールを使用するワークフロー。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/14751255-3781-48db-a6b7-1a03e28c1020/images/83763f65-32ea-4de0-932f-14a1b2d1d3ad.png)


この図表は、次のワークフローを示しています:

1. ユーザーが、Jira などのチケット管理ツールでカスタムアクセス許可セットの割り当てをリクエストします。

1. ケースが承認されると、アクセス許可セットの割り当てを更新するワークフローが開始されます。(オプション) このステップのカスタム自動化に向けたプラグインを使用できます。

1. オペレーターが、`aft-account-request` リポジトリへの更新済みのアクセス許可セットパラメータを含む Terraform コードを develop ブランチまたは feature ブランチに送信します。

1. GitHub Actions は、OpenID Connect (OIDC) 呼び出しを使用して開始 AWS CodeBuild します。CodeBuild は、[tfsec](https://aquasecurity.github.io/tfsec/v1.20.0/) や [checkov](https://www.checkov.io/) などのツールを使用して、Infrastructure as Code (IaC) セキュリティスキャンを実行します。セキュリティ違反があれば、オペレーターに警告します。

1. 違反が検出されない場合、GitHub Actions は自動プルリクエストを作成し、コード所有者にコードレビューを割り当てます。また、プルリクエストのタグも作成します。

1. コード所有者がコードレビューを承認すると、別の GitHub Actions ワークフローが開始されます。以下を含むプルリクエストの基準がチェックされます。
   + プルリクエストのタイトルが要件を満たしているかどうか。
   + プルリクエスト本文に承認済みのケース番号が含まれているかどうか。
   + プルリクエストに適切にタグが付けられているかどうか。

1. プルリクエストが基準を満たしている場合、GitHub Actions は AFT 製品ワークフローを開始します。を使用して`ct-aft-account-request`パイプラインが開始されます AWS CodePipeline。このパイプラインは Step Functions で `aft-account-provisioning-framework` カスタムステートマシンを起動します。このステートマシンは、本パターンの「*ソリューションの概要*」セクションで説明したとおりに動作します。