AWSで基礎的なネットワークとサーバーを構築するのに、terraformを使った。

2021/03/19に公開

何の話

モチベーション

なぜこの本

  • 社内でおすすめされていて気になっていた
  • ネットワークの構築もサーバーの構築もしたことない

なぜ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上で操作するだけでは気づかない部分の学びがあったので、他の書籍についても同様の取り組みをしてみたくなった。
GitHubで編集を提案

Discussion