この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS Organizations の組織全体に AWS CloudFormation Guard を利用した AWS Config カスタムルールの展開を試してみました。
組織内のアカウントへの Config ルールのデプロイは次のブログで紹介されている機能を利用して AWS CLI で行いました。
試してみた
始めに AWS Organizations の信頼されたアクセスの設定を行ってから、Config ルールの作成と削除を試してみます。
信頼されたアクセスの設定
管理アカウントにおいてconfig-multiaccountsetup.amazonaws.com
の信頼されたアクセスを有効化します。
$ aws organizations enable-aws-service-access --service-principal config-multiaccountsetup.amazonaws.com
$ aws organizations list-aws-service-access-for-organization --output text | grep config-multiaccountsetup
ENABLEDSERVICEPRINCIPALS 2022-09-28T14:28:59.817000+00:00 config-multiaccountsetup.amazonaws.com
管理アカウントにおいて AWS Config を管理するアカウントに委任する設定を行います。
$ aws organizations register-delegated-administrator --account-id 111122223333 --service-principal config-multiaccountsetup.amazonaws.com
$ aws organizations list-delegated-services-for-account --account-id 111122223333 --output text | grep config-multiaccountsetup
DELEGATEDSERVICES 2022-09-29T13:56:58.493000+00:00 config-multiaccountsetup.amazonaws.com
Config ルールの作成
作業は委任されたアカウントで作業を行います。委任を行わず、管理アカウントから設定することもできます。
今回は、AWS のブログで紹介されている次のルールを展開してみます。Elastic IP (EIP) がアタッチされており、running
ステータスの EC2 インスタンスを準拠として評価します。
let eipresource = relationships.*[ resourceType == 'AWS::EC2::EIP' ]
rule check_ec2_eip_compliance {
when %eipresource !empty {
configuration.state.name == "running"
}
}
Config ルールの展開はput-organization-config-rule
コマンドで行います。
put-organization-config-rule — AWS CLI 2.7.35 Command Reference
put-organization-config-rule — AWS CLI 1.25.83 Command Reference
AWS CloudFormation Guard のルールを指定する場合はorganization-custom-policy-rule-metadata
オプションを利用します。今回は次の JSON ファイルを作成してコマンド実行時に指定します。冒頭で紹介したブログでは Shorthand Syntax で実行しています。
metadata.json
{
"Description": "Evaluates if an Amazon EC2 instance has a public Elastic IP attached and running.",
"OrganizationConfigRuleTriggerTypes": [
"ConfigurationItemChangeNotification",
"OversizedConfigurationItemChangeNotification"
],
"ResourceTypesScope": ["AWS::EC2::Instance"],
"PolicyRuntime": "guard-2.x.x",
"PolicyText": "let eipresource = relationships.*[ resourceType == 'AWS::EC2::EIP' ]\r\nrule check_ec2_eip_compliance { when %eipresource !empty {configuration.state.name == \"running\" } }",
"DebugLogDeliveryAccounts": ["111122223333"]
}
PolicyText
に AWS CloudFormation Guard のルールを格納しています。改行コードの追加やダブルクオーテーションのエスケープ処理を行っています。
委任先アカウントにおいて、東京リージョンの AWS ClouShell で実行してみます。AWS Cloudshell で実行する場合は上記のmetadata.json
を事前にアップロードしておく必要があります。
$ aws configservice put-organization-config-rule --organization-config-rule-name test-check-ec2-eip --organization-custom-policy-rule-metadata file://metadata.json
{
"OrganizationConfigRuleArn": "arn:aws:config:ap-northeast-1:111122223333:organization-config-rule/test-check-ec2-eip-7v0fq3id"
}
AWS Config のマネジメントコンソールから追加されたカスタムルールを確認してみます。アクションは「再評価」のみ実施できます。ポリシールールを確認することはできないようです。
AWS CLI でも追加されたカスタムルールを確認してみます。マネジメントコンソールと同様にポリシールールであるPolicyText
は確認できないようです。
$ aws configservice describe-config-rules --config-rule-name OrgConfigRule-test-check-ec2-eip-7v0fq3id
{
"ConfigRules": [
{
"ConfigRuleName": "OrgConfigRule-test-check-ec2-eip-7v0fq3id",
"ConfigRuleArn": "arn:aws:config:ap-northeast-1:111122223333:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-ddbgat",
"ConfigRuleId": "config-rule-ddbgat",
"Description": "Evaluates if an Amazon EC2 instance has a public Elastic IP attached and running.",
"Scope": {
"ComplianceResourceTypes": [
"AWS::EC2::Instance"
]
},
"Source": {
"Owner": "CUSTOM_POLICY",
"SourceDetails": [
{
"EventSource": "aws.config",
"MessageType": "ConfigurationItemChangeNotification"
},
{
"EventSource": "aws.config",
"MessageType": "OversizedConfigurationItemChangeNotification"
}
],
"CustomPolicyDetails": {
"PolicyRuntime": "guard-2.x.x",
"PolicyText": "",
"EnableDebugLogDelivery": true
}
},
"ConfigRuleState": "ACTIVE",
"CreatedBy": "config-multiaccountsetup.amazonaws.com"
}
]
}
Config アグリゲータから組織内のアカウントの集約結果を確認します。集約しているアカウントが 2 個の環境とはなりますが、複数アカウントに展開できていることを確認できました。
なお、今回は東京リージョンのみの設定となります。他のリージョンでもルールを展開したい場合は、他のリージョン向けに設定する必要があります。
例えば、バージニア北部リージョンに展開する場合は次のコマンドが展開例となります。
aws configservice put-organization-config-rule \
--organization-config-rule-name test-check-ec2-eip \
--organization-custom-policy-rule-metadata file://metadata.json \
--region us-east-1
Config ルールの削除
最後に、ルールを削除してみます。
削除するコマンドはdelete-organization-config-rule
です。
delete-organization-config-rule — AWS CLI 2.7.35 Command Reference
delete-organization-config-rule — AWS CLI 1.25.83 Command Reference
削除する際に指定するカスタムルール名はルール作成時にorganization-config-rule-name
オプションで指定した値です。OrgConfigRule-
から始まるルール名ではない点に注意が必要です。
$ aws configservice delete-organization-config-rule --organization-config-rule-name test-check-ec2-eip
以上で終わりです。
さいごに
AWS CloudFormation Guard を利用した AWS Config カスタムルールの展開を試してみました。AWS CloudFormation でも試してみたかったのですが、まだ対応していなかったため、またの機会にしたいと思います。
以上、このブログがどなたかのご参考になれば幸いです。