使用Terraform创建实用的AWS网站基础设施

首先

我叫Naritomo。

我目前从事基础设施工程师的职业。最近我使用Terraform进一步创建了一个AWS的站点基础设施。

如果您能给我一些建议,我会很高兴的。

启动概述

2023-09-11 13.33のイメージ.jpg

在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的人提供帮助。

广告
将在 10 秒后关闭
bannerAds