使用 AWS CodePipeline 和 Amazon Bedrock 以程式碼形式管理 AWS Organizations 政策 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS CodePipeline 和 Amazon Bedrock 以程式碼形式管理 AWS Organizations 政策

由 Andre Cavalcante (AWS) 和 Mariana Pessoa de Queiroz (AWS) 建立

Summary

您可以在 中使用授權政策 AWS Organizations ,集中設定和管理成員帳戶中主體和資源的存取權。服務控制政策 SCPs) 定義組織中 AWS Identity and Access Management (IAM) 角色和使用者的最大可用許可。資源控制政策 RCPs) 會定義組織中資源可用的許可上限。

此模式可協助您將 SCPs 和 RCPs 管理為您透過持續整合和持續部署 (CI/CD) 管道部署的基礎設施即程式碼 (IaC)。透過使用 AWS CloudFormation 或 Hashicorp Terraform 來管理這些政策,您可以減輕與建立和維護多個授權政策相關的負擔。

此模式包含下列功能:

  • 您可以使用資訊清單檔案 (scp-management.json 和 ) 建立、刪除和更新授權政策rcp-management.json

  • 您使用護欄而非政策。您可以在資訊清單檔案中定義護欄及其目標。

  • 使用 AWS CodeBuild 和 的管道 AWS CodePipeline會合併和最佳化資訊清單檔案中的護欄。對於資訊清單檔案中的每個陳述式,管道會將護欄合併為單一 SCP 或 RCP,然後將其套用至定義的目標。

  • AWS Organizations 會將政策套用至您的目標。目標可以是 AWS 帳戶、組織單位 (OU)、環境 (這是您在 environments.json 檔案中定義的一組帳戶或 OUs),或共用AWS 標籤的一組帳戶。

  • Amazon Bedrock 會讀取管道日誌並摘要所有政策變更。

  • 管道需要手動核准。核准者可以檢閱 Amazon Bedrock 準備的執行摘要,以協助他們了解變更。

先決條件和限制

先決條件

  • 以組織形式管理 AWS 帳戶 的多個 AWS Organizations。如需詳細資訊,請參閱建立組織

  • SCP 和 RCP 功能已在 中啟用 AWS Organizations。如需詳細資訊,請參閱啟用政策類型

  • 已安裝 Terraform 1.9.8 版或更新版本。

  • 如果您不是透過 Terraform 管道部署此解決方案,則 Terraform 狀態檔案必須存放在部署政策管理管道 AWS 帳戶 的 中的 Amazon Simple Storage Service (Amazon S3) 儲存貯體中。

  • 已安裝 Python 3.13.3 版或更新版本。

限制

  • 您無法使用此模式來管理在此 CI/CD 管道之外建立的 SCPs 或 RCPs。不過,您可以透過管道重新建立現有的政策。如需詳細資訊,請參閱此模式額外資訊區段中的將現有政策遷移至管道

  • 每個帳戶中的帳戶、OUs 和政策數量受 的配額和服務限制約束 AWS Organizations。

  • 此模式無法用於在 中設定管理政策 AWS Organizations,例如備份政策、標籤政策、聊天應用程式政策或宣告政策。

架構

下圖顯示政策管理管道及其相關聯資源的工作流程。

透過政策管理管道釋出 SCPs RCPs。

該圖顯示以下工作流程:

  1. 使用者將變更遞交至遠端儲存庫主分支中的 scp-management.jsonrcp-management.json資訊清單檔案。

  2. main 分支的變更會在其中啟動管道 AWS CodePipeline。

  3. CodePipeline 會啟動 Validate-Plan CodeBuild 專案。此專案使用遠端儲存庫中的 Python 指令碼來驗證政策和政策資訊清單檔案。此 CodeBuild 專案會執行下列動作:

    1. 檢查 SCP 和 RCP 資訊清單檔案是否包含唯一的陳述式 IDs(Sid)。

    2. 使用 scp-policy-processor/main.pyrcp-policy-processor/main.py Python 指令碼,將護欄資料夾中的護欄串連至單一 RCP 或 SCP 政策。它結合了具有相同 ResourceAction和 的護欄Condition

    3. 使用 AWS Identity and Access Management Access Analyzer 驗證最終的最佳化政策。如果有任何問題清單,管道會停止。

    4. 建立 scps.jsonrcps.json 檔案,Terraform 會使用這些檔案來建立資源。

    5. 執行 terraform plan命令,這會建立 Terraform 執行計畫。

  4. (選用) Validate-Plan CodeBuild 專案使用bedrock-prompt/prompt.py指令碼將提示傳送至 Amazon Bedrock。您可以在 bedrock-prompt/prompt.txt 檔案中定義提示。Amazon Bedrock 使用 Anthropic Claude Sonnet 3.5,透過分析 Terraform 和 Python 日誌來產生提議變更的摘要。

  5. CodePipeline 使用 Amazon Simple Notification Service (Amazon SNS) 主題,以通知核准者必須檢閱變更。如果 Amazon Bedrock 產生變更摘要,通知會包含此摘要。

  6. 政策核准者核准 CodePipeline 中的動作。如果 Amazon Bedrock 產生變更摘要,核准者可以在核准之前檢閱 CodePipeline 中的摘要。

  7. CodePipeline 會啟動 Apply CodeBuild 專案。此專案使用 Terraform 來套用 RCP 和 SCP 變更 AWS Organizations。

與此架構相關聯的 IaC 範本也會部署支援政策管理管道的下列資源:

  • 用於存放 CodePipeline 成品和指令碼的 Amazon S3 儲存貯體,例如 scp-policy-processor/main.pybedrock-prompt/prompt.py

  • 加密此解決方案所建立資源的 AWS Key Management Service (AWS KMS) 金鑰

工具

AWS 服務

  • Amazon Bedrock 是一項全受管 AI 服務,可透過統一 API 使用許多高效能的基礎模型。

  • AWS CodeBuild 是一種全受管建置服務,可協助您編譯原始程式碼、執行單元測試,並產生準備好部署的成品。 

  • AWS CodePipeline 可協助您快速建模和設定軟體版本的不同階段,並自動化持續發行軟體變更所需的步驟。

  • AWS Organizations 是一種帳戶管理服務,可協助您將多個 合併 AWS 帳戶 到您建立並集中管理的組織。

  • 適用於 Python (Boto3) 的 AWS SDK 是一種軟體開發套件,可協助您整合 Python 應用程式、程式庫或指令碼 AWS 服務。

  • Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。

其他工具

  • HashiCorp Terraform 是一種 IaC 工具,可協助您使用程式碼來佈建和管理雲端基礎設施和資源。

程式碼儲存庫

此模式的程式碼可在 organizations-policy-pipeline GitHub 儲存庫中使用。以下是 sample-repository 資料夾中包含的金鑰檔案:

  • environments 資料夾中, environments.json包含環境清單。環境是一組目標,它們可以包含 AWS 帳戶 IDs或組織單位 OUs)。

  • rcp-management資料夾中:

    • guardrails 資料夾包含 RCPs 的個別護欄

    • policies 資料夾包含個別 RCPs

    • rcp-management.json 資訊清單檔案可協助您管理 RCP 護欄、完整 RCPs 及其相關聯的目標。

  • scp-management資料夾中:

    • guardrails 資料夾包含 SCPs 的個別護欄

    • policies 資料夾包含個別 SCPs

    • scp-management.json 資訊清單檔案可協助您管理 SCP 護欄、完整 SCPs 及其相關聯的目標。

  • utils 資料夾包含的指令碼可協助您遷移目前的 SCPs 和 RCPs,以便您可以透過管道管理它們。如需詳細資訊,請參閱此模式的其他資訊一節。

最佳實務

  • 在您設定管道之前,建議您確認尚未達到 AWS Organizations 配額的限制。

  • 我們建議您僅將 AWS Organizations 管理帳戶用於必須在該帳戶中執行的任務。如需詳細資訊,請參閱 管理帳戶的最佳實務

史詩

任務描述所需的技能

建立 儲存庫。

建立安全操作團隊將從中管理政策的儲存庫。使用其中一個 AWS CodeConnections 支援的第三方儲存庫提供者。

DevOps 工程師

委派政策管理。

將 AWS Organizations 政策的管理委派給您要部署管道的成員帳戶。如需說明,請參閱使用 建立資源型委派政策 AWS Organizations。如需範例政策,請參閱此模式額外資訊區段中的以資源為基礎的委派政策範例

AWS 管理員

(選用) 啟用基礎模型。

如果您想要產生政策變更的摘要,請在 AWS 帳戶 您要部署管道的 中,啟用 Amazon Bedrock 中 Anthropic Claude 3.5 Sonnet 基礎模型的存取權。如需說明,請參閱新增或移除對 Amazon Bedrock 基礎模型的存取權

一般 AWS
任務描述所需的技能

複製儲存庫。

輸入下列命令,從 GitHub 複製 organizations-policy-pipeline 儲存庫:

git clone https://github.com/aws-samples/organizations-policy-pipeline.git

DevOps 工程師

定義您的部署方法。

  1. 在複製的儲存庫中,開啟 variables.tf 檔案。

  2. 針對 project_name,輸入您要套用至已部署資源名稱的字首。

  3. 針對 provider_type,輸入遠端儲存庫的提供者。檔案中會提供有效值。

  4. 針對 full_repository_name,輸入遠端儲存庫的名稱。

  5. 針對 branch_name,輸入您要用來部署政策的 Git 分支名稱。此分支中的推送或合併會啟動管道。一般而言,這是主要分支。

  6. 針對 terraform_version,輸入您正在使用的 Terraform 版本。

  7. 對於 enable_bedrocktrue如果您希望 Amazon Bedrock 摘要這些變更,請輸入 。false 如果您不想產生變更的摘要,請輸入 。

  8. 針對 tags,輸入您要指派為已部署資源標籤的鍵/值對。

  9. 儲存並關閉 variables.tf 檔案。

DevOps 工程師

部署管道。

  1. 輸入下列命令來建立計劃並檢閱變更:

    terraform plan
  2. 輸入下列命令以套用計劃並建立管道基礎設施:

    terraform apply
DevOps 工程師,Terraform

連接遠端儲存庫。

在上一個步驟中,Terraform 建立了與第三方儲存庫的 CodeConnections 連線。在AWS 開發人員工具主控台中,將連線的狀態從 變更為 PENDING AVAILABLE。如需說明,請參閱更新待定連線

AWS DevOps

訂閱 Amazon SNS 主題。

Terraform 已建立 Amazon SNS 主題。將端點訂閱至主題並確認訂閱,讓核准者收到管道中待核准動作的通知。如需說明,請參閱建立 Amazon SNS 主題的訂閱

一般 AWS
任務描述所需的技能

填入遠端儲存庫。

從複製的儲存庫,將sample-repository資料夾的內容複製到遠端儲存庫。這包括 environmentsscp-managementrcp-managementutils 資料夾。

DevOps 工程師

定義您的環境。

  1. environments資料夾中,開啟 environments.json 檔案。這是您為 RCPs AWS 帳戶 和 SCPs OUs 的檔案。

  2. 刪除範例環境。

  3. 以下列格式新增您的目標環境:

    [ { "ID": "<environment-name>", "Target": [ "<ou-name>:<ou-id>", "<account-name>:<account-id>" ] } ]

    其中:

    • <environment-name> 是您指派給 OUs和 AWS 帳戶群組的名稱。您可以在資訊清單檔案中使用此名稱來定義要套用政策的位置。

    • <ou-name> 是目標 OU 的名稱。

    • <ou-id> 是目標 OU 的 ID。

    • <account-name> 是目標的名稱 AWS 帳戶。

    • <account-id> 是目標的 ID AWS 帳戶。

    如需範例,請參閱原始程式碼儲存庫

  4. 儲存並關閉 environments.json 檔案。

DevOps 工程師

定義您的護欄。

  1. 導覽至遠端儲存庫中的 rcp-management/guardrails 資料夾。這是您為 RCP 資訊清單檔案定義護欄的資料夾。每個護欄都必須在個別檔案中。護欄檔案可以包含一或多個陳述式。

    注意

    您可以在 SCPs 和 RCPs 的資訊清單檔案中的多個陳述式中使用相同的護欄。如果您修改護欄,任何包含此護欄的政策都會受到影響。

  2. 刪除從原始程式碼儲存庫複製的任何護欄範例。

  3. 建立新的 .json 檔案,並提供描述性名稱。

  4. 開啟您建立的 .json 檔案。

  5. 以下列格式定義護欄:

    [ { "Sid": "<guardrail-name>", "Effect": "<effect-value>", "Action": [ "<action-name>" ], "Resource": "<resource-arn>", "Condition": { "<condition-operator>": { "<condition-key>": [ "<condition-value>" ] } } } ]

    其中:

    • <guardrail-name> 是護欄的唯一名稱。此名稱不能用於任何其他護欄。

    • <effect-value> 必須是 AllowDeny。如需詳細資訊,請參閱效果

    • <action-name> 必須是服務支援之動作的有效名稱。如需詳細資訊,請參閱動作

    • <resource-arn> 是護欄套用的資源的 Amazon Resource Name (ARN)。您也可以使用萬用字元,例如 *?。如需詳細資訊,請參閱 資源

    • <condition-operator> 是有效的條件運算子。如需詳細資訊,請參閱條件運算子

    • <condition-key> 是有效的全域條件內容索引鍵或服務特定內容索引鍵。如需詳細資訊,請參閱 條件

    • <condition-value> 是條件中用來評估護欄是否套用的特定值。如需詳細資訊,請參閱 條件

    如需 RCP 護欄的範例,請參閱原始程式碼儲存庫

  6. 儲存並關閉 .json 檔案。

  7. 重複這些步驟,視需要建立任意數量的 RCP 護欄。

  8. scp-management/guardrails 資料夾中重複這些步驟,視需要為 SCPs 建立任意數量的護欄。如需 SCP 護欄範例,請參閱原始程式碼儲存庫

DevOps 工程師

定義您的政策。

  1. 導覽至遠端儲存庫中的 rcp-management/policies 資料夾。這是您為 RCP 資訊清單檔案定義完整政策的資料夾。每個政策必須是個別檔案。

    注意

    如果您修改此資料夾中的政策,政策變更會影響套用此政策的任何帳戶或 OUs,如清單檔案所定義。

  2. 刪除從原始程式碼儲存庫複製的任何範例政策。

  3. 建立新的 .json 檔案,並提供描述性名稱。

  4. 開啟您建立的 .json 檔案。

  5. 定義 RCP。如需 RCPs範例,請參閱原始程式碼儲存庫,或參閱 AWS Organizations 文件中的資源控制政策範例

  6. 儲存並關閉 .json 檔案。

  7. 重複這些步驟,視需要建立任意數量RCPs。

  8. scp-management/policies 資料夾中重複這些步驟,視需要建立任意數量SCPs。如需 SCPs範例,請參閱原始程式碼儲存庫,或參閱 AWS Organizations 文件中的服務控制政策範例

DevOps 工程師
任務描述所需的技能

設定資訊清單檔案。

  1. rcp-management資料夾中,開啟 rcp-management.json 檔案。這是您定義哪些 RCP 護欄和完整 RCPs 適用於目標環境的檔案。如需此檔案的範例,請參閱原始程式碼儲存庫

  2. 刪除範例陳述式。

  3. 以下列格式新增陳述式:

    [ { "SID": "<statement-name>", "Target": { "Type": "<target-type>", "ID": "<target-name>" }, "Guardrails": [ "<guardrail-name>" ], "Policy": "<policy-name>", "Comments": "<comment-text>" } ]

    其中:

    • <statement-name> 是 陳述式的唯一名稱。

    • <target-type> 是您要套用政策的目標類型。有效值為 AccountOUEnvironmentTag

    • <target-name> 是您要套用政策的目標識別符。輸入下列其中之一:

      • 對於 AWS 帳戶,將識別符輸入為 <account-name>:<account-id>

      • 對於 OU,輸入識別符為 <OU-name>:<ou-id>

      • 針對環境,輸入您在 environments.json 檔案中定義的唯一名稱。

      • 對於標籤,將鍵值對輸入為 <tag-key>:<tag-value>

    • <guardrail-name> 是您在 rcp-management/guardrails 資料夾中定義的 RCP 護欄的唯一名稱。您可以在此元素中新增多個護欄。如果您不想套用護欄,您可以將此欄位保留空白。

    • <policy-name> 是您在 rcp-management/policies 資料夾中定義的 RCP 的唯一名稱。您只能在此元素中新增一個政策。如果您不想套用政策,您可以將此欄位保留空白。

    • <comment-text> 是您可以輸入用於文件用途的描述。管道處理期間不會使用此欄位。如果您不想新增註解,您可以將此欄位保留空白。

  4. 重複這些步驟,視需要新增任意數量的陳述式,為您的組織設定 RCPs。

  5. 儲存並關閉 rcp-management.json 檔案。

  6. scp-management 資料夾中,重複 scp-management.json 檔案中的這些步驟。這是您定義哪些 SCP 護欄和完整 SCPs 適用於目標環境的檔案。如需此檔案的範例,請參閱原始程式碼儲存庫

DevOps 工程師

啟動管道。

遞交變更並推送至您在 variables.tf 檔案中定義的遠端儲存庫分支。一般而言,這是main分支。CI/CD 管道會自動啟動。如果有任何管道錯誤,請參閱此模式的故障診斷一節。

DevOps 工程師

核准變更。

Validate-Plan CodeBuild 專案完成後,政策核准者會透過您先前設定的 Amazon SNS 主題收到通知。請執行下列操作:

  1. 開啟通知訊息。

  2. 如果可用,請檢閱政策變更的摘要。

  3. 遵循 CodePipeline 中的核准或拒絕核准動作中的指示。

一般 AWS、政策核准者

驗證部署。

  1. 登入委派管理員帳戶中的 AWS Organizations 主控台 AWS Organizations。

  2. 服務控制政策頁面上,確認您建立SCPs 已列出。

  3. 選擇透過管道管理的 SCP,並確認它適用於預期目標。

  4. 資源控制政策頁面上,確認您建立RCPs 已列出。

  5. 選擇透過管道管理的 RCP,並確認它適用於預期目標。

一般 AWS

故障診斷

問題解決方案

管道Validate-Plan階段中的資訊清單檔案錯誤

如果 scp-management.json或 檔案有任何錯誤,「資訊清單檔案驗證與計劃階段的管道錯誤」訊息會顯示在管道輸出中rcp-management.json。可能的錯誤包括不正確的環境名稱、重複SIDs 或無效的欄位或值。請執行下列操作:

  1. 請遵循檢視建置詳細資訊 AWS CodeBuild中的指示。

  2. 在建置日誌中,尋找驗證錯誤。錯誤會提供導致建置失敗之原因的詳細資訊。

  3. 更新對應的 .json 檔案。

  4. 遞交更新的檔案並推送至遠端儲存庫。管道會重新啟動。

  5. 監控狀態以確認驗證錯誤已解決。

管道Validate-Plan階段中的 IAM Access Analyzer 調查結果

如果護欄或政策定義中有任何錯誤,「在驗證與計劃階段期間 IAM Access Analyzer 中尋找」訊息會顯示在管道輸出中。此模式使用 IAM Access Analyzer 來驗證最終政策。請執行下列操作:

  1. 請遵循在 中檢視建置詳細資訊 AWS CodeBuild中的指示。

  2. 在建置日誌中,尋找 IAM Access Analyzer 驗證錯誤。錯誤會提供導致建置失敗之原因的詳細資訊。如需調查結果類型的詳細資訊,請參閱 IAM 政策驗證檢查參考

  3. 更新護欄或政策對應的 .json 檔案。

  4. 遞交更新的檔案並推送至遠端儲存庫。管道會重新啟動。

  5. 監控狀態以確認驗證錯誤已解決。

相關資源

其他資訊

以資源為基礎的委派政策範例

以下是 的範例資源型委派政策 AWS Organizations。它允許委派的管理帳戶管理組織的 SCPs RCPs。在下列範例政策中,將 <MEMBER_ACCOUNT_ID>取代為您部署政策管理管道的帳戶 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": "*" } ] }

將現有政策遷移至管道

如果您有要透過此管道遷移和管理的現有 SCPs 或 RCPs,您可以使用程式碼儲存庫 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>scprcp

    • <POLICY_NAME> 是 SCP 或 RCP 的名稱

    • <ENV_ID> 是您在 environments.json 檔案中定義的環境 ID

  • create-environments.py – 此指令碼會根據您環境中目前的 SCPs和 RCPs 建立 environment.json 檔案。它不包括透過 部署的政策 AWS Control Tower。輸入下列命令來執行此指令碼,其中 <POLICY_TYPE>scprcp

    python create-environments.py --policy-type <POLICY_TYPE>
  • verify-policies-capacity.py – 此指令碼會檢查您定義的每個環境,以判斷每個 AWS Organizations 政策相關配額的剩餘容量。您可以定義要在 environments.json 檔案中檢查的環境。輸入下列命令來執行此指令碼,其中 <POLICY_TYPE>scprcp

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