terraform cloudで初めるAWS その3: EC2+EIP
これはシリーズ化する予定なので過去の記事や続きは←リンクからどうぞ。
ちなみに最低限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しましょう。
これでとりあえず起動が確認できるはずです。
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が消されて作り直されているので
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の話をしたいと思います。