terraform cloudで初めるAWS その3: EC2+EIP

Share on:

これはシリーズ化する予定なので過去の記事や続きは←リンクからどうぞ。

ちなみに最低限AWS使った事ある人(EC2くらい起動した事ある人)向けの記事です

前回まで

  • VPCと
  • サブネットと
  • インターネットゲートウェイと
  • ルートテーブル

をterraformから構築してEC2を通じてインターネットに出られる事を確認しました。

今回はEC2を適当に起動してある程度セットアップしていきます。

値段の面もちょいちょい考えていきます。

AWS Marketplace

AWS Marketplaceとはサードパーティー製のOSを提供してくれる場所でAmazon Linux以外はマーケットプレイスから手に入れにゃなりません。AWSのWebコンソールからポチっていくとあんまり気にならないかもしれないけどterraformで構成する場合はこれをちょっと意識する必要があるわけです。

https://aws.amazon.com/marketplace

今回はDebian Linuxの古いバージョンが欲しいという感じでやってみますが、↑のサイトでギリギリ古い「jessie」とかで検索してみます。

色々あるんですが、金のかかるやつとかからないやつがある点に注意してください。ここでは金のかからないDebian GNU/Linux 8 (Jessie)をsubscribeします。

とはいってみたものの、プライスをみると若干かかるっぽいです

まあ、この辺の値段に納得したらContinue to Subscribeします。

Continue to Configurationします。

ここで、RegionをTokyoに合わせると

1Ami Id: ami-0662319323823ba88

なるものが見えるはずです。これをメモっておき、この画面での作業は終了

EC2起動にあたって

キーペアの作成

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#KeyPairs:

とか。前回はすっ飛ばしましたが、作成されてない場合は作成します。

EIP(ElasticIP)の割り当て

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#Addresses:

グローバルIPを当てたい場合はここで作っておきます。

ただ、作りっぱなしにしてマシンに割り当てして起動していないと課金されるので注意してください。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-ip-charges/

東京リージョンで

10.005USD/1時間 = 0.12USD/24時間 = 3.6USD/30日

と、400円/月に近い値段が課金されていきます。個人の懐には割と少なくない額なので注意してください。

EIPを充てる場合はNameタグにプロジェクトの名前を充てます。ここではvm2-replaceって名前でしたんで、そうします。

この名前付けは重要です。後で利用します。このチュートリアルに従って進めているのであれば、ここは一字一句ただしくworkspaceの名前を入れといてください

EC2をterraformから起動する

さて、ここまで納得し、準備が出来たらEC2インスタンスを起動します。 EC2も、もちろんコストがかかりますが、とりあえずweb.tfでもなんでもいいからtfを作ります。まあここではweb用という意味でweb.tfにしました。

1resource "aws_instance" "web" {
2  instance_type = "t2.micro"
3  ami           = "ami-0662319323823ba88" # jessie
4  subnet_id     = aws_subnet.pub.id
5  key_name      = "xxxxxxx"
6  tags = {
7    Name = "${local.workspace}"
8  }
9}

key_nameはキーペアの名前を与えます。

これが一応最低限起動する設定になるので、これをgit commit → pushしてterraform cloudからapplyしましょう。

パブリックIPの当たってないホストが起動した

これでとりあえず起動が確認できるはずです。

t2.microの値段

ちょっと次に行く前に重要なコストの面を…

https://aws.amazon.com/jp/ec2/pricing/on-demand/

t2.microはCPUx1のメモリ1G、インスタンスストレージにEBSのみという制約があり0.0152USD/時間です。1年間はfree tierありです。

これだけで意味がわかる人はここ読む必要ないやろ。

まあCPUとかメモリはいいとして、とりあえず0.0608USD/時間を計算していくと

10.0152 USD /時
20.3648 USD /24時=1日
310.944 USD /30日

とまあこうなります。おおよそ月額1,200円を目安にしたらいいと思います。

なお、AWSのインスタンスは基本的にこういう格付けになっておりまして

  • nano
  • micro
  • small
  • medium
  • large
  • xlarge

基本倍々になります。だからnanoなら600円、smallなら2400円、mediumなら4800円、といいたい所ですが為替レートで結構変わるのでそれもまた注意。

t2.microのみfree tierが設定されており、12か月無料で使えるという事でついついt2.microで推したくなりますが、t2とかt3とか族に言うt系って奴はCPUの制限があります。詳しくは調べてもらいたいんですが、CPUが暴走したりとかとにかく使い潰すとしばらく使いものにならなくなります。

あと、CPUとかメモリとかの用語はいいとしてここでわからない用語は

  • インスタンスストレージ
  • EBS

でしょうが、インスタンスストレージとは要するに起動に必要なディスクという感じです。デフォルト8Gです。

「インスタンスストレージ」という名前からわかるようにインスタンスを起動するためだけに存在するストレージなので、ここにデータを置いては基本的にはいけません!

(データを置く領域に関してはたぶん次のシナリオで解説します)

だがしかし(ネットワークに戻る)

これは起動はするかもだけど、現状では接続できません。

↑のスクショを見れば一目瞭然のように、「パブリックIPv4アドレス」とかが空になっており、割り当てられてません。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eip

を参考に雑に当ててみましょう。

54.178.32.111が割り当てられました。

destroyすると?

突然ですが!

ここでterraform cloudでworkspaceをdestroyします

terraformのいい所は簡単に構築して簡単に破壊できるという事なので、ここでやってみます。

注意: Workspaceは消さないように

Destroyもplanがあってapplyがあります。内容を一応よくみた方がいいんだけどもまだここでは運用ベースに乗ってないので適当に消します。

ちなみにDestroyは結構失敗するので適当に手で消さにゃならん時もあります。ここだと多分セキュリティグループを作ってないのでデフォルトのセキュリティグループが与えられているため、削除に失敗するっぽいです。その場合は手でセキュリティグループを消します。

で、セキュリティグループの問題はちょっと置いておいて。。。また起動してみます。今度はQueue planから実行します。

起動しなおす

すると、当然といえば当然なんですが、EIPが消されて作り直されているので

EIPが変化してしまった

54.248.212.194が割り当てられました

作り直すたびにIPが変わっていいならこれでもいいんですが、逆引き申請などしている場合はこれは非常にデンジャラスな状態なので、変更します。

というわけでまた、destroyしておきます。

EIPとかセキュリティグループをちゃんとして再構築

今の状態を改めてみますと。

 1resource "aws_eip" "web" {
 2  instance = aws_instance.web.id
 3  vpc      = true
 4}
 5
 6resource "aws_instance" "web" {
 7  instance_type = "t2.micro"
 8  ami           = "ami-0662319323823ba88" # jessie
 9  subnet_id     = aws_subnet.pub.id
10  key_name      = "xxxxxxx"
11  tags = {
12    Name = "${local.workspace}"
13  }
14}

ここまであまり文法には(あえて)踏み込んできませんでしたけどresourceとなっているものはdestroyすると消えます(し、構築すれば増える)。だからEIPも、この状態だとdestroyすると消されてしまって毎回IPが変わるという事になります。

そこで前段でEIPを作っておいたので、これを利用するという事をします。消えては困るものはwebから作るというのが割と法則になってると思います。

作成済みeipを持ってくるには以下のようにします

 1data "aws_eip" "web" {
 2  filter {
 3    name   = "tag:Name"
 4    values = ["${local.workspace}"]
 5  }
 6}
 7
 8resource "aws_eip_association" "eip" {
 9  instance_id   = aws_instance.web.id
10  allocation_id = data.aws_eip.web.id
11}
12
13resource "aws_instance" "web" {
14  instance_type               = "t2.micro"
15  ami                         = "ami-0662319323823ba88" # jessie
16  subnet_id = aws_subnet.pub.id
17  key_name = "xxxxxx"
18  tags = {
19    Name    = "${local.workspace}"
20  }
21}

あとデフォルトセキュリティグループを作りました。これはnetwork.tfに書きました。

 1resource "aws_default_security_group" "default" {
 2  vpc_id = aws_vpc.vpc.id
 3
 4  ingress {
 5    from_port   = -1
 6    to_port     = -1
 7    protocol    = "icmp"
 8    cidr_blocks = ["0.0.0.0/0"]
 9  }
10
11  ingress {
12    from_port   = 22
13    to_port     = 22
14    protocol    = "tcp"
15    cidr_blocks = ["0.0.0.0/0"]
16  }
17
18  egress {
19    from_port   = 0
20    to_port     = 0
21    protocol    = "-1"
22    cidr_blocks = ["0.0.0.0/0"]
23  }
24}

なお、ここではping(ICMP)も通すようにしています。

これで、先程作成したEIPと同じアドレスが割り当てられている事を確認しておきます。

sshしたりpingしたりで一通り確認できたら、destroyした後、もう一度構築してちゃんと復元できる事を確認しておきましょう。

ここまで

ここまでやると以下の知識が身についてるんじゃないかなと思います。

  • EC2ホストの起動
  • Workspace内で構成したもののdestroy
  • ElasticIPの割り当て
  • SSHで接続したりpingを通したり

次はcloud-initか、storageの話をしたいと思います。