AWS CDK で VPC Block Public Access を設定する

AWS CDK で VPC Block Public Access を設定する

Clock Icon2025.03.22

こんにちは、製造ビジネステクノロジー部の若槻です。

Amazon VPC Block Public Access (BPA) を使用すると、リージョン内のすべての VPC に対するインターネットアクセスをアカウントレベルで制御できます。Internet Gateway や Egress-only Internet Gateway を介したインターネットとの通信を、インバウンド、アウトバウンド、または双方向でブロックすることが可能です。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/security-vpc-bpa.html

VPC Block Public Access は 2024 年 11 月に Amazon VPC の新機能としてリリースされました。この機能により、組織全体のセキュリティポスチャを強化し、意図しないインターネット接続のリスクを軽減することができます。
https://aws.amazon.com/jp/blogs/news/vpc-block-public-access/
https://dev.classmethod.jp/articles/try-vpc-block-public-access/

VPC Block Public Access を設定しない場合は Security Hub で下記の MEDIUM レベルのコンプライアンス違反が検出されるため、有効化することが推奨されています。

  • [EC2.172] EC2 VPC ブロックパブリックアクセス設定は、インターネットゲートウェイトラフィックをブロックする必要があります

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/ec2-controls.html#ec2-172

今回は、VPC Block Public Access の設定を AWS CDK で行う方法を確認してみました。

実装

AWS CDK による VPC Block Public Access の設定は CfnVPCBlockPublicAccessOptions L1 コンストラクトクラスを使用します。L2 コンストラクトは提供されていないため、CloudFormation のリソースを直接操作する必要があります。

設定可能なプロパティは internetGatewayBlockMode のみで、以下の 2 つのブロックモードが選択可能です。

  • block-bidirectional: 双方向のトラフィックをブロック
  • block-ingress: インバウンドトラフィックのみをブロック

双方向のトラフィックをブロックする

まずブロックモード block-bidirectional を指定して VPC Block Public Access を有効化してみます。

lib/constructs/vpc-block-public-access/index.ts
import * as ec2 from "aws-cdk-lib/aws-ec2";
import { Construct } from "constructs";

export class VpcBlockPublicAccessConstruct extends Construct {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // VPC Block Public Access の設定
    new ec2.CfnVPCBlockPublicAccessOptions(this, "VpcBlockPublicAccess", {
      internetGatewayBlockMode: "block-bidirectional", // 双方向のトラフィックをブロック
    });
  }
}

上記をデプロイして VPC ダッシュボードを確認すると、双方向のトラフィックをブロックするモードで Block Public Access が有効化されていることが確認できます。

また「Public access is restricted」という警告メッセージが表示されていますが、これは警告というよりも、むしろ設定が正しく機能していることを示す通知です。

インバウンドトラフィックのみをブロックする

次に、ブロックモード block-ingress を指定して VPC Block Public Access を有効化してみます。

lib/constructs/vpc-block-public-access/index.ts
import * as ec2 from "aws-cdk-lib/aws-ec2";
import { Construct } from "constructs";

export class VpcBlockPublicAccessConstruct extends Construct {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // VPC Block Public Access の設定
    new ec2.CfnVPCBlockPublicAccessOptions(this, "VpcBlockPublicAccess", {
      internetGatewayBlockMode: "block-ingress", // インバウンドトラフィックのみをブロック
    });
  }
}

cdk diff コマンドで internetGatewayBlockMode 変更前後の差分を確認します。

Resources
[~] AWS::EC2::VPCBlockPublicAccessOptions VpcBlockPublicAccess/VpcBlockPublicAccess VpcBlockPublicAccess2C621A3D
 └─ [~] InternetGatewayBlockMode
     ├─ [-] block-bidirectional
     └─ [+] block-ingress

上記変更を CDK デプロイします。VPC Block Public Access の初回設定時に比べてすぐにデプロイが完了しました。

VPC ダッシュボードを確認すると、ステータスが「Updating settings」となっています。L1 コンストラクトだとこういう場合もあるようです。

1,2分待つと、インバウンドトラフィックのみをブロックするモードで Block Public Access が有効化されていることが確認できました。

おわりに

AWS CDK で VPC Block Public Access を設定する方法を確認してみました。

ちなみに今回はアカウント全体設定のみを紹介しましたが、CfnVPCBlockPublicAccessExclusion を使用することで、特定の VPC やサブネットをブロック設定から除外することも可能です。こちらは次回以降に紹介したいと思います。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.