使用Terraform创建实用的AWS网站基础设施
首先
我叫Naritomo。
我目前从事基础设施工程师的职业。最近我使用Terraform进一步创建了一个AWS的站点基础设施。
如果您能给我一些建议,我会很高兴的。
启动概述

在AWS的两个可用区(AZ)上创建了公有/私有子网。
所有子网中运行着4台启用SSM的服务器。
从私有EC2实例上可以通过NAT网关连接到外部。
私人的EC2实例已连接到ALB上,使用ACM创建的SSL证书可以从外部访问网站。
允许从私有EC2实例连接到RDS服务。
可以启动ElastiCache(Redis),并从私有EC2进行连接。
使用专用域名以便访问RDS/ElastiCache。
前提
请参考以下页面创建一个可以在AWS上创建适当资源的terraform运行环境。
尝试在Docker环境中部署Terraform。
如果不使用Docker,则需确保以下命令可用。
aws
brew
*Terraform導入時に必要
tfenv
*terraform稼働コンテナを利用しない場合は必要
如果不使用容器,安装指定版本(1.5.7)的terraform。
tfenv install
获取Terraform源文件.
在运行terraform的文件夹中执行以下命令。
git clone git@github.com:naritomo08/terraform_main_source.git
cd terraform_main_source
在后续进行文件编辑等操作时,如果觉得git通知很繁琐,
请在创建的文件夹中输入以下命令。
rm -rf .git
创建(基本网络、EC2创建)
进入tfstate文件夹并创建一个用于tfstate的S3。
在创建时,请将”main.tf”中的部分更改为合适的名称。
在EC2菜单的密钥对中,使用”serverkey”名称来注册SSH安全密钥。
请按顺序在下述文件夹内进行资源创建的操作。
在创建资源之前,请将所有工作文件夹内的“backend.tf”和“data.tf”文件中的<バケット名>部分更改为之前步骤中设置的名称。
-
- VPC(ネットワーク作成)
-
- IAM(EC2アクセス用SSMポリシー作成)
-
- privateEC2(プライベートEC2)
- publicEC2(パブリックEC2)
如果不打算直接从外部进行SSH连接,就可以不创建公共EC2实例。
确保创建后的所有EC2实例可以通过会话管理器进行连接。
创建指令。
以下的指令可以创建。
只要一次完成,只需要最后一条命令。
terraform init
terraform plan
terraform apply
→ yesを入力する。
删除方式
以与创建相反的步骤执行删除操作。
可以使用以下命令进行删除。
只要能够完成一次,之后只需要最后一个命令。
terraform destroy
如果只想删除耗费资源的NAT,则可以在VPC文件夹中执行以下命令。
terraform apply -var='enable_nat_gateway=false'
如果只在一个系中创建了NAT网关,但想要在两个系中创建的话,请执行以下命令。
terraform apply -var='single_nat_gateway=false'
只删除一个资源的步骤
terraform state list
→リソース確認
terraform apply --target="リソース名"
→再作成対象のリソース指定
terraform destroy --target="リソース名"
→削除対象のリソース指定
创建RDS
在创建VPC、IAM和私有EC2之后进行操作。
按照日志文件和RDS的顺序,创建数据库。
记下从输出结果中取得的db_instance_this_address的内容(即端点地址)。
使用以下命令来实施RDS密码变更。
aws rds modify-db-instance \
--db-instance-identifier "awsvpc-db-instance" \
--master-user-password "任意のパスワード"
进入publicEC2,并输入以下命令确认登录成功。
sudo dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf -y install mysql mysql-community-client
mysql --version
mysql -h [エンドポイントアドレス] -P 3306 -u awsvpc -p
前の手順で指定したRDSパスワードを入力する。
当不需要使用时,请进入RDS文件夹并将其删除。
如果要将RDS从单一配置变为多可用区配置,则需要执行以下更改。
vi RDS/db_instance.tf
以下の部分を書き換える
変更前> multi_az = false
変更後> multi_az = true
制作ALB
完成此来源后要实施的事项。
请事先进行域名注册并将其注册到Route53的区域。
执行以下文件中的域名设置。
vi main/alb/route53.tf
vi main/alb/acm.tf
name = "<ドメイン名>"部分を書き換える。
将 “log/RDS/s3.tf” 文件中的 部分更换为一个适当的名称。
在publicEC2上使用以下命令启动httpd。
sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on
sudo sudo vi /var/www/html/index.html
以下の文字を入れる。
Website
按照日志/专辑的顺序创建ALB (Application Load Balancer)。
请点击下方链接,查看是否能够成功访问该网站。
https://web.<ドメイン名>/
需要显示“网站”这个词。
如果只想删除高成本的ALB,则在alb文件夹中执行以下命令。
terraform apply -var='enable_nat_alb=false'
Redis弹性缓存创建
在创建 VPC、IAM 和私有 EC2 后执行。
在CACHE中存储并创建一个cache。
源代碼中,根據輸出結果找出 elasticache_replication_group_this_primary_endpoint_address 的值。
记下内容(终端地址)。
执行私有EC2的重启操作。
弹性缓存复制组的主节点端点地址
sudo yum -y install nc
(echo ping;sleep 1) | nc [エンドポイントアドレス] 6379
”+PONG”が返ってくること。
使用CNAME(db.awsvpc.internal/cache.awsvpc.internal)来创建RDS/CACHE。
正在创建VPC/IAM/PrivateEC2/RDS/CACHE。
进入CNAME并创建资源。
进入publicEC2,输入以下命令以确认能够成功登录。
mysql -h db.awsvpc.internal -P 3306 -u awsvpc -p
RDS設定で指定したRDSパスワードを入力する。
(echo ping;sleep 1) | nc cache.awsvpc.internal 6379
”+PONG”が返ってくること。
如果无法获得名称,请重新启动EC2并重试。
提取资源信息(仅在terraform1.5及以上版本中执行)
请提供参考链接。
私有EC2创建后进行
请确认pri_vm01实例的ID。请记下控制台或创建后的private_ec2_1_id的值。
编辑源文件。
vi import.tf
以下の日本語部分をIDに書き換える。
import {
id = "<EC2リソースのID>"
to = aws_instance.source
}
输入以下命令以进行文件输出。
terraform init
terraform plan -generate-config-out=generated.tf
确认在generated.tf文件中输出了私有EC2资源的代码。
在意错误是可以忽略的。
使用时需执行以下处理。
ipv6_addressesについて、頭に#をつけてマスクする。
最後に以下記載を追記する(インポートしたリソースを誤って操作してしまわないようにおまじない)
lifecycle {
ignore_changes = all
}
进一步,只需更改私有IP和标签名称,将import.tf的所有内容替换成占位符后,即可执行plan/apply操作以添加EC2实例。
请在T系列的EC2上将cpu_options部分也掩盖。
您可以在以下页面上确认其他资源。
通过追加 import.tf 中的内容,可以在另一个地方进行提取。
如果想从现有资源中提取信息并将其注册到目标tfstate中,只需执行上述处理,然后将其放入适当的资源文件夹中,并使用apply命令即可完成注册。
如果想要将手动创建的资源注册到Terraform中,也可以使用它。
最後に
我希望本文能对使用Terraform的人提供帮助。