尝试使用Terraform在AWS提供商中部署Amazon FSx for NetApp ONTAP
在Terraform中尝试使用Amazon FSx for NetApp ONTAP:AWS提供者版本。
我之前的文章介绍了如何使用Terraform在Amazon FSx for NetApp ONTAP上进行部署,但是现在AWS提供商也可以进行Amazon FSx for NetApp ONTAP的部署。我已经试过了,现在我想介绍一下步骤。
在此方法中,只能通过AWS提供商进行实施,因此可以非常简单地进行部署。另一方面,通过与之前文章介绍的NetApp CloudManager提供商结合使用的方法,可以实施包括Connector的部署,以便进行更便利的使用。请根据使用场景进行选择。
另外,如果你对Amazon FSx for NetApp ONTAP有兴趣,我认为这篇博客介绍可能会对你有参考价值,请查阅。
Terraform处理概览
在执行Terraform的过程中,概述如下图所示。
我们将创建一个Linux服务器,用于部署Amazon FSx for NetApp ONTAP以及其所需的AWS资源和NFS挂载,以测试部署的有效性。

Terraform提供程序将使用AWS提供程序。
使用AWS提供程序创建VPC、子网、Internet GW,并进一步尝试NFS挂载以及进行Linux服务器,安全组设置,路由设置,以及ssh连接密钥对注册。
此外,还将部署Amazon FSx for NetApp ONTAP。
另外,Amazon FSx for NetApp ONTAP可以通过AWS控制台进行部署,也可以通过Cloud Manager与其他NetApp的云服务一样进行部署。这个页面上提供了操作界面和安装步骤的介绍。您只需按照图形界面的指引输入信息,便可轻松部署。
“前提”的中文本地化翻译如下:
我是在以下环境中进行测试的。假设您已经创建了AWS账号。
-
- Terrafrom 1.0.3
hashicorp/aws 3.60.0
CentOS7.7
aws-cli/2.2.41
此外,本文中提及的步骤和文件不能保证其有效运作。请根据各自的环境进行测试和确认后,自行负责使用。
作业的步骤
按照以下顺序进行操作,部署Amazon FSx for NetApp ONTAP。
-
- 在AWS控制台上进行准备
-
- 在工作用Linux服务器上进行准备
- 执行Terraform
假设AWS账户已经创建完成。
1. 在AWS控制台上做准备工作
使用Terraform创建用户,并获取访问密钥和秘密访问密钥信息。
登录AWS控制台并执行以下操作。
【AWS控制台】
1. 從畫面左上角的”服務”選單中,選擇”安全性、身份識別和遵從性”下的”IAM”。
2. 在畫面左側選擇”存取管理”→”使用者”。
3. 點選”新增使用者”。
4. 在使用者名稱欄中輸入”terauser11″,勾選”訪問金鑰 – 程式訪問”,並點選”下一步:訪問權限”。
5. 在”將使用者新增至群組”欄中勾選”管理員”,並點選”下一步:標籤”。
6. 點選”下一步:確認”。
7. 點選”建立使用者”。
8. 確認顯示的訪問金鑰ID和秘密訪問金鑰資訊。
※ 為了安全起見,可以點選”.csv下載”並下載該文件。
建议在上述情况下,为应用到用户的群组创建和应用额外的最低限权限策略,因为该群组具有较高的权限。
请参考NetApp的文档页面获取详细信息。
2. 在Linux服务器上进行准备作业。
我将为Linux服务器准备terraform执行环境。我使用的是CentOS 7。
每个目录和文件的组织和布局基于以下假设。
~/terraform
└─ fsxn
├─ aws-resource.tf
├─ fsxn.tf
├─ provider.tf
├─ variable.tf
└─ ssh_key
├─ tera_ssh_key
└─ tera_ssh_key.pub
如果要更改所述构成的配置目录和文件名,请使用更改”.tf文件”相应参数并使用。
2-1. 安装AWS CLI
我們將在作業用Linux伺服器上安裝AWS CLI。
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
请参考AWS的官网上的指南,了解如何进行安装。
2-2. 设置AWS凭证
我們將在運行Linux作業系統的伺服器上設定AWS認證所需的證書。這些證書是為了terraform使用者而在AWS控制台準備的,我們需要將相關的存取金鑰等資訊配置好。
$ aws configure --profile terauser11
AWS Access Key ID [None]: "terauser11のアクセスキーID"
AWS Secret Access Key [None]: "terauser11のシークレットアクセスキー"
Default region name [None]: ap-northeast-1
Default output format [None]: json
$ aws configure list-profiles
terauser11
$
另外,关于在使用Terraform时设置AWS凭证的方法,请参考AWS提供者页面上的信息,根据需要进行参考。
2-3. Terraform的初始配置设定
我們將在作業用的Linux伺服器上進行初始設定,以便能夠執行Terraform指令。
请在Terraform官网上查看最新的Terraform二进制文件。
$ mkdir ~/terraform
$ cd ~/terraform
$ curl -sL https://releases.hashicorp.com/terraform/1.0.3/terraform_1.0.3_linux_amd64.zip > terraform.zip
$ unzip terraform.zip
$ export PATH=$PATH:~/terraform/
请确认您已按照上述说明正确安装了Terraform,并可以执行以下版本确认命令。
$ terraform --version
Terraform v1.0.3
on linux_amd64
创建一个.tf文件
创建一个用于存放Terraform文件的目录,并将文件放置其中。
首先,创建一个目录来存放.tf文件以及SSH的私钥和公钥密钥文件。
$ mkdir -p ~/terraform/fsxn ~/terraform/fsxn/ssh_key
$ cd ~/terraform/fsxn
在~/terraform/cloud-manager目录下,创建以下的.tf文件。
※这个太长了,所以我折叠起来了。
resource “aws_instance” “terra-lin01” {
ami = var.tera-linux.ami
instance_type = var.tera-linux.instance_type
key_name = aws_key_pair.ec2-ssh_key01.id
vpc_security_group_ids = [aws_security_group.terra-lin01-sg1.id]subnet_id = element(aws_subnet.tera-subnet01.*.id, 0)
tags = {
Name = var.tera-linux.tagname
}
}
resource “aws_eip” “terra-lin01-eip01” {
instance = aws_instance.terra-lin01.id
vpc = true
}
output “public_ip01” {
value = aws_eip.terra-lin01-eip01.public_ip
}
resource “aws_key_pair” “ec2-ssh_key01” {
key_name = “ec2-ssh_key01”
public_key = file(“./ssh_key/tera_ssh_key.pub”)
}
resource “aws_security_group” “terra-lin01-sg1” {
name = “terra-lin01-sg1”
description = “terraform”
vpc_id = aws_vpc.tera-vpc01.id
# SSH access from anywhere
ingress {
from_port = 22
to_port = 22
protocol = “tcp”
cidr_blocks = [“0.0.0.0/0”]
}
ingress {
from_port = 2049
to_port = 2049
protocol = “tcp”
cidr_blocks = [var.tera-network.cidr]
}
egress {
from_port = 0
to_port = 0
protocol = “-1”
cidr_blocks = [“0.0.0.0/0”]
}
tags = {
Name = “allow_tls”
}
}
resource “aws_vpc” “tera-vpc01” {
cidr_block = var.tera-network.cidr
tags = {
Name = var.tera-network.name
}
}
resource “aws_subnet” “tera-subnet01” {
count = length(var.tera-network.subnets)
cidr_block = values(var.tera-network.subnets)[count.index].cidr
availability_zone = values(var.tera-network.subnets)[count.index].availability_zone
tags = {
Name = keys(var.tera-network.subnets)[count.index]
}
vpc_id = aws_vpc.tera-vpc01.id
}
resource “aws_internet_gateway” “tera-vpc01-gw01” {
vpc_id = aws_vpc.tera-vpc01.id
tags = {
Name = “teraform”
}
}
resource “aws_route_table” “tera-vpc01-route-table01” {
vpc_id = aws_vpc.tera-vpc01.id
tags = {
Name = “teraform”
}
}
resource “aws_route” “tera-vpc01-route-table01-route01” {
gateway_id = aws_internet_gateway.tera-vpc01-gw01.id
route_table_id = aws_route_table.tera-vpc01-route-table01.id
destination_cidr_block = “0.0.0.0/0”
}
resource “aws_route_table_association” “tera-vpc01-route-table01-subnet01” {
count = length(var.tera-network.subnets)
subnet_id = element(aws_subnet.tera-subnet01.*.id, count.index)
route_table_id = aws_route_table.tera-vpc01-route-table01.id
}
resource “aws_instance” “terra-lin01” {
ami = var.tera-linux.ami
instance_type = var.tera-linux.instance_type
key_name = aws_key_pair.ec2-ssh_key01.id
vpc_security_group_ids = [aws_security_group.terra-lin01-sg1.id]
subnet_id = aws_subnet.tera-subnet01.id[0]
tags = {
Name = var.tera-linux.tagname
}
}
resource “aws_eip” “terra-lin01-eip01” {
instance = aws_instance.terra-lin01.id
vpc = true
}
output “public_ip01” {
value = aws_eip.terra-lin01-eip01.public_ip
}
resource “aws_key_pair” “ec2-ssh_key01” {
key_name = “ec2-ssh_key01”
public_key = file(“./ssh_key/tera_ssh_key.pub”)
}
resource “aws_security_group” “terra-lin01-sg1” {
name = “terra-lin01-sg1”
description = “terraform”
vpc_id = aws_vpc.tera-vpc01.id
# SSH access from anywhere
ingress {
from_port = 22
to_port = 22
protocol = “tcp”
cidr_blocks = [“0.0.0.0/0”]
}
ingress {
from_port = 2049
to_port = 2049
protocol = “tcp”
cidr_blocks = [var.tera-network.cidr]
}
egress {
from_port = 0
to_port = 0
protocol = “-1”
cidr_blocks = [“0.0.0.0/0”]
}
tags = {
Name = “allow_tls”
}
}
resource “aws_vpc” “tera-vpc01” {
cidr_block = var.tera-network.cidr
tags = {
Name = var.tera-network.name
}
}
resource “aws_subnet” “tera-subnet01” {
count = length(var.tera-network.subnets)
cidr_block = var.tera-network.subnets[count.index].cidr
availability_zone = var.tera-network.subnets[count.index].availability_zone
tags = {
Name = var.tera-network.subnets[count.index]
}
vpc_id = aws_vpc.tera-vpc01.id
}
resource “aws_internet_gateway” “tera-vpc01-gw01” {
vpc_id = aws_vpc.tera-vpc01.id
tags = {
Name = “terraform”
}
}
resource “aws_route_table” “tera-vpc01-route-table01” {
vpc_id = aws_vpc.tera-vpc01.id
tags = {
Name = “terraform”
}
}
resource “aws_route” “tera-vpc01-route-table01-route01” {
gateway_id = aws_internet_gateway.tera-vpc01-gw01.id
route_table_id = aws_route_table.tera-vpc01-route-table01.id
destination_cidr_block = “0.0.0.0/0”
}
resource “aws_route_table_association” “tera-vpc01-route-table01-subnet01” {
count = length(var.tera-network.subnets)
subnet_id = aws_subnet.tera-subnet01.id[count.index]
route_table_id = aws_route_table.tera-vpc01-route-table01.id
}
存储容量 = 1024
子网ID = [“${element(aws_subnet.tera-subnet01.*.id, 1)}”, “${element(aws_subnet.tera-subnet01.*.id, 2)}”]
部署类型 = “MULTI_AZ_1”
吞吐量容量 = 512
首选子网ID = element(aws_subnet.tera-subnet01.*.id, 1)
fsx_admin密码 = var.tera-fsxn.fsx_admin_password
路由表ID = [aws_route_table.tera-vpc01-route-table01.id]
安全组ID = [aws_security_group.terra-lin01-sg1.id]
}
required_providers {
aws = {
source = “hashicorp/aws”
version = “3.60.0”
}
}
}
provider “aws” {
region = var.aws.region
profile = var.aws.profile
shared_credentials_file = var.aws.shared_credentials_file
}
第三个部分提供者配置.tf
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “3.60.0”
}
}
}
provider “aws” {
region = var.aws.region
profile = var.aws.profile
shared_credentials_file = var.aws.shared_credentials_file
}
default = {
name = “TerraformAWSFSX”
region = “ap-northeast-1”
fsx_admin_password = “<fsxadmin用 パスワード>”
throughput_capacity = 512
storage_capacity_size = 1024
storage_capacity_size_unit = “GiB”
}
}variable “tera-network” {
default = {
name = “tera-vpc”
cidr = “172.19.0.0/16”
subnets = {
tera-subnet1 = {
availability_zone = “ap-northeast-1a”
cidr = “172.19.1.0/24”
}
tera-subnet2 = {
availability_zone = “ap-northeast-1c”
cidr = “172.19.2.0/24”
}
tera-subnet3 = {
availability_zone = “ap-northeast-1d”
cidr = “172.19.3.0/24”
}
}
}
}
variable “tera-linux” {
default = {
ami = “ami-02892a4ea9bfa2192”
instance_type = “t2.micro”
tagname = “terra-lin01”
}
}
variable “aws” {
default = {
region = “ap-northeast-1”
profile = “terauser11”
shared_credentials_file = “~/.aws/credentials”
}
}
将以上变量.tf文件中的内容翻译成中文:
变量 “tera-fsxn” {
default = {
name = “TerraformAWSFSX”
region = “亚太地区-东北1”
fsx_admin_password = “<fsxadmin用 密码>”
throughput_capacity = 512
storage_capacity_size = 1024
storage_capacity_size_unit = “GiB”
}
}
变量 “tera-network” {
default = {
name = “tera-vpc”
cidr = “172.19.0.0/16”
subnets = {
tera-subnet1 = {
availability_zone = “亚太地区-东北1a”
cidr = “172.19.1.0/24”
}
tera-subnet2 = {
availability_zone = “亚太地区-东北1c”
cidr = “172.19.2.0/24”
}
tera-subnet3 = {
availability_zone = “亚太地区-东北1d”
cidr = “172.19.3.0/24”
}
}
}
}
变量 “tera-linux” {
default = {
ami = “ami-02892a4ea9bfa2192”
instance_type = “t2.micro”
tagname = “terra-lin01”
}
}
变量 “aws” {
default = {
region = “亚太地区-东北1”
profile = “terauser11”
shared_credentials_file = “~/.aws/credentials”
}
}
请在variable.tf文件中声明在①〜③的tf文件中使用的变量。
请根据环境更新以下项目。
- fsx_admin_password : fsxadmin用の任意のパスワードを記載(例: Passwd$51)
创建2-5个密钥对文件
创建SSH的密钥对和公钥。
(用于连接ec2实例的SSH密钥对)
$ cd ~/terraform/fsxn/ssh_key
$ ssh-keygen -t rsa -f tera_ssh_key -N ''
$ ls -l
-rw------- 1 terauser11 terauser11 xxxx mm月 dd hh:mm tera_ssh_key
-rw-r--r-- 1 terauser11 terauser11 xxx mm月 dd hh:mm tera_ssh_key.pub
3. 执行Terraform
执行terraform来配置Amazon FSx for NetApp ONTAP环境。
首先使用ini命令进行初始化处理,然后使用plan命令确认执行内容。
(在terraform plan中,只进行确认而不执行处理。)
$ cd ~/terraform/fsxn
$ terraform init
Initializing the backend...
Initializing provider plugins...
〜〜出力省略〜〜
Terraform has been successfully initialized!
〜〜出力省略〜〜
$ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
+ create
〜〜出力省略〜〜
Plan: 15 to add, 0 to change, 0 to destroy.
〜〜出力省略〜〜
如果在运行terraform init时出现”Failed to query available provider packages”等错误,可以尝试运行terraform init -upgrade命令(添加-upgrade选项),有时可以避免这个问题,请尝试一下。
在计划确认之后,执行 apply 命令,并在”请输入一个值:”处输入”yes”并按下 Enter 键,则 terraform 将被实际执行。
虽然Linux服务器等的创建可能很快完成,但Amazon FSx for NetApp ONTAP的部署可能需要大约20-30分钟的时间。
请在 AWS 控制台上确认文件系统是否已创建,以确认是否已完成。
$ terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
+ create
〜〜出力省略〜〜
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:
↑ yesを入力してEnter
〜〜出力省略〜〜
Apply complete! Resources: 15 added, 0 changed, 0 destroyed.
Outputs:
public_ip01 = "<< Linuxサーバの EIP >>"
〜〜出力省略〜〜
$ terraform state list
aws_eip.terra-lin01-eip01
aws_instance.terra-lin01
aws_internet_gateway.tera-vpc01-gw01
aws_key_pair.ec2-ssh_key01
aws_route.tera-vpc01-route-table01-route01
aws_route_table.tera-vpc01-route-table01
aws_route_table_association.tera-vpc01-route-table01-subnet01[0]
aws_route_table_association.tera-vpc01-route-table01-subnet01[1]
aws_route_table_association.tera-vpc01-route-table01-subnet01[2]
aws_security_group.terra-lin01-sg1
aws_subnet.tera-subnet01[0]
aws_subnet.tera-subnet01[1]
aws_subnet.tera-subnet01[2]
aws_vpc.tera-vpc01
netapp-cloudmanager_aws_fsx.aws-fsx01
输出:用一行代码,确认Linux服务器的IP地址,然后利用该IP地址进行ssh连接。通过terraform state list命令来确认资源是否显示。
您还可以在AWS控制台上确认。
尝试挂载NFS卷
在AWS控制台上进行以下操作,创建存储虚拟机(SVM)和卷,并确认NFS连接所需的IP地址。
-
- 选择画面左上角的“服务”→“存储”-选择“FSx”
-
- 点击画面左侧的“Ontap”-选择“存储虚拟机”
-
- 点击“创建存储虚拟机”
-
- 选择文件系统,在存储虚拟机名称中输入“terasvm01”,然后点击“确认”按钮
-
- 勾选创建的存储虚拟机,点击操作→显示详细信息
-
- 在端点字段的“NFS IP地址”中,确认NFS连接的IP地址
-
- 点击画面左侧的“ONTAP”-点击“卷”
-
- 点击“创建卷”
- 选择文件系统、虚拟机,将卷名称设为nfsvol01,路径为/nfsvol01,卷大小设为20,然后点击“确认”按钮
从作业用的Linux服务器通过ssh连接到作为EC2实例创建的Linux服务器上,并进行NFS挂载FSx for NetApp ONTAP的卷。
$ ssh -i ssh_key/tera_ssh_key ec2-user@"<< Linuxサーバの EIP >>"
[ec2-user@ip-xxx-xx-x-xxx ~]$ sudo mkdir /fsx
[ec2-user@ip-xxx-xx-x-xxx ~]$ sudo mount "NFS IPアドレス":/nfsvol01 /fsx
[ec2-user@ip-xxx-xx-x-xxx ~]$ df
我会从Linux服务器上注销并卸载。
[ec2-user@ip-xxx-xx-x-xxx ~]$ sudo umount /fsx
$ exit
环境清除
请使用terraform destroy命令来删除已部署的环境。
在删除其他资源之前,请务必确认删除Amazon FSx for NetApp ONTAP。
按照以下顺序进行删除:首先删除Amazon FSx for NetApp ONTAP,然后删除Linux服务器,最后删除其他资源。
删除Amazon FSx for NetApp ONTAP
在手动删除存储虚拟机之后,执行terraform destroy命令。
将在AWS控制台上手动删除创建的存储虚拟机和卷。
-
- 选择画面左上方的”服务”->”存储”-“FSx”
-
- 点击画面左侧的”ONTAP”->”卷”
-
- 选中nfsvol01,点击”操作”->”删除卷”
-
- 选择”否”进行最终备份,勾选复选框,输入”删除”以确认删除,点击”删除卷”
-
- 点击画面左侧的”Ontap”->”存储虚拟机”
-
- 选中terasvm01,点击”操作”->”删除存储虚拟机”
- 点击”删除存储虚拟机”
开始删除处理
我们将在操作用Linux服务器上使用terraform执行删除处理。
只有在确认关联的存储虚拟机已完全删除后,才能成功删除NetApp Ontap的文件系统。请在AWS控制台上确认相关的存储虚拟机已被删除后再执行此操作。
$ terraform destroy -target=netapp-cloudmanager_aws_fsx.aws-fsx01
〜〜出力省略〜〜
Enter a value:
↑ yesを入力してEnter
〜〜出力省略〜〜
Destroy complete! Resources: 1 destroyed.
$
删除处理需要大约10到15分钟的时间。
请确认已完成删除操作。
在AWS管理控制台和NetApp Cloud Manager的界面上,会进行删除完成的确认。
- AWS コンソールで画面左上の”サービス”→”ストレージ” – “FSx”を選択し、該当のファイルシステムが表示されなくなったことを確認
其他资源删除。
请在确认删除Amazon FSx for NetApp ONTAP后,删除AWS提供程序的资源。
$ terraform destroy
〜〜出力省略〜〜
Enter a value:
↑ yesを入力してEnter
〜〜出力省略〜〜
Destroy complete! Resources: 14 destroyed.
$ terraform state list
使用terraform state list命令确认输出是否为空。
在AWS控制台上,还需要根据需要确认资源已被删除。
总结
我們將介紹使用Terraform部署Amazon FSx for NetApp ONTAP的步驟。
由于只能在AWS提供商上操作,与同时使用Cloud Manager提供商相比,准备过程变得简单。然而需要注意的是,您需要手动创建存储虚拟机。
我认为,未来如果功能得到扩展,有可能可以通过Terraform从资源中创建卷,并展开资源。如果有机会再试一试,我会向您介绍。