尝试使用Terraform在Amazon FSx for NetApp ONTAP上进行部署
让我们用Terraform尝试一下Amazon FSx for NetApp ONTAP。
NetApp发布了基于ONTAP技术的全托管存储服务。
这项服务采用了NetApp的高性能存储操作系统ONTAP,支持NFS/CIFS/iSCSI协议,提供了数据去重和压缩等效率功能以及数据传输功能。如果您感兴趣,可以参考这篇博客介绍Amazon FSx for NetApp ONTAP。
在中国,可以很容易地通过AWS控制台启动Amazon FSx for NetApp ONTAP,也可以通过NetApp的CloudManager或Terraform进行部署和启动。
我已经实际尝试过了,现在我会介绍使用Terraform进行部署的步骤。
Terraform处理摘要
使用Terraform执行的过程概要如下图所示。同时,将部署Amazon FSx for NetApp ONTAP所需的AWS资源和用于测试部署的NFS挂载的Linux服务器也一并创建。

使用Terraform提供程序来利用AWS和NetApp Cloud Manager。
使用AWS提供程序创建VPC、子网、Internet GW,并且还要创建Linux服务器以尝试NFS挂载,设置安全组、路由设置和SSH连接所需的密钥对注册。
另外,我们还可以使用NetApp Cloud Manager提供商来部署Amazon FSx for NetApp ONTAP。
*值得一提的是,在撰写本文时,我们也注意到AWS提供商已经实现了Amazon FSx for NetApp ONTAP的功能,关于在AWS上的部署将在另一篇文章中介绍。
Amazon FSx for NetApp ONTAP可以在AWS控制台上进行安装,但与其他NetApp云服务一样,也可以通过Cloud Manager进行安装。
在此页面上,介绍了带有操作界面的安装步骤。只需按照GUI输入信息即可轻松进行安装。
The premise
我正在以下环境中进行测试。假设您已经创建了AWS帐户。
-
- Terrafrom 1.0.3
hashicorp/aws 3.59.0
netapp-cloudmanager 21.9.1
Cloud Manager 3.9.10
CentOS7.7
aws-cli/2.2.41
此外,本文中所描述的步骤和文件并不能保证其功能正常。
希望您能根据各自的环境进行测试和确认,并自行承担责任进行使用。
作业的步骤
按照以下顺序执行操作,部署Amazon FSx for NetApp ONTAP。
-
- 在AWS控制台进行准备
-
- 在NetApp Cloud Central进行准备
-
- 在NetApp Cloud Manager进行准备
-
- 在工作用Linux服务器进行准备
- 执行Terraform
我们假设您已经创建了AWS账户。
1. 在AWS控制台上准备
创建Terraform用户并获取访问密钥和秘密访问密钥信息。
登录到 AWS 控制台,执行以下操作。
【AWS控制台】
1. 從畫面左上角的”服務”中選擇”安全性、識別和合規性”欄中的”IAM”。
2. 從畫面左側選擇”訪問管理”->”使用者”。
3. 點擊”新增使用者”。
4. 在使用者名稱中輸入”terauser11″,勾選”存取金鑰 – 程式存取”,然後點擊”下一步: 存取權限”。
5. 在”新增使用者至群組”欄位中勾選”Administrators”,然後點擊”下一步: 標籤”。
6. 點擊”下一步: 確認”。
7. 點擊”建立使用者”。
8. 確認顯示的存取金鑰ID和秘密存取金鑰資訊*。
*為了保險起見,可以點擊下載”.csv文件”來下載該文件。
建议为应用于用户的高权限组创建并应用另外一条授予权限最低限制的策略。有关详细信息,请参阅NetApp的文档页面。
2. NetApp Cloud Central的准备事项:
创建NetApp Cloud Central账户并获取令牌。
-
- 创建账户
-
- 获取令牌
- 确认Cloud Manager账户ID
请根据另一篇文章中的“1. NetApp Cloud Central准备事项”详细了解操作步骤,并执行上述三项工作。
3. 在NetApp Cloud Central上的准备工作.
在NetApp Cloud Manager上,创建AWS FSx凭证,包括注册AWS访问密钥等信息。同时,确认Workspace ID。
我們進入Cloud Manager並執行以下操作。
在Cloud Manager中的操作
1. 在Canvas界面上,点击“添加工作环境”
2. 点击“Amazon Web Services”,然后点击“Amazon FSx for ONTAP”,再点击“下一步”
3. 选择“创建新的”,并输入以下信息。
认证名称:cm-terauser11
AWS访问密钥:”AWS terauser11的访问密钥”
AWS秘密密钥:”AWS terauser11的秘密访问密钥”

4. 在“I have Verified ~”的复选框中勾选,点击“Next”
5. 点击屏幕右上角的“×”按钮
6. 点击屏幕顶部的“所有服务(+8)”,然后点击“时间轴”
7. 确认“Action: Add AWS Credentials”下“Status”列为“Success”
8. 点击屏幕最上方的“Workspace”,然后点击Workspace名字旁边的“···”按钮,确认显示的“Workspace ID”
- 複数のWorkspaceがある場合は 任意のWorkspace名を選択(デプロイ先となります)
「凭证名称」可以自行指定,但如果更改了,请同时修改terraform的.tf文件中的描述。
4. 在使用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文件”。
4-1. 安装AWS命令行界面(AWS CLI)
我将在作业用的Linux服务器上安装AWS CLI。
AWS的网站上提供了安装方法的指南。请参考该指南获取最新信息。
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
4-2. 设置AWS凭证
在Linux服务器上进行操作,设置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
$
另外,关于其他认证凭据设置方法,您可以查阅AWS提供者页面上的信息,根据需要进行参考。
4-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/fsxn目录下,创建以下的.tf文件。
※因为很长所以折叠了。
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
}
提供者 = netapp-cloudmanager
名称 = var.tera-fsxn.name
区域 = var.aws.region
主要子网ID = element(aws_subnet.tera-subnet01.*.id, 1)
次要子网ID = element(aws_subnet.tera-subnet01.*.id, 2)
租户ID = var.tera-fsxn.tenant_id
工作空间ID = var.tera-fsxn.workspace_id
fsx管理员密码 = var.tera-fsxn.fsx_admin_password
吞吐量容量 = var.tera-fsxn.throughput_capacity
存储容量大小 = var.tera-fsxn.storage_capacity_size
存储容量大小单位 = var.tera-fsxn.storage_capacity_size_unit
aws凭证名称 = var.tera-fsxn.aws_credentials_name
路由表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.59.0”
}
netapp-cloudmanager = {
source = “NetApp/netapp-cloudmanager”
version = “21.9.1”
}
}
}
provider “aws” {
region = var.aws.region
profile = var.aws.profile
shared_credentials_file = var.aws.shared_credentials_file
}
provider “netapp-cloudmanager” {
refresh_token = var.r-token
}
第三个提供者配置文件provider.tf
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “3.59.0”
}
netapp-cloudmanager = {
source = “NetApp/netapp-cloudmanager”
version = “21.9.1”
}
}
}
provider “aws” {
region = var.aws.region
profile = var.aws.profile
shared_credentials_file = var.aws.shared_credentials_file
}
provider “netapp-cloudmanager” {
refresh_token = var.r-token
}
变量 “aws” {
默认值 = {
区域 = “ap-northeast-1”
配置文件 = “terauser11”
共享凭据文件 = “~/.aws/credentials”
}
}
变量 “r-token” {
默认值 = “<在NetApp Cloud Central中检查的Token>”
}
变量 “tera-fsxn” {
默认值 = {
名称 = “TerraformAWSFSX”
租户ID = “<填写帐户ID>”
工作空间ID = “<填写工作空间ID>”
fsx_admin密码 = “<fsxadmin用密码>”
吞吐量能力 = 512
存储容量大小 = 1024
存储容量单位 = “GiB”
AWS凭据名称 = “cm-terauser11”
}
}
变量 “tera-network” {
默认值 = {
名称 = “tera-vpc”
CIDR = “172.19.0.0/16”
子网 = {
tera-subnet1 = {
可用区 = “ap-northeast-1a”
CIDR = “172.19.1.0/24”
}
tera-subnet2 = {
可用区 = “ap-northeast-1c”
CIDR = “172.19.2.0/24”
}
tera-subnet3 = {
可用区 = “ap-northeast-1d”
CIDR = “172.19.3.0/24”
}
}
}
}
变量 “tera-linux” {
默认值 = {
AMI = “ami-02892a4ea9bfa2192”
实例类型 = “t2.micro”
标签名 = “terra-lin01”
}
}
请根据环境的不同更新以下内容,在variable.tf文件中声明用于1至3的tf文件所用的变量。
-
- tenant_id : “2.NetApp Cloud Centralでの確認”で確認したCloud Manager アカウントのIDを記載
-
- workspace_id : “3.NetApp Cloud Managerでの確認”で確認した”Workspace ID”を記載
-
- r-token – default : “3.NetApp Cloud Managerでの確認”で確認した”Token”を記載
- fsx_admin_password : fsxadmin用の任意のパスワードを記載(例: Passwd$51)
创建 4-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
5. 执行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.
〜〜出力省略〜〜
在确认了计划中的内容后,执行应用命令,当出现”请输入一个值:”时,输入”yes”并按下回车键,terraform将被实际执行。
虽然Linux服务器等很快就可以创建完毕,但Amazon FSx for NetApp ONTAP的部署可能需要20-30分钟的时间。
要确认任务完成,请在AWS控制台上确认卷已创建或在NetApp Cloud Manager中点击页面顶部的”All Services(+8)”,然后点击”Timeline”,检查Action为”Create FSx Ontap”的”Status”列是否为”Success”(如果为”Pending”表示正在创建)。
Terraform (土壤整理)
$ 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管理控制台上进行以下操作,并确认NFS连接所需的IP地址。
-
- 选择画面左上角的”服务”,然后选择”存储” – “FSx”。
-
- 单击ONTAP – 存储虚拟机。
-
- 勾选目标存储虚拟机,然后点击操作→显示详细信息。
- 在”端点”栏的”NFS IP 地址”中,确认NFS连接所需的IP地址。
我将通过SSH连接到Linux服务器,将FSx for NetApp Ontap的卷文件系统挂载为NFS。
$ 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アドレス":/ /fsx
[ec2-user@ip-xxx-xx-x-xxx ~]$ df
从 Linux 服务器上注销并退出。
shell
[ec2-user@ip-xxx-xx-x-xxx ~]$ sudo 卸载 /fsx
$ 退出
清除环境
请使用terraform destroy命令来删除已部署环境。
在删除其他资源之前,请务必确认删除Amazon FSx for NetApp ONTAP。
按照顺序,先删除Amazon FSx for NetApp ONTAP,然后再删除其他资源。
确认删除Amazon FSx for NetApp ONTAP,并确认删除完成。
请按照以下顺序执行环境的删除。
请注意,如果在本文所述的步骤之外手动更改了FSx for NetApp Ontap的设置等,请在执行以下步骤之前先执行这些设置的删除等操作。
删除操作开始。
$ terraform destroy -target=netapp-cloudmanager_aws_fsx.aws-fsx01
〜〜出力省略〜〜
Enter a value:
↑ yesを入力してEnter
〜〜出力省略〜〜
Destroy complete! Resources: 1 destroyed.
$
Terraform上的输出会立即返回,但这只是发出删除请求,删除过程需要大约15分钟至20分钟的时间。
①确认删除已完成
我将在AWS控制台和NetApp Cloud Manager的界面上进行确认,以确保已经完成了删除。
-
- AWS コンソールで画面左上の”サービス”→”ストレージ” – “FSx”を選択し、該当のファイルシステムが表示されなくなったことを確認
- NetApp Cloud Managerで、画面上部の”All Services(+8)”をクリックして、”Timeline”をクリックし、Action:”Delete FSx Ontap”の”Status”列が”Success”となっていることを確認。(Pendingの場合は削除中)
2. 删除其他资源
请在确认删除 Amazon FSx for NetApp ONTAP 后,删除 AWS 供应商的资源。
$ terraform destroy
〜〜出力省略〜〜
Enter a value:
↑ yesを入力してEnter
〜〜出力省略〜〜
Destroy complete! Resources: 14 destroyed.
$ terraform state list
使用terraform state list命令确认输出是否为空。
总结
我很高兴为您介绍使用Terraform部署Amazon FSx for NetApp ONTAP的步骤。
Amazon FSx for NetApp ONTAP可以很容易地通过AWS控制台进行部署,但是通过自动化同时创建相关资源,可以更容易地准备环境并开始使用。
一旦建立了自动化机制,可以更容易地重复使用步骤和配置,并适用于不熟悉环境构建工作的人尝试的情况。
由于NetApp制品还提供了各种自动化工具,所以如果有其他有趣的案例,我会再次介绍。