关于Terraform(应用篇)
有关Terraform(高级应用篇)
本入门教程中,我们解释了简单的使用方法和配置文件的编写方式。在这里,我们将解释如何构建程序以满足实际需求。
使用方法
使用我的AMI
将配置好环境的实例保存为镜像(我的AMI)并在配置文件中注册此AMI的编号,以便可以轻松地生成与镜像相同的实例。
使用userdata来启动任意的shell脚本
利用userdata功能来在启动时执行希望执行的处理。具体来说,准备要启动的shell脚本,然后使用base64进行编码。将编码后的字符串写入指定位置即可完成。
(注意)由于可以访问实例时,用户数据的处理尚未完成,因此不清楚其何时完成处理。
-
- 将必要的文件保存在外部存储中的示例。
-
- 参考网站:使用terraform传递userdata来启动ec2实例并为其指定主机名,需要事先将必要的文件保存在外部存储中。可以创建一个类似于下载该文件的脚本。
-
- 外部存储也有各种各样的选择,需要进行考虑。
-
- [负面因素]
-
- 使用S3时,数据传输需要时间。可以考虑使用其他外部存储方式。
使用ECR的示例。
参考网站:使用Terraform将ECR上的Docker镜像快速部署到EC2,ECR是一种用于保存docker镜像的服务,类似于dockerhub。
事先将创建的镜像推送到ECR上。
[负面因素]
取决于镜像的大小,有可能推送速度较慢。
使用ECS或Fargate。
使用ECS和Fargate这两个docker容器管理服务。参考网站:
-
- AWS FargateとTerraformで最強&簡単なインフラ環境を目指す
-
- TerraformでECSのService Discoveryを使う
- TerraformでECS環境の構築
示例
举例
使用Terraform来创建机器。
所需规格
- OS : ubuntu=18.04
- instance_type : t2.micro
- 開放ポート : 8080, 22
文件结构
ec2.tf
security.tf
terraform.tfvars
variables.tfvars
步骤
-
- resource “aws_key_pair”で使用する公開鍵を設定する。
-
- resource “aws_security_group”でSSH(ポート22)を開く。
-
- resource “aws_instance” で使用しているセキュリティーグループの指定はvpc_security_group_idsを使用。
セキュリティーグループの条件追加・削除する場合にインスタンスを一度削除し作り直すことをしたくない場合はvpc_security_group_idsを利用するといいそう。
程式碼
建立推理服务器
使用EC2搭建API服务器和推理服务器两台。
配置的方法。
-
- terraform的配置 → 实例自身
-
- shell脚本 → 内部配置
- dockerfile → 应用程序
编码
注意事项
连接到实例的方法是通过SSH,并设置安全组。
参考网站:使用 Terraform 登记 key pair 并启动 EC2 实例进行 SSH 连接
设置方法
1. 生成公钥和私钥
$ ssh-keygen -t rsa
请指定保存位置。无需输入密语也可。
密钥将在指定的保存位置生成。
访问方法是:
$ ssh -i ~/.ssh/<名前> <ec2 user>@<ec2 public ip>
2. Terraform配置文件1的重要要素
-
- resource “aws_key_pair”で使用する公開鍵を設定する。
-
- resource “aws_security_group”でSSH(ポート22)を開く。
-
- resource “aws_instance” で使用しているセキュリティーグループの指定はvpc_security_group_idsを使用。
セキュリティーグループの条件追加・削除する場合にインスタンスを一度削除し作り直すことをしたくない場合はvpc_security_group_idsを利用するといいそう。
ec2配置.tf
# アカウントの設定
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
# インスタンスの大まかな設定
resource "aws_instance" "example" {
ami = "ami-09b68f5653871885f" # ubuntu-18.04
instance_type = "t2.micro"
key_name = "${aws_key_pair.auth.id}"
vpc_security_group_ids = ["${aws_security_group.only_ssh_http.id}"]
}
# 用いるSSHキーの設定
resource "aws_key_pair" "auth" {
key_name = "${var.key_name}"
public_key = "${file(var.public_key_path)}"
}
# セキュリティーグループの設定
# この設定はsshとhttpのポートのみ解放
resource "aws_security_group" "only_ssh_http" {
name = "terraform_security_group"
description = "You can Only use ssh and http"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
variables.tf文件
# 変数の設定
# アカウントの設定
# ここに詳細を記入してしまうとコンパイル時点で表示されてしまうため、別ファイルで設定
variable "access_key" {}
variable "secret_key" {}
variable "region" {
default = "ap-northeast-1"
}
# キーの名前
variable "key_name" {
description = "Desired name of AWS key pair"
}
# 公開鍵の設定(以下のように書くことで長文のコメントアウトが可能)
variable "public_key_path" {
description = <<DESCRIPTION
Path to the SSH public key to be used for authentication.
Ensure this keypair is added to your local SSH agent so provisioners can
connect.
Example: ~/.ssh/terraform.pub
DESCRIPTION
}
terraform.tfvars => terraform变量.tfvars
access_key = <自分のアクセスキー>
secret_key = <自分のシークレットキー>
# 秘密鍵の名前
key_name = ""
# 公開鍵のパス
public_key_path = ""
3. 进行
- 実行計画確認
$ 生成terraform计划程序
- 実行
执行 terraform 应用程序
确认
显示 Terraform 的状态。
提示
-
- Terraform職人入門: 日々の運用で学んだ知見を淡々とまとめる
- Ansible と Terraform の違い
也许在terraform中设置和构建实例,
然后使用ansible安装各种中间件,
可能是最佳实践的用法。
- packer と terraform と ansible でインフラを作る