CloudFormationを利用したSCPの作成と適用

AWSのアカウントやOUに対して一括でサービスコントロールポリシー(以下、SCP)を適用したり、異なる組織に同じSCPを付与したい場合はありませんか。

今回は、CloudFormationを利用してSCPを付与するテンプレートの紹介と実例を紹介します。

CloudFormation テンプレート

AWS公式ドキュメントの記載

AWS公式ドキュメントでは、CloudFormationテンプレートのサンプルがサービスごとに用意されており、「OrganizationsのSCP作成」についてもサンプルが存在します。

CloudFormationのテンプレートはJSONまたはYAML形式である必要があり、JSON形式における基本構成は以下のようになっています。

{
  "Type" : "AWS::Organizations::Policy",
  "Properties" : {
      "Content" : Json,
      "Description" : String,
      "Name" : String,
      "Tags" : [ Tag, ... ],
      "TargetIds" : [ String, ... ],
      "Type" : String
    }
}

プロパティにおける「Content」や「Name」、「TargetIds」といった各要素の詳細は公式ドキュメントに記載があるため、説明は割愛します。

AWS::Organizations::P olicy - AWS CloudFormation

上記基本構成をもとに、SCPの作成と適用を一括で実施するCloudFormationのテンプレートの例を紹介します。

CloudFormationテンプレート例

今回は、アカウント内で操作できるリージョンを制限するSCPのCloudForamtionテンプレートを作成していきます。

例として、東京リージョンと大阪リージョンの日本限定リージョンに制限したSCPを作成してみます。

また、今回様々なAWS環境で利用できるテンプレートを作成するため、CloudFormationのテンプレートにSCPを付与する宛先である「TargetId」をパラメータとして挿入します。

以下が今回使用するCloudFormation テンプレートのサンプルとなります。

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "TestSCP",
    "Parameters": {
        "TargetIdParam": {
            "Type": "CommaDelimitedList",
            "Description": "TargetID"
        }
    },
    "Resources": {
        "PolicyTestTemplate": {
            "DeletionPolicy": "Retain",
            "Type": "AWS::Organizations::Policy",
            "Properties" : {
                "Type": "SERVICE_CONTROL_POLICY",
                "Name" : "test01",
                "Description" : "test01",
                "TargetIds": { "Ref": "TargetIdParam" },
                "Content":{
	                "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Sid": "DenyOtherRegions",
                            "Effect": "Deny",
                            "Action": "*",
                            "Resource": "*",
                            "Condition": {
                                "StringNotEquals": {
                                    "aws:RequestedRegion": [
                                        "ap-northeast-1",
                                        "ap-northeast-3"
                                    ]
                                }
                            }
                        }
                    ]
                }
            }   
        }    
    }
}

実践

CloudFormationのスタック作成

1.Organizationsの管理アカウントにて、CloudFormationのコンソール画面へアクセスし、「スタックの作成」を選択します。

2.テンプレートの指定時に、[テンプレートファイルのアップロード]-[ファイルの選択]から今回使用するCloudFormationテンプレートを指定し、「次へ」を選択します。

3.「スタック名」を入力し、パラメータの「TargetIdsParam」にSCPを付与するOUまたはアカウントのIDを入力し、「次へ」を選択します。

複数のOUまたはアカウントを指定する場合は、「,(カンマ)」区切りで入力する必要があります。

また、以下のようにOUとアカウントを一緒に選択することも可能です。

4.その他設定はオプションのため、必要に応じて設定を行った後に「送信」を選択し、設定に問題が無ければスタックの作成が完了します。

SCP適用確認

  • Organizationsのコンソール画面での確認(管理アカウント)
  • リージョン制限確認(メンバーアカウント)

おわりに

今回はOUやアカウントに対してSCPを一括適用する方法について、CloudFormationを活用した設定例を紹介しました。

注意点として、SCPの作成と適用をするためには、Organizationsで事前に「サービスコントロールポリシーの有効化」が必要となります。

紹介したテンプレートはサンプルのため、利用しているAWS環境に応じてSCPの内容を変更したり、パラメータを利用して効率的にSCPを付与したりする際に役立てていただけると幸いです。

執筆担当者プロフィール
髙橋 耕太郎

髙橋 耕太郎(日本ビジネスシステムズ株式会社)

クラウドソリューション事業本部に所属しています。AWSをメインにインフラの設計構築、運用保守を行っています!

担当記事一覧