説明
0.0.0.0/0と::/0は、AWSサブネットに指定できる有効なCIDRサイズではありません。サブネットには、VPCのアドレス範囲内で対応するサイズを割り当てる必要があります。サブネットのアドレス範囲とルートテーブルの宛先範囲は別のものです。
公開サブネットかどうかは、インターネットゲートウェイへの直接経路などのルーティング構成で決まります。プライベートアドレスを使うだけではデータベースを隔離できないため、RDSのpublicly_accessible設定とセキュリティグループも確認する必要があります。
想定される影響
- 無効なサブネットCIDRにより、デプロイが失敗する可能性があります。
- 公開接続経路と広いアクセス許可が組み合わさると、不要なデータベース接続の試行を許す可能性があります。データへのアクセスには認証と権限も必要です。
対処方法
- VPCのアドレス範囲内で、互いに重複しない有効なサブネットCIDRを使用してください。DBサブネットグループのVPCと、必要なアベイラビリティーゾーンの構成を確認してください。
- 内部接続だけが必要な場合は、インターネットゲートウェイへの直接経路がないサブネットを使い、
publicly_accessibleをfalseに設定してください。ルーティング、ネットワークACL、セキュリティグループで、必要なアプリケーション接続と管理接続だけを許可してください。 - 既存インスタンスのサブネットグループ変更では停止時間が生じる場合があります。
terraform planで置き換えと接続の変更を確認し、バックアップ、復旧、作業時間を計画してから、実際のクライアント接続をテストしてください。
例
以下はサブネットCIDRを比較する部分的な例です。vpc_id、異なるアベイラビリティーゾーンのaz_a・az_b、対応するdb_instance_class、最終スナップショット名を定義してください。例のプライベート範囲はそのVPCに含まれる必要があり、ルーティングと必要なセキュリティグループは別途構成してください。RDSが管理するパスワードとTerraformの状態へのアクセスも保護してください。
変更前
hcl
resource "aws_db_instance" "public_subnet_example" {
allocated_storage = 20
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
skip_final_snapshot = false
final_snapshot_identifier = var.final_snapshot_identifier
publicly_accessible = false
db_subnet_group_name = aws_db_subnet_group.subnetGroup.name
}
resource "aws_db_subnet_group" "subnetGroup" {
name = "main"
subnet_ids = [aws_subnet.frontend.id, aws_subnet.backend.id]
}
resource "aws_subnet" "frontend" {
availability_zone = var.az_a
vpc_id = var.vpc_id
cidr_block = "10.0.1.0/24"
}
resource "aws_subnet" "backend" {
availability_zone = var.az_b
vpc_id = var.vpc_id
cidr_block = "0.0.0.0/0"
}
変更後
hcl
resource "aws_db_instance" "public_subnet_example" {
allocated_storage = 20
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
skip_final_snapshot = false
final_snapshot_identifier = var.final_snapshot_identifier
publicly_accessible = false
db_subnet_group_name = aws_db_subnet_group.subnetGroup.name
}
resource "aws_db_subnet_group" "subnetGroup" {
name = "main"
subnet_ids = [aws_subnet.frontend.id, aws_subnet.backend.id]
}
resource "aws_subnet" "frontend" {
availability_zone = var.az_a
vpc_id = var.vpc_id
cidr_block = "10.0.1.0/24"
}
resource "aws_subnet" "backend" {
availability_zone = var.az_b
vpc_id = var.vpc_id
cidr_block = "10.0.2.0/24"
}
説明:
- 変更前:
backendの/0CIDRはAWSサブネットで使用できないため、この構成はデプロイできません。 - 変更後: 同じVPC内の異なるアベイラビリティーゾーンに、有効なプライベートアドレス範囲を持つサブネットを配置しています。アドレス範囲の修正とは別に、実際のルーティングとアクセス制御を確認してください。