同时开始学习Terraform和AWS
我是 GMO ペパボ 和 ムームードメイン 的工程师@litencatt。
昨天是由@dp42开发的一个作为”Hello, World.”之后的聊天机器人。
今天,自从入职以来,我一直专注于Web开发,但最近我阅读了一本关于AWS和Terraform的基础设施建设的书,基于这本书的内容,我想写一写我尝试了的经历。
要做的事情 zuò de
我們將使用 Terraform 進行 AWS 環境構築,參考「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」的基礎架構及流程。
此外,本次我們將直接內部進入EC2實例進行Apache等各種安裝的指令執行。
目标
我們將在AWS上進行以下環境搭建。
-
- EC2インスタンス x 2台
Webサーバ
インターネットゲートウェイを持つ
Apache(httpd)上でWordPressが動作している
DBサーバ
NATゲートウェイを通してインターネットに接続する
MySQLが起動している
这两个实例存在于同一个VPC上,
我会处理以下具体的AWS资源。
-
- EC2
-
- VPC
-
- サブネット
-
- ルートテーブル
-
- インターネットゲートウェイ
-
- セキュリティグループ
-
- Elastic IP
- NATゲートウェイ
关于我这次所参考的书籍
在这篇文章中,没有对VPC、子网等各种术语进行解释,但我参考的这本书在这方面有非常详细的解释,并且有关如何在AWS上构建环境的图示非常易懂。因此,我认为对于初次接触这些内容的人来说,这是一本非常推荐的书籍。我建议您准备一本这样的书,尝试一下本文中的内容,希望您会喜欢。
Terraform 是什么?
-
- AWSなど様々なサービスProviderに対して、サーバの構築・変更・管理を行うためのツール
HashiCorpのプロダクト
Enterprise版もあるみたい
在Pepabo,我们以OpenStack作为我们自己的私有云运营系统。
Terraform也支持OpenStack,并且最近各项服务的基础设施管理已经越来越多地使用Terraform进行。
这次我们会在AWS上使用Terraform。
https://www.terraform.io/docs/providers/aws/index.html
这个代码库
备战
Terraform的安装(Mac版)
$ brew install terraform
使用版本
使用2017年12月3日的最新发布版本。
$ terraform version
Terraform v0.11.1
+ provider.aws v1.5.0
主要针对Vim
如果处理HCL文件的话,在你的Vim中安装这个插件似乎很方便。
准备AWS
-
- AWSアカウント作成
https://portal.aws.amazon.com/billing/signup#/start
AWSアクセスキー作成
ユーザーを作成してアクセスキーとシークレットアクセスキーを取得します
また、TerraformよりEC2インスタンス作成するにはAmazonEC2FullAccessのポリシーをグループに対してアタッチしておく必要があります
参考: https://qiita.com/miwato/items/291c7a8c557908de5833
terraform.tfvars文件的配置
这次我们将AWS的访问密钥等机密信息保存在terraform.tfvars文件中。
请在这里设置创建的访问密钥和密钥访问密钥。
如果要更改区域等内容,请根据需要进行更改。
access_key = "AWS_ACCESS_KEY"
secret_key = "AWS_SECRET_KEY"
region = "ap-northeast-1"
key_name = "KEY_PAIR_NAME"
请注意不要将包含实际访问密钥等信息的terraform.tfvars文件提交到存储库中。
登录EC2实例时所需的密钥文件。
这次我们在AWS的仪表板上创建了一个密钥对,并指定在创建EC2实例时使用它。因此,请在key_name中设置所创建的密钥对名称。
另外,由于登录到EC2实例时需要使用,最好将生成的密钥对文件放在同一目录下。
创建虚拟专用云 (VPC)
首先创建一个VPC。
variable "access_key" {}
variable "secret_key" {}
variable "region" {}
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
resource "aws_vpc" "vpc-1" {
cidr_block = "10.0.0.0/16"
tags {
Name = "vpc-1"
}
}
在创建main.tf文件后,执行$ terraform init命令,以获取AWS的插件。
顺便说一下,自v0.11.0起,如果使用$ terraform apply命令进行应用,需要输入下面的yes才会执行应用的更改。
$ terraform apply
(省略)
Plan: 15 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
如果在没有进行初始化的情况下执行计划等,会出现错误。
请先执行 terraform init
$ terraform plan
Plugin reinitialization required. Please run "terraform init".
Reason: Could not satisfy plugin requirements.
...(略
以下是其中国语的同义词:在下一阶段之工作。
由于将所有的工作内容都写在文章中可能会变得很冗长,所以请参考各自的PR来了解后续的工作内容。
我们创建了PR并清晰地说明了步骤和差异,并在必要时添加了说明。
另外,为了进行确认,在每个PR中都执行了$ terraform apply。
-
- パブリックサブネットの作成
-
- インターネットゲートウェイの作成
-
- パブリックルートテーブルの作成
-
- tfファイルの分割
-
- EC2インスタンス(Webサーバ)の作成
-
- WebサーバへのElastic IPの適用
-
- Webサーバのセキュリティグループへアウトバウンド設定追加
-
- WebサーバへのApacheインストールなど
-
- プライベートサブネットの作成〜DBサーバ作成
- NATゲートウェイの作成〜各種インストール
确认WordPress页面的显示
请注意,由于此文章中创建的实例已经被销毁,因此无法访问 PR 上的 URL。
尝试使用Terraform来搭建AWS环境。
-
- 例えばEC2を作成した場合、未設定項目はデフォルト設定が適用される
ネットワークインターフェースはeth0が追加される
ストレージもgp2, 8GiBのタイプが適用される
ICMPエコー許可設定
サーバに対してpingを有効にするためにセキュリティグループにICMPの許可設定を追加する場合に、通常はfrom_port、to_portにはポート番号を設定しますがICMPを追加する場合はICMP番号という番号で指定しなければならないようです
vpc.tf
resource “aws_security_group” “web-sg” {
…
+ ingress {
+ from_port = 8
+ to_port = 0
+ protocol = “icmp”
+ cidr_blocks = [“0.0.0.0/0”]
+ }
Elastic IPはデフォルトの上限が5
Amazon Elastic Compute Cloud (Amazon EC2) 制限
それを超えた場合、apply時にエラーが出ます(エラーなどの詳細は下記リンク参照ください)
NATゲートウェイの作成
請求料金などについて
Elastic IPやNATゲートウェイは使用していない時は開放する
ダッシュボード上のリソースの使用数表示はリージョン毎らしいので注意する
AWSで無料枠を利用し「Elastic IP」も全て解放済みのはずなのに料金が発生した件の原因と対応
以后的未来
-
- lifecycleを使ってリソースの再作成が必要以上に行われないようにする
-
- 最新のAMIが常に指定されるようなami設定にする
Basic Two-Tier AWS Architectureなファイル運用にする
moduleを使ってみる
AWS VPC Terraform module
最后
这次,我主要使用Terraform在AWS上构建了WordPress环境。不仅仅是WordPress环境,连Node.js和Rails等环境也可以在约10秒内轻松建立起来,这是Lolipop!托管云的β版,目前正在免费公开。请务必也去试试:https://mc.lolipop.jp/
我参考了一个网站。
-
- AWSでTerraformに入門
- Terraformで複数台のEC2インスタンスを構築する場合のTIPS
等等,有许多选项