

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

# AWS CodePipeline と Amazon Bedrock を使用して AWS Organizations ポリシーをコードとして管理する
<a name="manage-organizations-policies-as-code"></a>

*Amazon Web Services、Andre Cavalcante および Mariana Pessoa de Queiroz*

## 概要
<a name="manage-organizations-policies-as-code-summary"></a>

で*認可ポリシー*を使用して AWS Organizations 、メンバーアカウントのプリンシパルとリソースのアクセスを一元的に設定および管理できます。[サービスコントロールポリシー (SCPs](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)、組織内の AWS Identity and Access Management (IAM) ロールとユーザーに使用可能なアクセス許可の最大数を定義します。[リソースコントロールポリシー (RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) は、組織内のリソースで利用できるアクセス許可の上限を定義します。

このパターンは、継続的インテグレーションと継続的デプロイ (CI/CD) パイプラインを通じてデプロイする Infrastructure as Code (IaC) として SCP と RCP を管理するのに役立ちます。 AWS CloudFormation または Hashicorp Terraform を使用してこれらのポリシーを管理することで、複数の認可ポリシーの構築と維持に関連する負担を軽減できます。

このパターンには、次の機能が含まれます。
+ *マニフェストファイル* (`scp-management.json` および `rcp-management.json`) を使用して、認可ポリシーを作成、削除、更新します。
+ ポリシーの代わりにガードレールを使用します。ガードレールとそれらのターゲットはマニフェストファイルで定義します。
+  AWS CodeBuild と を使用するパイプラインは AWS CodePipeline、マニフェストファイルのガードレールをマージして最適化します。マニフェストファイル内の各ステートメントについて、パイプラインはガードレールを単一の SCP または RCP にマージし、定義されたターゲットに適用します。
+ AWS Organizations はターゲットにポリシーを適用します。*ターゲット*は AWS アカウント、、組織単位 (OU)、環境 ( `environments.json` ファイルで定義したアカウントのグループまたは OUs)、または[AWS タグ](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/what-are-tags.html)を共有するアカウントのグループです。
+ Amazon Bedrock はパイプラインログを読み取り、すべてのポリシーの変更を要約します。
+ パイプラインには、手動承認が必要です。承認者は、Amazon Bedrock が作成したエグゼクティブサマリーを確認でき、エグゼクティブサマリーは変更内容を理解するのに役立ちます。

## 前提条件と制限
<a name="manage-organizations-policies-as-code-prereqs"></a>

**前提条件**
+ 組織として管理 AWS アカウント されている複数の AWS Organizations。詳細については、「[組織の作成](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_create.html)」を参照してください。
+ SCP および RCP 機能は で有効になっています AWS Organizations。詳細については、「[ポリシータイプの有効化](https://docs.aws.amazon.com/organizations/latest/userguide/enable-policy-type.html)」を参照してください。
+ Terraform バージョン 1.9.8 以降が[インストールされている](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)。
+ このソリューションを Terraform パイプライン経由でデプロイしない場合、Terraform 状態ファイルは、ポリシー管理パイプラインをデプロイ AWS アカウント する [https://developer.hashicorp.com/terraform/language/backend/s3](https://developer.hashicorp.com/terraform/language/backend/s3)の Amazon Simple Storage Service (Amazon S3) バケットに保存する必要があります。
+ Python バージョン 3.13.3 以降が[インストールされている](https://www.python.org/downloads/)。

**制限事項**
+ このパターンを使用して、この CI/CD パイプラインの外部で作成された SCP または RCP を管理することはできません。ただし、パイプラインを通じて既存のポリシーを再作成することはできます。詳細については、このパターンの「[追加情報](#manage-organizations-policies-as-code-additional)」セクションの「*既存のポリシーをパイプラインに移行する*」を参照してください。
+ 各アカウントのアカウント、OU、ポリシーの数には、 AWS Organizationsの[クォータとサービス制限](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html)が適用されます。
+ このパターンは、バックアップ[ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_management_policies.html) AWS Organizations、タグポリシー、チャットアプリケーションポリシー、宣言ポリシーなど、 の管理ポリシーの設定には使用できません。

## アーキテクチャ
<a name="manage-organizations-policies-as-code-architecture"></a>

以下の図は、ポリシー管理パイプラインとその関連リソースのワークフローを示しています。

![\[ポリシー管理パイプラインを通じた SCP と RCP のリリース。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/372a1ace-5b2e-4f93-9f88-b5b0519ded48/images/a2cceb99-2b93-48e0-b072-bc61a572201f.png)


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

1. ユーザーは、リモートリポジトリのメインブランチにある `scp-management.json` または `rcp-management.json` マニフェストファイルに変更をコミットします。

1. `main` ブランチの変更により、パイプラインが開始されます AWS CodePipeline。

1. CodePipeline は `Validate-Plan` CodeBuild プロジェクトを開始します。このプロジェクトでは、リモートリポジトリ内の Python スクリプトを使用して、ポリシーとポリシーマニフェストファイルを検証します。この CodeBuild プロジェクトでは、以下を行います。

   1. SCP と RCP のマニフェストファイルに一意のステートメント ID (`Sid`) が含まれていることを確認します。

   1. `scp-policy-processor/main.py` と `rcp-policy-processor/main.py` の Python スクリプトを使用して、ガードレールフォルダ内のガードレールを単一の RCP または SCP ポリシーに連結します。同じ `Resource`、`Action`、および `Condition` を持つガードレールを組み合わせます。

   1.  AWS Identity and Access Management Access Analyzer を使用して、最終的な最適化されたポリシーを検証します。検出結果がある場合、パイプラインは停止します。

   1. Terraform がリソースの作成に使用する `scps.json` ファイルと `rcps.json` ファイルを作成します。

   1. Terraform 実行プランを作成する、`terraform plan` コマンドを実行します。

1. (オプション) `Validate-Plan` CodeBuild プロジェクトは、`bedrock-prompt/prompt.py` スクリプトを使用して Amazon Bedrock にプロンプトを送信します。`bedrock-prompt/prompt.txt` ファイルでプロンプトを定義します。Amazon Bedrock は、Terraform ログと Python ログを分析することで、Anthropic Claude Sonnet 3.5 を使用して、提案された変更の概要を生成します。

1. CodePipeline は、変更を確認する必要があることを承認者に通知するために、Amazon Simple Notiﬁcation Service (Amazon SNS) トピックを使用します。Amazon Bedrock によって変更の概要が生成された場合、通知にはこの概要が含まれます。

1. ポリシー承認者は、CodePipeline でアクションを承認します。Amazon Bedrock によって変更の概要が生成された場合、承認者は承認する前に CodePipeline で概要を確認できます。

1. CodePipeline は `Apply` CodeBuild プロジェクトを開始します。このプロジェクトでは、Terraform を使用して RCP と SCP の変更を適用します AWS Organizations。

このアーキテクチャに関連付けられた IaC テンプレートは、ポリシー管理パイプラインをサポートする次のリソースもデプロイします。
+ `scp-policy-processor/main.py` や `bedrock-prompt/prompt.py` などの CodePipeline アーティファクトとスクリプトを保存するための Amazon S3 バケット
+ このソリューションによって作成されたリソースを暗号化する AWS Key Management Service (AWS KMS) キー

## ツール
<a name="manage-organizations-policies-as-code-tools"></a>

**AWS のサービス**
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) は、多くの高パフォーマンスな基盤モデルを、統合 API を通じて利用できるようにする完全マネージド型 AI サービスです。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) は完全マネージド型の構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。 
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) は、ソフトウェアリリースのさまざまな段階を迅速にモデル化および設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) は、作成して一元管理する AWS アカウント 組織に複数の を統合するのに役立つアカウント管理サービスです。
+ [AWS SDK for Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) は、Python アプリケーション、ライブラリ、またはスクリプトを と統合するのに役立つソフトウェア開発キットです AWS のサービス。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) は、あらゆる量のデータを保存、保護、取得できるクラウドベースのオブジェクトストレージサービスです。

**その他のツール**
+ [HashiCorp Terraform](https://www.terraform.io/docs) は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングして管理するのに役立つ IaC ツールです。

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

このパターンのコードは [organizations-policy-pipeline](https://github.com/aws-samples/organizations-policy-pipeline) GitHub リポジトリで利用できます。`sample-repository` フォルダに含まれるキーファイルは次のとおりです。
+ `environments` フォルダ内の `environments.json` には環境のリストが含まれます。*環境*はターゲットのグループであり、 AWS アカウント IDsまたは組織単位 (OUsを含めることができます。
+ `rcp-management` フォルダ内:
  + `guardrails` フォルダには、RCP の個々のガードレールが含まれます。
  + `policies` フォルダには、個々の RCP が含まれます。
  + `rcp-management.json` マニフェストファイルは、RCP ガードレール、完全な RCP、およびそれらの関連ターゲットを管理するのに役立ちます。
+ `scp-management` フォルダ内:
  + `guardrails` フォルダには、SCP の個々のガードレールが含まれます。
  + `policies` フォルダには、個々の SCP が含まれます。
  + `scp-management.json` マニフェストファイルは、SCP ガードレール、完全な SCP、およびそれらの関連ターゲットを管理するのに役立ちます。
+ `utils` フォルダには、現在の SCP と RCP の移行に役立つスクリプトが含まれ、これにより、パイプラインを通じて SCP と RCP を管理できるようになります。詳細については、このパターンの「[追加情報](#manage-organizations-policies-as-code-additional)」セクションを参照してください。

## ベストプラクティス
<a name="manage-organizations-policies-as-code-best-practices"></a>
+ パイプラインを設定する前に、 AWS Organizations [クォータ](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html)の制限に達していないことを確認することをお勧めします。
+  AWS Organizations 管理アカウントは、そのアカウントで実行する必要があるタスクにのみ使用することをお勧めします。詳細については、「[管理アカウントのベストプラクティス](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_best-practices_mgmt-acct.html#bp_mgmt-acct_use-mgmt)」を参照してください。

## エピック
<a name="manage-organizations-policies-as-code-epics"></a>

### ターゲットアカウントをセットアップする
<a name="set-up-the-target-account"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリを作成します。 | セキュリティ運用チームがポリシーを管理するためのリポジトリを作成します。 AWS CodeConnections [がサポート](https://docs.aws.amazon.com/dtconsole/latest/userguide/supported-versions-connections.html)するサードパーティーのリポジトリプロバイダーのいずれかを使用します。 | DevOps エンジニア | 
| ポリシー管理を委任します。 | パイプラインをデプロイするメンバーアカウントに AWS Organizations ポリシーの管理を委任します。手順については、[「 を使用してリソースベースの委任ポリシーを作成する AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs-policy-delegate.html)」を参照してください。サンプルポリシーについては、このパターンの「[追加情報](#manage-organizations-policies-as-code-additional)」セクションの「*リソースベースの委任ポリシーのサンプル*」を参照してください。 | AWS 管理者 | 
| (オプション) 基盤モデルを有効にします。 | ポリシーの変更の概要を生成する場合は、パイプラインをデプロイ AWS アカウント する の Amazon Bedrock で Anthropic Claude 3.5 Sonnet 基盤モデルへのアクセスを有効にします。手順については、「[Add or remove access to Amazon Bedrock foundation models](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html)」を参照してください。 | AWS 全般 | 

### パイプラインのリソースをデプロイする
<a name="deploy-the-resources-for-the-pipeline"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | GitHub から [organizations-policy-pipeline](https://github.com/aws-samples/organizations-policy-pipeline) リポジトリをクローンするには、次のコマンドを入力します。`git clone https://github.com/aws-samples/organizations-policy-pipeline.git` | DevOps エンジニア | 
| デプロイ方法を定義します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps エンジニア | 
| パイプラインをデプロイします。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps エンジニア、Terraform | 
| リモートリポジトリを接続します。 | 前の手順では、Terraform によってサードパーティーリポジトリへの CodeConnections 接続が作成されました。[AWS デベロッパーツールコンソール](https://console.aws.amazon.com/codesuite/settings/connections)で、接続のステータスを `PENDING` から `AVAILABLE` に変更します。手順については、「[保留中の接続の更新](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-update.html)」を参照してください。 | AWS DevOps | 
| Amazon SNS トピックを購読します。 | Terraform によって Amazon SNS トピックが作成されました。トピックにエンドポイントをサブスクライブし、サブスクリプションを確認して、承認者がパイプライン内の保留中の承認アクションに関する通知を受け取るようにします。手順については、「[Amazon SNS トピックのサブスクリプションの作成](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)」を参照してください。 | AWS 全般 | 

### ガードレールとポリシーを定義する
<a name="define-your-guardrails-and-policies"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リモートリポジトリに入力します。 | クローンされたリポジトリから、`sample-repository` フォルダの内容をリモートリポジトリにコピーします。これには `environments`、`rcp-management`、`scp-management`、`utils` フォルダが含まれます。 | DevOps エンジニア | 
| 環境を定義します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps エンジニア | 
| ガードレールを定義します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps エンジニア | 
| ポリシーを定義します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps エンジニア | 

### マニフェストファイルを使用してポリシーを管理する
<a name="use-the-manifest-file-to-manage-the-policies"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| マニフェストファイルを設定します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps エンジニア | 
| パイプラインを開始します。 | `variables.tf` ファイルで定義したリモートリポジトリのブランチに変更をコミットしてプッシュします。通常、これは `main` ブランチとなります。CI/CD パイプラインが自動的に開始されます。パイプラインエラーがある場合は、このパターンの「[トラブルシューティング](#manage-organizations-policies-as-code-troubleshooting)」セクションを参照してください。 | DevOps エンジニア | 
| 変更を承認します。 | `Validate-Plan` CodeBuild プロジェクトが完了すると、ポリシー承認者は、以前に設定した Amazon SNS トピックを通じて通知を受け取ります。以下の操作を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | AWS 全般、ポリシー承認者 | 
| デプロイを検証する。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | AWS 全般 | 

## トラブルシューティング
<a name="manage-organizations-policies-as-code-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| パイプラインの `Validate-Plan` フェーズでのマニフェストファイルエラー | `scp-management.json` または `rcp-management.json` ファイルにエラーがある場合、パイプライン出力に「Pipeline errors in the Validation & Plan phase for manifest files」というメッセージが表示されます。起こり得るエラーには、正しくない環境名、重複した SID、無効なフィールドや値などがあります。以下の操作を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | 
| パイプラインの `Validate-Plan` フェーズでの IAM Access Analyzer の検出結果 | ガードレールまたはポリシーの定義にエラーがある場合、パイプライン出力に「Findings in IAM Access Analyzer during Validation & Plan phase」というメッセージが表示されます。このパターンでは、IAM Access Analyzer を使用して最終的なポリシーを検証します。以下の操作を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | 

## 関連リソース
<a name="manage-organizations-policies-as-code-resources"></a>
+ [JSON ポリシー要素のリファレンス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)」(IAM ドキュメント)
+ [リソースコントロールポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) (AWS Organizations ドキュメント)
+ [サービスコントロールポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) (AWS Organizations ドキュメント)
+ [Add or remove access to Amazon Bedrock foundation models](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html) (Amazon Bedrock ドキュメント)
+ [CodePipeline で承認アクションを承認または拒否する](https://docs.aws.amazon.com/codepipeline/latest/userguide/approvals-approve-or-reject.html) (CodePipeline ドキュメント)

## 追加情報
<a name="manage-organizations-policies-as-code-additional"></a>

**リソースベースの委任ポリシーのサンプル**

以下は、 のリソースベースの委任ポリシーの例です AWS Organizations。これにより、委任された管理者アカウントが組織の SSP と RCP を管理できるようになります。次のサンプルポリシーでは、ポリシー管理パイプラインをデプロイするアカウントの ID に `<MEMBER_ACCOUNT_ID>` を置き換えます。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DelegationToAudit",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<MEMBER_ACCOUNT_ID>:root"
      },
      "Action": [
        "organizations:ListTargetsForPolicy",
        "organizations:CreatePolicy",
        "organizations:DeletePolicy",
        "organizations:AttachPolicy",
        "organizations:DetachPolicy",
        "organizations:DisablePolicyType",
        "organizations:EnablePolicyType",
        "organizations:UpdatePolicy",
        "organizations:DescribeEffectivePolicy",
        "organizations:DescribePolicy",
        "organizations:DescribeResourcePolicy"
      ],
      "Resource": "*"
    }
  ]
}
```

**既存のポリシーをパイプラインに移行する**

このパイプラインを通じて移行および管理する既存の SCP または RCP がある場合は、コードリポジトリの `sample-repository/utils` フォルダにある Python スクリプトを使用できます。これらのスクリプトには、以下が含まれます。
+ `check-if-scp-exists-in-env.py` – このスクリプトは、`environments.json` ファイルで定義した特定の環境内の任意のターゲットに、指定されたポリシーが適用されるかどうかをチェックします。次のコマンドを入力して、このスクリプトを実行します。

  ```
  python3 check-if-scp-exists-in-env.py \
     --policy-type <POLICY_TYPE> \
     --policy-name <POLICY_NAME> \
     --env-id <ENV_ID>
  ```

  このコマンドの次の部分を置き換えます。
  + `<POLICY_TYPE>` は `scp` または `rcp`
  + `<POLICY_NAME>` は、SCP または RCP の名前です
  + `<ENV_ID>` は、`environments.json` ファイルで定義した環境の ID です
+ `create-environments.py` – このスクリプトは、環境内の現在の SCP と RCP に基づいて environment.json ファイルを作成します。を通じてデプロイされたポリシーは除外されます AWS Control Tower。次のコマンドを入力して、このスクリプトを実行します。ここで、`<POLICY_TYPE>` は `scp` または `rcp` になります。

  ```
  python create-environments.py --policy-type <POLICY_TYPE>
  ```
+ `verify-policies-capacity.py` – このスクリプトは、定義した各環境をチェックして、各 AWS Organizations ポリシー関連のクォータに残っている容量を決定します。`environments.json` ファイルでチェックする環境を定義します。次のコマンドを入力して、このスクリプトを実行します。ここで、`<POLICY_TYPE>` は `scp` または `rcp` になります。

  ```
  python verify-policies-capacity.py --policy-type <POLICY_TYPE>
  ```