AWS CDK の Connections クラスを利用してセキュリティグループルールをシンプルに書いてみた

AWS CDK の Connections クラスを利用してセキュリティグループルールをシンプルに書いてみた

2025.08.29

こんにちは!製造ビジネステクノロジー部の小林です。

AWS CDKでセキュリティグループを作成するたびに、インバウンド(Ingress)とアウトバウンド(Egress)の両方のルールを書いていませんか?

/**
 * セキュリティグループの作成
 */
// EC2 のセキュリティグループ
const appSg = new ec2.SecurityGroup(this, 'AppSg', {
  vpc,
  allowAllOutbound: false,
  description: 'App EC2 SG',
});

// データベースのセキュリティグループ
const dbSg = new ec2.SecurityGroup(this, 'DbSg', {
  vpc,
  allowAllOutbound: false,
  description: 'Postgres DB SG',
});

/** 
 * 冗長な書き方
 */
// ① EC2のセキュリティグループにデータベースへのアウトバウンドルールを追加
appSg.addEgressRule(
  ec2.Peer.securityGroupId(dbSg.securityGroupId),
  ec2.Port.tcp(5432),
  'Allow outbound to DB'
);

// ② データベースのセキュリティグループにEC2からのインバウンドルールを追加
dbSg.addIngressRule(
  ec2.Peer.securityGroupId(appSg.securityGroupId),
  ec2.Port.tcp(5432),
  'Allow inbound from App'
);

スクリーンショット 2025-08-29 1.10.31

このように、ネットワーク通信を許可するたびに2つのルールを書くのは、どうしてもコードが冗長になりがちです。
これではレビューも大変ですし、どちらのセキュリティグループにどのルールを書くべきか迷うこともありますよね。

そこで、CDKのConnectionsクラスが役に立ちます。Connectionsを使うことで、リソース間のネットワークルールを簡潔に定義できるようになります。

今回は、Connectionsを使ったセキュリティグループの実装を試してみました。

Connectionsとは?

AWS CDKのConnectionsクラスは、セキュリティグループのネットワーク接続を管理するためのクラスです。セキュリティグループを個別に設定するのではなく「EC2インスタンスがRDSデータベースに接続する」といったように、リソース間の意図をコードで表現できます。

これにより、CDKが自動で両方のセキュリティグループに必要なインバウンド/アウトバウンドルールを追加してくれるため、手動で冗長なルールを書く必要がなくなります。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Connections.html#allowwbrfromother-portrange-description

Connectionsクラスの主要なメソッド

  • allowTo(): 「自分」からのアウトバウンド接続と、「相手」へのインバウンド接続を同時に許可します
  • allowFrom(): 「相手」からのインバウンド接続と、「自分」へのアウトバウンド接続を同時に許可します
  • allowDefaultPortFrom() / allowDefaultPortTo(): ポート番号を明示せずに、相手のデフォルトポートへの接続を許可します。例えば、RDSならPostgreSQLのポート5432を自動で使ってくれます

Connectionsを使ってみた

では、EC2インスタンスからデータベースへの接続を、allowTo()メソッドを使って書き換えてみます。

/**
 * セキュリティグループの作成
 */
// EC2 のセキュリティグループ
const appSg = new ec2.SecurityGroup(this, 'AppSg', {
  vpc,
  allowAllOutbound: false,
  description: 'App EC2 SG',
});

// データベースのセキュリティグループ
const dbSg = new ec2.SecurityGroup(this, 'DbSg', {
  vpc,
  allowAllOutbound: false,
  description: 'Postgres DB SG',
});

/**
 * これ1行で、必要なIngress/Egressが双方に作られる
 * 「App から Db に接続するのを許可する」という意図を表現
 */
 app.connections.allowTo(db, ec2.Port.tcp(5432), 'App -> DB');

たった1行にすべての設定が集約され、「アプリからデータベースへのアクセスを許可する」という意図が明確になりましたね!

おわりに

今回は、AWS CDKでセキュリティグループを作る際に、Connectionsを利用して冗長性を排除する方法を試してみました。

CDKのConnectionsを使って「誰が、どこへ、なぜ接続するのか」という意図を1行で表現すれば、冗長さを解消するだけでなく、設定漏れも防げそうですね!

この記事が皆さんのお役に立てば幸いです。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.