背景
VPSに配置したアプリケーションから、AWSのRDSに接続したいという要望がありました。
技術的には可能だと思うのですが、本当にできるのかなどを検証しました。検証は環境を作って、壊してを繰り返します。そういうビルド・アンド・スクラップをしやすくするためにterraformを使用しました。terraformを使用する中で得たワタクシ的なノウハウを記録します。
なお、インターネット経由の通信に特化した内容だけではなく、RDS全般に言えることも書いています。
インターネットからRDSにアクセスするためのノウハウ
VPCの定義
VPCは以下が必要
 |  | 
なお、trueにしないで、未設定(デフォルトがfalse)と以下のようなエラーが出る。
│ Error: creating RDS DB Instance (test-db): InvalidVPCNetworkStateFault: Cannot create a publicly accessible DBInstance.  The specified VPC does not support DNS resolution, DNS hostnames, or both. Update the VPC and then try again
│ 	status code: 400, request id: 0fc9bcc2-e7f5-4e64-9bc6-35c9dcc9f9e3
DBの定義
dbインスタンスは以下を入れる。
publicly_accessible     = true
RDS共通のノウハウ
- storageは20GBないと起動しない
 - AZは2つ設定しないと起動しない(1つはNG)
 - パスワードは8文字以上が必要
 - DBの起動に3分30秒ぐらいかかる
 
destroy時のポイントはskip_final_snapshotをtrueにすることです。
skip_final_snapshot = true
以下の記事を参考にしました。
RDSはリソース削除時にデフォルトでスナップショットの作成が求められるため、terraform destroyを行うためにはtfファイルにskip_final_snapshotのオプションをtrueに指定する必要があります。デフォルトはfalse。本番環境で行う場合は注意しましょう。(AWSのEC2とRDSをTerraformで構築する Terraform3分クッキング - Qiita )
実際の定義
少し変更していますが、以下のような定義になります。参考として。
vpc
resource "aws_vpc" "dev-env" {
    cidr_block = "10.0.0.0/16"
    instance_tenancy = "default"
    enable_dns_support = "true"
    enable_dns_hostnames = "true"
    tags = {
      Name = "dev-env"
    }
}
DB
resource "aws_db_instance" "test-db" {
  identifier           = "test-db"
  allocated_storage    = 20
  storage_type         = "gp3"
  engine               = "postgres"
  engine_version       = "14.6"
  instance_class       = "db.t4g.micro"
  db_name              = "testdb"
  username             = "test"
  password             = "testtest"
  vpc_security_group_ids  = ["${aws_security_group.praivate-db-sg.id}"]
  db_subnet_group_name = "${aws_db_subnet_group.public-db.name}"
  skip_final_snapshot = true
  publicly_accessible     = true
}
