AWS CDK の Connections クラスを利用してセキュリティグループルールをシンプルに書いてみた
こんにちは!製造ビジネステクノロジー部の小林です。
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'
);
このように、ネットワーク通信を許可するたびに2つのルールを書くのは、どうしてもコードが冗長になりがちです。
これではレビューも大変ですし、どちらのセキュリティグループにどのルールを書くべきか迷うこともありますよね。
そこで、CDKのConnectionsクラスが役に立ちます。Connectionsを使うことで、リソース間のネットワークルールを簡潔に定義できるようになります。
今回は、Connectionsを使ったセキュリティグループの実装を試してみました。
Connectionsとは?
AWS CDKのConnectionsクラスは、セキュリティグループのネットワーク接続を管理するためのクラスです。セキュリティグループを個別に設定するのではなく「EC2インスタンスがRDSデータベースに接続する」といったように、リソース間の意図をコードで表現できます。
これにより、CDKが自動で両方のセキュリティグループに必要なインバウンド/アウトバウンドルールを追加してくれるため、手動で冗長なルールを書く必要がなくなります。
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行で表現すれば、冗長さを解消するだけでなく、設定漏れも防げそうですね!
この記事が皆さんのお役に立てば幸いです。