RDSを本当に完成させる!
ここまで、AWSのネットワークからアプリケーション、そしてRDSまで、一つずつTerraformで作ってきた。
そして前回までで、
RDS
├── DB Subnet Group ✅
└── Security Group ✅
まで完成した。
でも、まだ最後のピースが残っている。
それが、
DB Instance
今回はついにRDS本体を作る。
そして、この回を終えると……
Terraform初級編、完走!🎉
今日の構成図
ここまで作ってきた構成を整理すると、
Internet
│
▼
ALB
│
▼
EC2
│
▼
┌─────────────┐
│ RDS (MySQL) │
└─────────────┘
▲
│
DB Subnet Group
▲
│
RDS Security Group
RDSについて見ると、
RDS
├── DB Subnet Group ✅
│
├── Security Group ✅
│
└── DB Instance ← 今日ここ!
となる。
今日書くコード
今回はいきなり全部を細かく理解するのではなく、
新しく出てきた部分を中心に学ぶ。
resource "aws_db_instance" "main" {
identifier = "sample-db"
engine = "mysql"
instance_class = "db.t3.micro"
allocated_storage = 20
username = "admin"
password = "xxxxxxxx"
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [
aws_security_group.rds.id
]
publicly_accessible = false
}
今日特に注目するのは、この3つ。
username
password
publicly_accessible = false
今日の問題🔥
Q1
publicly_accessible = false
これを、
publicly_accessible = true
にすると、何が起きると思う?
Q2
なぜ、
username
password
を書く必要があるんだろう?
Q3【今日一番重要】
もし、
publicly_accessible = true
にして、
さらにSecurity Groupで、
0.0.0.0/0
からのアクセスを許可したら、
RDSはどうなると思う?
セキュリティの観点から答えてみよう。
自分で書いてみる
今回、コードの各部分について自分なりに意味を書いてみた。
resource "aws_db_instance" "main" {
DBインスタンスを作成します
identifier = "sample-db"
サンプルDBです
engine = "mysql"
MySQLを使います
instance_class = "db.t3.micro"
db.t3.microがインスタンスクラスです
allocated_storage = 20
20GBの容量です
username = "admin"
admin、この人が使います
password = "xxxxxxxx"
xxxxxxxx、パスワードはこれです
db_subnet_group_name = aws_db_subnet_group.main.name
DBサブネットグループはDBメインサブネットグループにあります
vpc_security_group_ids = [
aws_security_group.rds.id
]
VPCセキュリティグループの中に
RDSセキュリティグループを作ります
publicly_accessible = false
パブリックアクセスをできないようにします
}
そして、問題への回答。
Q1
«パブリックアクセスができるようになる。»
Q2
«特定のユーザーにパスワードを使ってRDSに通信できるようにすることでセキュリティを守る。»
Q3
«誰でも通信できるようになる。»
今回のレビュー🔥
今回も、設計の考え方はかなり良い。
特にQ3の、
«誰でも通信できるようになる»
という答え。
ここは今日一番重要な部分なので、しっかり理解できている。
では、一つずつ見ていこう。
コードレビュー
identifier
identifier = "sample-db"
✅ OK!
これは、
RDS DBインスタンスを識別するための名前
を設定している。
ここで注意したいのが、
DB名(Database Name)とは別物
ということ。
今回は、
identifier
↓
RDSインスタンスを識別する名前
と覚えておけばOK。
engine
engine = "mysql"
✅ OK!
これは、
«MySQLというデータベースエンジンを使用する»
という指定。
RDSではMySQL以外にも、さまざまなデータベースエンジンを利用できる。
instance_class
instance_class = "db.t3.micro"
✅ OK!
これは、
«RDSのコンピューティング性能を決める設定»
と考えればいい。
CPUやメモリなどの性能に関係する。
db.t3.micro
↓
RDSのインスタンスクラス
↓
コンピューティング性能
allocated_storage
allocated_storage = 20
✅ OK!
RDSに確保するストレージ容量。
今回は、
20GB
を指定している。
username
username = "admin"
🔶 ほぼOK!
今回、
«admin、この人が使います»
と説明していた。
もう一歩正確にすると、
«RDSへログインするための管理者ユーザー名»
と考えると分かりやすい。
つまり、
username = "admin"
↓
RDSへ接続するときに使用する
管理者ユーザー名
ということ。
password
password = "xxxxxxxx"
これも考え方はOK。
これは、
«RDSへログインする管理者ユーザーのパスワード»
を設定している。
ただし、ここは実務では非常に重要。
実際の環境で、
password = "mypassword123"
のようにパスワードをTerraformコードへ直接書くのは避けたい。
今後、
Variables
や
Secrets管理
を学ぶと、このあたりも改善できる。
つまり今回のコードは、
学習用として分かりやすくするための書き方
として考えておこう。
db_subnet_group_name
db_subnet_group_name = aws_db_subnet_group.main.name
ここは少し修正。
今回、
«DBサブネットグループはDBメインサブネットグループにあります»
と説明していた。
より正確には、
«このRDSを "main" というDB Subnet Groupに配置する»
という意味。
関係としては、
RDS
↓
DB Subnet Group
↓
Private Subnet A
Private Subnet C
となる。
前回学んだ、
「DB Subnet Group = RDSを配置できる場所の一覧」
につながっている。
vpc_security_group_ids
vpc_security_group_ids = [
aws_security_group.rds.id
]
ここも惜しい!
今回、
«RDSセキュリティグループを作ります»
と書いていた。
でも、このコードでやっているのは、
作成ではなく、RDSへSecurity Groupを付けること。
すでに前回、
resource "aws_security_group" "rds"
でRDS Security Groupを作っている。
そのSecurity Groupを、
vpc_security_group_ids = [
aws_security_group.rds.id
]
によってRDSへ関連付けている。
つまり、
RDS
│
└── RDS Security Group
という関係を作っている。
publicly_accessible
publicly_accessible = false
これは今回の重要ポイント。
"false"なので、
«RDSをパブリックにアクセス可能な構成にしない»
という設定。
今回の構成では、
Internet
↓
ALB
↓
EC2
↓
RDS
という経路にしたい。
RDSへインターネットから直接アクセスさせる必要はない。
Q1:100点💯
問題:
publicly_accessible = false
を、
publicly_accessible = true
にすると?
回答:
«パブリックアクセスができるようになる。»
✅ 100点!
より正確には、
RDSにパブリックIPアドレスを割り当てて、パブリックアクセスが可能な構成にできる
ということ。
ただし、
publicly_accessible = true
にしただけで、
世界中の誰でも接続できる
という意味ではない。
実際の接続可否には、
- Security Group
- ネットワーク経路
- 認証情報
なども関係する。
ここはAWSを理解する上で重要。
Q2:95点🌟
回答:
«特定のユーザーにパスワードを使ってRDSに通信できるようにすることでセキュリティを守る。»
考え方はOK。
より正確にすると、
«RDSへログインするユーザーを認証するため。»
ということ。
イメージは、
RDSへ接続したい
↓
ユーザー名を入力
↓
パスワードを入力
↓
認証
↓
OKならログイン
となる。
つまり、
「誰でもDBに入れる」
↓
×
「認証されたユーザーが接続する」
↓
○
という仕組み。
Q3:100点🔥
問題:
publicly_accessible = true
さらに、
0.0.0.0/0
からの通信を許可したら?
回答:
«誰でも通信できるようになる。»
100点!!
ここは今回一番重要。
例えば、
Internet
│
│
│ 0.0.0.0/0
▼
RDS
という状態になれば、
インターネット上の広範囲の送信元からRDSへ接続を試みられる状態
になる。
さらにDBの認証情報まで突破されれば、
不正アクセス
↓
データ漏えい
↓
重大なセキュリティ事故
につながる可能性がある。
だから今回の構成では、
publicly_accessible = false
として、
Internet
↓
ALB
↓
EC2
↓
RDS
という構成にしている。
今日の理解度
🌟🌟🌟🌟🌟 5 / 5
今回特に良かったのは、
単に、
«"publicly_accessible = false"だから安全!»
で終わらず、
«trueにして、さらに0.0.0.0/0を許可したらどうなる?»
という問いに、
«誰でも通信できるようになる»
と答えられたこと。
AWSでは、
「この設定を変えたら、通信経路はどう変わる?」
と考えることが非常に重要。
🎉 Terraform初級編、完走!
そして……
ここで一区切り。
🎉 Terraform初級編、完走! 🎉
ここまで学んできたものを並べてみよう。
VPC
↓
Subnet
↓
Internet Gateway
↓
Route Table
↓
NAT Gateway
↓
ALB
↓
Listener
↓
Target Group
↓
Target Group Attachment
↓
EC2
↓
Security Group
↓
DB Subnet Group
↓
RDS
さらに、
ALB Security Group
↓
EC2 Security Group
↓
RDS Security Group
という、
通信制御の関係
も作ってきた。
最初と今を比べてみる
最初は、
Terraformって何?
というところから始まった。
そこから、
resourceって何?
Subnetって何?
Route Tableって何?
ALBって何?
Target Groupって何?
Security Groupって何?
DB Subnet Groupって何?
RDSってどう作る?
と、一つずつ理解してきた。
でも今は、
Internet
↓
ALB
↓
EC2
↓
RDS
というAWS環境を見て、
「なぜこの構成になっているのか」
を説明できるようになってきた。
これはかなり大きい。
初級編で身につけたこと
今回の初級編では、
Terraformの文法だけを覚えたわけではない。
むしろ重要だったのは、
AWSの設計
↓
必要なサービス
↓
サービス同士の関係
↓
Terraformでコード化
という考え方。
そして、
作る
だけではなく、
つなぐ
という考え方も学んだ。
例えば、
EC2を作る
↓
Target Groupへ登録する
RDSを作る
↓
DB Subnet Groupを指定する
↓
Security Groupを関連付ける
というように、
AWSでは「リソースを作る」ことと「リソース同士を関係付ける」ことが別になっている。
Terraformを学ぶ上で、この感覚はかなり重要。
そして次回から……
ここから授業が変わる。
今までは、
«「このリソースを作ってみよう」»
という形で進めてきた。
でも、次からは違う。
実務演習編🔥
今度は、
「こんなAWS環境を作ってください」
という要件だけを渡す。
そこから、
要件
↓
構成を考える
↓
AWSサービスを選ぶ
↓
通信経路を考える
↓
Security Groupを考える
↓
Terraformを書く
↓
レビュー
という流れで進める。
つまり、
「コードを教えてもらって書く」
から、
「要件から自分で設計してコードを書く」
へ進む。
🚀 初級編から実務編へ
ここまでの授業では、
Terraform
↓
AWSをコードで作る
ということを学んできた。
これからは、
要件
↓
AWS設計
↓
Terraform
に変わる。
これはかなり大きなステップ。
そして、ここからが本当の意味で、
Terraformを使ってAWS環境を設計する練習
になってくる。
🎓 初級編まとめ
最後に、初級編で覚えておきたいことをまとめる。
① TerraformはAWSをコードで表現する
AWSの構成
↓
Terraform
② 「作る」と「つなぐ」は別
Create
↓
Connect
③ Security Groupは通信を制御する
誰から?
どのポート?
どのプロトコル?
④ DB Subnet GroupはRDSの配置先を決める
どこにRDSを配置できる?
⑤ AWSは障害を前提に設計する
複数AZ
↓
冗長化
↓
高可用性
そして何より、
「なぜ?」
を考える。
これが初級編で一番大きな収穫だった。
🎉 初級編、完走!
VPCから始まって、
ALB、
EC2、
Security Group、
そしてRDSまで。
一つずつコードを書いて、
一つずつ「なぜ?」を考えてきた。
ここまで来たら、もう次は、
自分でAWSを設計してみる番。
🔥 第17回から実務演習編へ。
今度は要件だけを見て、
構成を考えて、Terraformを書く。
ここからさらに一段階、強くなっていこう。💪☁️🚀