VPC Encryption Controls を宣言型ポリシーで Organization 全体に一括適用してみた
はじめに
2026年7月6日、AWS Organizations の宣言型ポリシー(Declarative Policies)で VPC Encryption Controls を一括適用できるようになりました。Organization/OU/アカウント単位での適用に対応しています。
主な変更点は以下のとおりです。
| 項目 | 以前 | 今回 |
|---|---|---|
| 設定単位 | VPC ごとに個別 | Organization/OU/アカウント単位で一括 |
| 管理方法 | VPC オーナーが個別に API 呼び出し | 管理アカウントから宣言型ポリシーで適用 |
| 新規 VPC への適用 | 手動で都度有効化 | ポリシー適用範囲の VPC に自動適用 |
| 変更権限 | VPC オーナーが自由に変更可能 | 宣言型ポリシー管理下ではオーナー変更不可 |
今回は管理アカウントから宣言型ポリシーを作成・アタッチし、enforce への一括遷移、VPC オーナーによる変更ブロック、非対応リソースの作成拒否、除外設定、ポリシーデタッチ後のロールバックを確認しました。
検証内容
検証環境
AWS Organizations 環境で、管理アカウントから宣言型ポリシーを作成し、メンバーアカウントにアタッチする構成です。
VPC Encryption Controls は VPC 単位で課金が発生します。今回利用した東京リージョン(ap-northeast-1)では、monitor または enforce モードが有効な non-empty VPC(ネットワークインターフェースを持つ VPC)ごとに $0.21/時間です。30日換算で月額約 $151.20/VPC となります。宣言型ポリシー自体に追加料金はありません。
メンバーアカウントには以下の VPC が存在する状態で検証を開始しました。
vpc-0aa1111111111111a(192.168.0.0/18、Name: ec2-warp-unified、IPv6 あり、Egress Only Internet Gateway あり)vpc-0bb2222222222222b(172.31.0.0/16、デフォルト VPC)
宣言型ポリシーの作成と適用
まず、管理アカウントで DECLARATIVE_POLICY_EC2 ポリシータイプを有効化します。
aws organizations enable-policy-type \
--policy-type DECLARATIVE_POLICY_EC2 \
--root-id r-xxxx
VPC Encryption Controls を attempt_enforce モードで適用する宣言型ポリシーを作成します。この指定により、条件を満たす VPC は enforce モードへ遷移します。除外リソースは Internet Gateway と NAT Gateway です。
aws organizations create-policy \
--name "VPCEncryptionEnforce" \
--type DECLARATIVE_POLICY_EC2 \
--content '{
"ec2_attributes": {
"vpc_encryption_control": {
"mode": {
"@@assign": "attempt_enforce"
},
"exclusions": {
"@@assign": ["internet_gateway", "nat_gateway"]
}
}
}
}'
作成したポリシー(p-abc1234567)をメンバーアカウントにアタッチします。
aws organizations attach-policy \
--policy-id p-abc1234567 \
--target-id 111122223333
適用後の状態確認
ポリシーアタッチ直後に、メンバーアカウントのアカウントレベルの状態を確認しました。
aws ec2 describe-account-vpc-encryption-control
{
"AccountVpcEncryptionControl": {
"State": "transitions-in-progress",
"Mode": "attempt-enforce",
"Exclusions": {
"InternetGateway": "enabled",
"NatGateway": "enabled",
"EgressOnlyInternetGateway": "disabled",
"VirtualPrivateGateway": "disabled",
"VpcPeering": "disabled",
"Lambda": "disabled",
"VpcLattice": "disabled",
"ElasticFileSystem": "disabled"
},
"ManagedBy": "declarative-policy",
"LastUpdateTimestamp": "2026-07-10T16:13:07.009000+00:00"
}
}
ManagedBy が declarative-policy に変わり、指定した除外設定(InternetGateway、NatGateway)が反映されています。State は transitions-in-progress で、既存 VPC の enforce 状態への遷移が進行中です。
VPC レベルの状態を確認すると、2つの VPC で異なる状態になっていました。
vpc-0bb2222222222222b(デフォルト VPC):enforce-in-progress— Internet Gateway が存在するものの、除外設定に含まれているため enforce へ遷移中vpc-0aa1111111111111a(ec2-warp-unified):enforce-failed— Egress Only Internet Gateway が除外設定に含まれていないため遷移不可
暗号化強制の動作確認
以降のテストは新規作成した VPC(vpc-0cc3333333333333c)を使用しています。
新規 VPC への自動適用
新規 VPC を作成したところ、作成レスポンスの時点で enforce モードが適用されていました。
aws ec2 create-vpc --cidr-block 10.99.0.0/24
作成レスポンスの EncryptionControl フィールドで、State が available になっていることを確認できます。
新規VPC作成時のレスポンス(EncryptionControl 部分)
{
"EncryptionControl": {
"VpcId": "vpc-0cc3333333333333c",
"VpcEncryptionControlId": "vpcec-0ee5555555555555e",
"Mode": "enforce",
"State": "available",
"StateMessage": "succeeded",
"ResourceExclusions": {
"InternetGateway": {"State": "enabled", "StateMessage": "succeeded"},
"NatGateway": {"State": "enabled", "StateMessage": "succeeded"},
"EgressOnlyInternetGateway": {"State": "disabled"},
"VirtualPrivateGateway": {"State": "disabled"},
"VpcPeering": {"State": "disabled"},
"Lambda": {"State": "disabled"},
"VpcLattice": {"State": "disabled"},
"ElasticFileSystem": {"State": "disabled"}
}
}
}
既存 VPC の enforce 遷移には10分以上かかりましたが、新規 VPC は作成時点で State: available が返され、即座に enforce が有効でした。
VPC オーナーによる Encryption Control 変更のブロック
宣言型ポリシー管理下では、VPC オーナーによる Encryption Control の削除・モード変更はいずれも OperationNotPermitted で拒否されます。
削除の試行:
aws ec2 delete-vpc-encryption-control \
--vpc-encryption-control-id vpcec-0ee5555555555555e
An error occurred (OperationNotPermitted) when calling the DeleteVpcEncryptionControl operation:
Configuring encryption-control is not allowed. VPC encryption controls is currently managed at the declarative-policy level.
モード変更の試行:
aws ec2 modify-vpc-encryption-control \
--vpc-encryption-control-id vpcec-0ee5555555555555e \
--mode monitor
同様に OperationNotPermitted で拒否されました。
暗号化非対応リソースのブロック(Egress Only Internet Gateway)
enforce モードの VPC に Egress Only Internet Gateway を作成しようとすると、即座にエラーが返されます。
aws ec2 create-egress-only-internet-gateway \
--vpc-id vpc-0cc3333333333333c
An error occurred (DisallowedByVpcEncryptionControl) when calling the CreateEgressOnlyInternetGateway operation:
egress-only internet gateway cannot be created when VPC encryption is enforced
DisallowedByVpcEncryptionControl という専用のエラーコードで、作成が同期的にブロックされました。
暗号化非対応リソースのブロック(VPC Peering)
今回の構成では、VPC Peering は Egress Only Internet Gateway とは異なり同期エラーにはならず、作成後に非同期で failed に遷移しました。
aws ec2 create-vpc-peering-connection \
--vpc-id vpc-0cc3333333333333c \
--peer-vpc-id vpc-0bb2222222222222b
リクエスト自体は受理され、Peering Connection(pcx-0dd4444444444444d)が作成されました。しかし、ステータスを確認すると自動的に failed に遷移していました。
{
"Status": {
"Code": "failed",
"Message": "Failed due to incorrect VPC-ID, Account ID, overlapping CIDR range, or VPC Encryption Control posture"
}
}
2つのブロックパターンをまとめると以下のとおりです。
| リソース | 失敗タイミング | エラーコード/状態 |
|---|---|---|
| Egress Only IGW | 同期(API 即エラー) | DisallowedByVpcEncryptionControl |
| VPC Peering(今回の構成) | 非同期(作成後に failed 遷移) | Status: failed |
なお、VPC Peering の failed メッセージは複数の失敗要因を列挙する汎用的なものです。今回は VPC ID・アカウント ID・CIDR に問題がないため、Encryption Control posture が原因と判断しています。VPC Peering の作成を自動化している場合は、作成後のステータス確認が必要です。
除外設定の動作確認(Internet Gateway)
aws ec2 create-internet-gateway
# → igw-0aa8888888888888a
aws ec2 attach-internet-gateway \
--internet-gateway-id igw-0aa8888888888888a \
--vpc-id vpc-0cc3333333333333c
Internet Gateway の作成・アタッチとも成功しました。
ポリシーデタッチ後のロールバック
ポリシーをデタッチすると、アカウントレベルの設定は適用前の状態へロールバックされます。今回の検証では、VPC レベルの Encryption Controls は自動削除されず、削除するには VPC ごとの操作が必要でした。
aws organizations detach-policy \
--policy-id p-abc1234567 \
--target-id 111122223333
デタッチ後のアカウントレベルの状態:
{
"AccountVpcEncryptionControl": {
"State": "transitions-successful",
"Mode": "unmanaged",
"ManagedBy": "account"
}
}
ManagedBy が account に戻り、Mode が unmanaged になっています。
VPC レベルの Encryption Control は手動削除が必要でした。
aws ec2 delete-vpc-encryption-control \
--vpc-encryption-control-id vpcec-0bb7777777777777b
# → deleting
aws ec2 delete-vpc-encryption-control \
--vpc-encryption-control-id vpcec-0ee5555555555555e
# → deleting
まとめ
AWS Organizations の宣言型ポリシーにより、Organization/OU/アカウント単位で VPC Encryption Controls を一元管理できることを確認しました。ポリシー指定は attempt_enforce ですが、条件を満たす VPC では VPC レベルで enforce 状態へ遷移します。VPC オーナーによる Encryption Control の変更もブロックされました。
ただし、Encryption Controls が有効な non-empty VPC には VPC 単位で課金が発生します。東京リージョンでは $0.21/時間、30日換算で約 $151.20/VPC です。すべての環境で標準的に有効化する機能というより、明確な統制要件がある環境で採用を検討する機能と捉えるのがよさそうです。
厳格なコンプライアンス要件や社内ガイドラインにより、VPC Encryption Controls の適用を個別アカウント任せにせず、組織レベルで強制したい場合には有効な選択肢になります。適用対象の VPC 数がそのままコストに影響するため、対象範囲と要件を整理した上で利用することをおすすめします。
参考リンク









