在使用 Terraform 和 AWS Storage Gateway 磁盘时遇到问题
Having trouble with Terraform and AWS Storage Gateway disks
我正在将 Terraform 与 AWS 结合使用,并且能够使用 aws_storagegateway_gateway 资源创建 AWS Storage Gateway 文件网关。
网关将创建并且状态将为 'online' 但是控制台中尚未添加缓存磁盘,这是正常的,因为它必须在创建网关后完成。 VM 确实有一个磁盘,可以将其添加到控制台中,并且在控制台中这样做可以完美地工作。
但是,我正在尝试在创建网关后使用 Terraform 添加磁盘,但似乎无法使代码工作,或者很可能不了解如何使其工作。
尝试使用 aws_storagegateway_cache 资源,但我在 disk_id 上遇到错误,并且不知道如何从网关创建代码将其获取到 return。
可能有人有一个工作示例,说明如何在创建网关后使用 Terraform 添加缓存磁盘,或者知道如何获取 disk_id 以便我可以添加它?
添加代码
provider "aws" {
access_key = "${var.access-key}"
secret_key = "${var.secret-key}"
token = "${var.token}"
region = "${var.region}"
}
resource "aws_storagegateway_gateway" "hmsgw" {
gateway_ip_address = "${var.gateway-ip-address}"
gateway_name = "${var.gateway-name}"
gateway_timezone = "${var.gateway-timezone}"
gateway_type = "${var.gateway-type}"
smb_active_directory_settings {
domain_name = "${var.domain-name}"
username = "${var.username}"
password = "${var.password}"
}
}
resource "aws_storagegateway_cache" "sgwdisk" {
disk_id = "SCSI"
gateway_arn = "${aws_storagegateway_gateway.hmsgw.arn}"
}
output "gatewayid" {
value = "${aws_storagegateway_gateway.hmsgw.arn}"
}
我得到的错误是:
- aws_storagegateway_cache.sgwdisk:添加 Storage Gateway 缓存时出错:InvalidGatewayRequestException:指定的磁盘不存在。
状态码:400,请求ID:fda602fd-a47e-11e8-a1f4-b383e2e2e2f6
我曾尝试像上面那样对 disk_id 进行硬编码或使用变量。关于变量,我不知道它是否被 returned 或存在,所以这可能是问题所在,这是新问题。
如果您使用 AWS cli 运行:aws storagegateway list-local-disks --gateway-arn [your gateway's arn] --region [gateway's region]
,您将获得包含磁盘 ID 的返回数据。
然后,在您的示例代码中,将 SCSI
替换为 "${gateway_arn}:[diskID from command above]"
,您的缓存卷将被创建。
不过我注意到一件事 - 当我完成此操作然后尝试再次应用相同的 Terraform 代码时,在某些情况下,即使在我的 Terraform 中有针对性地部署特定资源,它也想重新部署缓存卷,因为 Terraform 检测到磁盘 ID 正在更改为值“1”。然而,在 Terraform 中将“1”作为值传递似乎不起作用。
在创建资源"aws_storagegateway_cache"之前,使用数据获取磁盘ID。我正在使用以下脚本,它工作正常。
variable "upload_disk_path" {
default = "/dev/sdb"
}
data "aws_storagegateway_local_disk" "upload_disk" {
disk_path = "${var.upload_disk_path}"
gateway_arn = "${aws_storagegateway_gateway.this.arn}"
}
resource "aws_storagegateway_upload_buffer" "stg_upload_buffer" {
disk_id = "${data.aws_storagegateway_local_disk.upload_disk.disk_id}"
gateway_arn = "${aws_storagegateway_gateway.this.arn}"
}
如果您使用两个磁盘(一个用于上传,一个用于存储),请使用相同的代码但设置默认值 cache_disk_path = "/dev/sdc"
这也适用:
variable "disk_path" {
default = "/dev/sdb"
}
provider "aws" {
alias = "primary"
access_key = var.access-key
secret_key = var.secret-key
token = var.token
region = var.region
}
resource "aws_storagegateway_gateway" "hmsgw" {
gateway_ip_address = var.gateway-ip-address
gateway_name = var.gateway-name
gateway_timezone = var.gateway-timezone
gateway_type = var.gateway-type
smb_active_directory_settings {
domain_name = var.domain-name
username = var.username
password = var.password
}
}
data "aws_storagegateway_local_disk" "sgw_disk" {
disk_path = var.disk_path
gateway_arn = aws_storagegateway_gateway.hmsgw.arn
provider = aws.primary
}
resource "aws_storagegateway_cache" "sgw_cache" {
disk_id = data.aws_storagegateway_local_disk.sgw_disk.id
gateway_arn = aws_storagegateway_gateway.hmsgw.arn
provider = aws.primary
}
我正在将 Terraform 与 AWS 结合使用,并且能够使用 aws_storagegateway_gateway 资源创建 AWS Storage Gateway 文件网关。
网关将创建并且状态将为 'online' 但是控制台中尚未添加缓存磁盘,这是正常的,因为它必须在创建网关后完成。 VM 确实有一个磁盘,可以将其添加到控制台中,并且在控制台中这样做可以完美地工作。
但是,我正在尝试在创建网关后使用 Terraform 添加磁盘,但似乎无法使代码工作,或者很可能不了解如何使其工作。
尝试使用 aws_storagegateway_cache 资源,但我在 disk_id 上遇到错误,并且不知道如何从网关创建代码将其获取到 return。
可能有人有一个工作示例,说明如何在创建网关后使用 Terraform 添加缓存磁盘,或者知道如何获取 disk_id 以便我可以添加它?
添加代码
provider "aws" {
access_key = "${var.access-key}"
secret_key = "${var.secret-key}"
token = "${var.token}"
region = "${var.region}"
}
resource "aws_storagegateway_gateway" "hmsgw" {
gateway_ip_address = "${var.gateway-ip-address}"
gateway_name = "${var.gateway-name}"
gateway_timezone = "${var.gateway-timezone}"
gateway_type = "${var.gateway-type}"
smb_active_directory_settings {
domain_name = "${var.domain-name}"
username = "${var.username}"
password = "${var.password}"
}
}
resource "aws_storagegateway_cache" "sgwdisk" {
disk_id = "SCSI"
gateway_arn = "${aws_storagegateway_gateway.hmsgw.arn}"
}
output "gatewayid" {
value = "${aws_storagegateway_gateway.hmsgw.arn}"
}
我得到的错误是:
- aws_storagegateway_cache.sgwdisk:添加 Storage Gateway 缓存时出错:InvalidGatewayRequestException:指定的磁盘不存在。 状态码:400,请求ID:fda602fd-a47e-11e8-a1f4-b383e2e2e2f6
我曾尝试像上面那样对 disk_id 进行硬编码或使用变量。关于变量,我不知道它是否被 returned 或存在,所以这可能是问题所在,这是新问题。
如果您使用 AWS cli 运行:aws storagegateway list-local-disks --gateway-arn [your gateway's arn] --region [gateway's region]
,您将获得包含磁盘 ID 的返回数据。
然后,在您的示例代码中,将 SCSI
替换为 "${gateway_arn}:[diskID from command above]"
,您的缓存卷将被创建。
不过我注意到一件事 - 当我完成此操作然后尝试再次应用相同的 Terraform 代码时,在某些情况下,即使在我的 Terraform 中有针对性地部署特定资源,它也想重新部署缓存卷,因为 Terraform 检测到磁盘 ID 正在更改为值“1”。然而,在 Terraform 中将“1”作为值传递似乎不起作用。
在创建资源"aws_storagegateway_cache"之前,使用数据获取磁盘ID。我正在使用以下脚本,它工作正常。
variable "upload_disk_path" {
default = "/dev/sdb"
}
data "aws_storagegateway_local_disk" "upload_disk" {
disk_path = "${var.upload_disk_path}"
gateway_arn = "${aws_storagegateway_gateway.this.arn}"
}
resource "aws_storagegateway_upload_buffer" "stg_upload_buffer" {
disk_id = "${data.aws_storagegateway_local_disk.upload_disk.disk_id}"
gateway_arn = "${aws_storagegateway_gateway.this.arn}"
}
如果您使用两个磁盘(一个用于上传,一个用于存储),请使用相同的代码但设置默认值 cache_disk_path = "/dev/sdc"
这也适用:
variable "disk_path" {
default = "/dev/sdb"
}
provider "aws" {
alias = "primary"
access_key = var.access-key
secret_key = var.secret-key
token = var.token
region = var.region
}
resource "aws_storagegateway_gateway" "hmsgw" {
gateway_ip_address = var.gateway-ip-address
gateway_name = var.gateway-name
gateway_timezone = var.gateway-timezone
gateway_type = var.gateway-type
smb_active_directory_settings {
domain_name = var.domain-name
username = var.username
password = var.password
}
}
data "aws_storagegateway_local_disk" "sgw_disk" {
disk_path = var.disk_path
gateway_arn = aws_storagegateway_gateway.hmsgw.arn
provider = aws.primary
}
resource "aws_storagegateway_cache" "sgw_cache" {
disk_id = data.aws_storagegateway_local_disk.sgw_disk.id
gateway_arn = aws_storagegateway_gateway.hmsgw.arn
provider = aws.primary
}