0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第16回 Terraform講座

0
Posted at

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を書く。

ここからさらに一段階、強くなっていこう。💪☁️🚀

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?