🌐

AWS CDK の --proxy オプションはいつ使うのか?

に公開

はじめに

AWS CDK を使用する際に、cdk --help で確認できるオプションの中に --proxy があります。
このオプションはいつ使うのか?調べて実際に試してみました。

前提知識

AWS CDK とは

AWS CDK (Cloud Development Kit) は、AWS のインフラストラクチャをコードとして定義し、自動的にプロビジョニングできるツールです。IaC(Infrastructure as Code)と呼ばれ、プログラミング言語で書かれたコードを使って、クラウドリソースを定義し、管理を行います。

AWS CDK を利用することで、オペレーションミスの軽減や環境構築の迅速化が期待できます。また、AWS CloudFormation を基盤としており、CDK で作成したコードは最終的に CloudFormation テンプレートに変換されて実行されるため、高い信頼性と互換性を備えています。

プロキシ(Proxy)とは

プロキシ(Proxy)は、クライアントとサーバーの間に位置し、クライアントのリクエストを中継するサーバーです。企業ネットワークなどで使用されることが多く、セキュリティ、キャッシュ、アクセス制限などの目的で利用されます。プロキシサーバーを経由することで、直接インターネットに接続できない環境でも、外部リソースにアクセスできるようになります。

CDK の --proxy オプションとは?

公式ドキュメントの解説

公式ドキュメントには --proxy について以下のような記述があります。ざっくり「指定されたプロキシを使用する」と記載があります。つまり、AWS CDK の --proxy オプションでは、CDK の通信がプロキシサーバーを経由するようになるということでしょう。

--proxy STRING
指定されたプロキシを使用します。
このオプションを指定しない場合、CDK CLI はHTTPS_PROXY環境変数から読み取ります。
必須: はい、デフォルト値 : HTTPS_PROXY環境変数から読み取ります。
AWS CDK CLI コマンドリファレンス

以下のようなユースケースが考えられそうです。

ユースケース

  1. セキュリティ上の理由

一部の企業では、内部ネットワークからの直接的なインターネットアクセスを制限し、プロキシサーバーを経由することで外部への接続を管理しています。CDK を使って AWS リソースを管理する際も、プロキシ経由での接続が必要となります。

  1. 監査やログ管理のため

プロキシサーバーを経由することで、すべての通信を一元的に管理し、監査やログ収集を容易にすることができます。これにより、セキュリティインシデントの発生時に迅速に対応できます。

実際に試すことで理解を深めていきましょう。

CDK の --proxy オプションを試す

構成図

今回はシンプルに、Public Subnet 内の EC2 に Squid をインストールし、AWS CDK でプロキシを指定して S3 をデプロイします。Squid のログにて、CloudFormation のアクセスログが出力されていれば成功です。

バージョン

ツール バージョン
CDK 2.155.0
Node.js v18.20.4

構築

1. EC2 インスタンスの構築

EC2 インスタンスを Public Subnet に起動します。
Squid 用に SG にて、3128 ポートを空けておきます。
その他は最小構成で構築しました。

2. Squid のインストール

構築した EC2 に対し、Squid をインストールします。

sudo yum update -y
sudo yum install squid -y
sudo systemctl start squid
sudo systemctl enable squid

3. CDK プロジェクトの作成

CDK プロジェクトを作成します。

mkdir my-cdk-app
cd my-cdk-app
cdk init app --language typescript

スタックを定義します。今回は S3 を構築します。

my-cdk-app-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

export class MyCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.Bucket(this, 'test-cdk-proxy', {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });
  }
}

bin/my-cdk-app.ts も下記のように設定します。

bin/my-cdk-app.ts
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { MyCdkAppStack } from '../lib/my-cdk-app-stack';

const app = new cdk.App();
new MyCdkAppStack(app, 'MyCdkAppStack');

4. デプロイ

それではインスタンス、プロキシを経由して S3 バケットをデプロイしてみます。

cdk deploy --proxy http://ec2-public-ip:3128

エラーもなくデプロイが完了しました。

結果確認

結果を確認します。まずは、S3 が構築されていることを確認。

できていますね。次に、Squid のアクセスログを確認します。

$ sudo cat  /var/log/squid/access.log

1725175615.692    111 x.x.x.x TCP_TUNNEL/200 7478 CONNECT sts.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/54.239.96.27 -
1725175615.883    128 x.x.x.x TCP_TUNNEL/200 6287 CONNECT ssm.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/99.77.58.18 -
1725175616.063    125 x.x.x.x TCP_TUNNEL/200 6311 CONNECT cloudformation.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/54.239.96.156 -
1725175623.788    109 x.x.x.x TCP_TUNNEL/200 6860 CONNECT cdk-hnb659fds-assets-123456789-ap-northeast-1.s3.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/52.219.12.47 -

Squid 側にもログが記録されていました。無事 proxy 経由で CDK デプロイができました。
以上が CDK の --proxy オプションの簡単なデモとなります。

環境削除

忘れずに後片付けもしておきましょう。

cdk destroy --proxy http://ec2-public-ip:3128

CDKコマンド全てプロキシを経由するためには、--proxy オプションのつけ忘れに注意が必要ですね。忘れないためにも環境変数から設定しておいた方が良いかもしれません。

set HTTPS_PROXY=http://your-proxy-address:port
set HTTP_PROXY=http://your-proxy-address:port

まとめ

CDK の --proxy オプションは、特に企業内ネットワークなど、直接インターネットアクセスが制限されている環境で有効に使えそうです。オプションを適切に活用することで、セキュリティポリシーを順守しつつ、AWS リソースのデプロイや管理が可能になります。ユースケースに該当する場合は --proxy オプションを活用を検討してみてください。

Discussion