⛳
AWSで基礎的なネットワークとサーバーを構築するのに、terraformを使った。
何の話
- Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版を読むに当たって、terraformを用いてAWS resourceを定義した
-
yoshi65/aws_network_server_trainingに
<chapter>-<section>
のtagをつけたので、今後書籍を読む人への参考として
モチベーション
なぜこの本
- 社内でおすすめされていて気になっていた
- ネットワークの構築もサーバーの構築もしたことない
なぜTerraform
- 日常業務でAWS resourceの定義に使用しているため、ハードルが低く、学びがそのまま活きやすい
- 使うときに立てて、使わないときは潰したい
- 楽にクリーンアップしたい
- 立てっぱなしで、お金を垂れ流すのよくない(結果として1週間くらいで終わったので、そこまで気にしなくてよかったかもしれない)
基本的な使い方
準備
Terraform version
% terraform --version
Terraform v0.14.8
+ provider registry.terraform.io/hashicorp/aws v3.20.0
Git cloneとTerraform init
git clone git@github.com:yoshi65/aws_network_server_training.git
cd aws_network_server_training
terraform init
<chapter>-<section>
をやるとき
git checkout <chapter>-<section>
terraform plan
terraform apply
書籍内のconsole上の操作に相応する部分はgit diff
を使えば確認できる
節ごとのメモ
- Console上の操作との差分
- 毎回新しく立てることによる影響を気にしなくていいためのコマンド
2-4
インターネットゲートウェイの作成とvpcへの紐付けるを同時に行う
resource "aws_internet_gateway" "training" {
vpc_id = aws_vpc.training.id
tags = {
Name = "training"
}
}
3-1
固定のAMIを使いたい場合、最新のAmazon Linux 2のAMIを得るコマンド
% aws ssm get-parameter --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 | jq -r '.Parameter.Value'
ami-0f27d081df46f326c
実際は最新のAMIの取得を行う手間を省くためにData sourceを利用
data "aws_ami" "amazon-linux-2" {
most_recent = true
owners = ["amazon"]
filter {
name = "owner-alias"
values = ["amazon"]
}
filter {
name = "name"
values = ["amzn2-ami-hvm*"]
}
}
Training用のssh-key作成(必須)
key-pairの作成は定義しているが、keyの作成は定義していない。
resource "aws_key_pair" "training" {
key_name = "training"
public_key = file("~/.ssh/training.pub")
}
key作成コマンド
% ssh-keygen -t rsa -f ~/.ssh/training
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/yoshi65/.ssh/training.
Your public key has been saved in /Users/yoshi65/.ssh/training.pub.
本当はkey作成についてもTerraformで書いた方が良いと思った。気が向いたら、やりたい。
public ip addressの取得
- tagが
web_server
- statusがrunning
% aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "web_server" and .State.Name == "running") | .PublicIpAddress'
jq
コマンドがない場合は
brew install jq
ssh login
consoleでPublicIpを確認することなく、一行で済む。
% ssh -i ~/.ssh/training ec2-user@$(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "web_server" and .State.Name == "running") | .PublicIpAddress')
sshアクセスできない
デフォルトと思って、ingressの設定をしていなかった。
書籍の通り、ポート22に対して、すべての通信(0.0.0.0/0)を許可するようにした。
追記したのはこの部分
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
4, 8-4
ブラウザで表示する際に、PR_END_OF_FILE_ERROR
のエラーが出る。
consoleからリンクを踏むときなど、ブラウザは勝手にhttpsとするが、httpに書き換える必要があった。
5-3
telnetがない場合
brew install telnet
6-4
立て直すたびに、毎回秘密鍵をコピーする作業が面倒。
トンネルして、ログインすればそれも解決する。
% ssh -o ProxyCommand="ssh -i ~/.ssh/training ec2-user@$(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "web_server" and .State.Name == "running") | .PublicDnsName') -W 10.0.2.10:22" -i ~/.ssh/training ec2-user@10.0.2.10
7-3
ログイン時にエラーがでる。
立て直しによる影響のため、該当しているknownhostsの行を削除してあげることで解決する。
The authenticity of host 'ec2-18-183-196-146.ap-northeast-1.compute.amazonaws.com (18.183.196.146)' can't be established.
ECDSA key fingerprint is SHA256:tg3l15xg2ERyOd8zA9s5pOpYnGikmVdyKBEM7ZeF0oM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-18-183-196-146.ap-northeast-1.compute.amazonaws.com,18.183.196.146' (ECDSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:vni9VuL/GGngGR59HGWqsUvDIndpbXQ3pyzDVtgwTuY.
Please contact your system administrator.
Add correct host key in /Users/yoshi65/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/yoshi65/.ssh/known_hosts:17
ECDSA host key for 10.0.2.10 has changed and you have requested strict checking.
Host key verification failed.
感想
- Terraform便利。
- ただ読んでconsole上で操作するだけでは気づかない部分の学びがあったので、他の書籍についても同様の取り組みをしてみたくなった。
Discussion