当前位置: 首页 > 知识库问答 >
问题:

Terraform导入想要强制存储网关缓存的新资源后申请Terraform

仇承志
2023-03-14

在Terraform支持AWS中的存储网关之前,我通过其他方式创建了三个文件网关。基本上,我使用Terraform来启动支持的BIT(iam策略、s3 bucket、ec2实例、缓存卷),并使用bash脚本进行cli调用来将所有这些整合在一起。效果很好。

现在Terraform支持创建/激活文件网关(包括配置缓存卷),我已经重构了我的Terraform以消除bash脚本。

网关实例和缓存卷是使用以下地形创建的:

resource "aws_instance" "gateway" {
  ami           = "${var.instance_ami}"
  instance_type = "${var.instance_type}"

  # Refer to AWS File Gateway documentation for minimum system requirements.
  ebs_optimized = true
  subnet_id     = "${element(data.aws_subnet_ids.subnets.ids, random_integer.priority.result)}"

  ebs_block_device {
    device_name           = "/dev/xvdf"
    volume_size           = "${var.ebs_cache_volume_size}"
    volume_type           = "gp2"
    delete_on_termination = true
  }

  key_name = "${var.key_name}"

  vpc_security_group_ids = [
    "${aws_security_group.storage_gateway.id}",
  ]
}

实例启动并运行后,bash脚本中的以下片段将查找卷ID并将卷配置为网关缓存:

# gets the gateway_arn and uses that to lookup the volume ID
gateway_arn=$(aws storagegateway list-gateways --query "Gateways[*].{arn:GatewayARN,name:GatewayName}" --output text | grep ${gateway_name} | awk '{print $1}')
volume_id=$(aws storagegateway list-local-disks --gateway-arn ${gateway_arn} --query "Disks[*].{id:DiskId}" --output text)
echo "the volume ID is $volume_id"

# add the gateway cache
echo "adding cache to the gateway"
aws storagegateway add-cache --gateway-arn ${gateway_arn} --disk-id ${volume_id}

这个过程的最终结果是网关在线,配置了缓存卷,但是Terraform状态只知道实例。我随后重构了地形,包括以下内容:

resource "aws_storagegateway_gateway" "nfs_file_gateway" {
  gateway_ip_address = "${aws_instance.gateway.private_ip}"
  gateway_name       = "${var.gateway_name}"
  gateway_timezone   = "${var.gateway_time_zone}"
  gateway_type       = "FILE_S3"
}

resource "aws_storagegateway_cache" "nfs_cache_volume" {
  disk_id     = "${aws_instance.gateway.ebs_block_device.volume_id}"
  gateway_arn = "${aws_storagegateway_gateway.nfs_file_gateway.id}"
}

从那里,我运行以下代码来获取缓存卷的disk_id(注意,我已经编辑了帐户ID和网关ID:

aws storagegateway list-local-disks --gateway-arn arn:aws:storagegateway:us-east-1:[account_id]:gateway/[gateway_id] --region us-east-1

这返回:

{
    "GatewayARN": "arn:aws:storagegateway:us-east-1:[account_id]:gateway/[gateway_id]",
    "Disks": [
        {
            "DiskId": "xen-vbd-51792",
            "DiskPath": "/dev/xvdf",
            "DiskNode": "/dev/sdf",
            "DiskStatus": "present",
            "DiskSizeInBytes": 161061273600,
            "DiskAllocationType": "CACHE STORAGE"
        }
    ]
}

然后,我在aws_storagegateway_cache资源上运行Terraform导入命令,将现有资源拉入状态文件。

我运行的命令:

terraform_11.5 import module.sql_backup_file_gateway.module.storage_gateway.aws_storagegateway_cache.nfs_cache_volume arn:aws:storagegateway:us-east-1:[account_id]:gateway/[gateway_id]:xen-vbd-51792

导入成功完成。然后我运行一个Terraform init和一个Terraform计划,这表明如果我运行一个应用程序,缓存卷将被重新创建。

该计划的产出:

-/+ module.sql_backup_file_gateway.module.storage_gateway.aws_storagegateway_cache.nfs_cache_volume (new resource required)
      id:                     "arn:aws:storagegateway:us-east-1:[account_id]:gateway/[gateway_id]:xen-vbd-51792" => <computed> (forces new resource)
      disk_id:                "xen-vbd-51792" => "1" (forces new resource)
      gateway_arn:            "arn:aws:storagegateway:us-east-1:[account_id]:gateway/[gateway_id]" => "arn:aws:storagegateway:us-east-1:[account_id]:gateway/[gateway_id]"

在导入语句中,我无法为disk_id提供允许完成导入的其他值。我不确定我可以改变什么来避免缓存卷被重新创建,如果运行一个后续的terraform应用

共有1个答案

傅雪松
2023-03-14

我已经找到了解决办法@ydaetskcoR—您关于将卷id映射到磁盘id的评论使我找到了所需的地形,以弥合实例声明和缓存声明之间的差距。

这个Terraform块允许我查找ebs_block_device,以便稍后在Terraform中输出正确的disk_id

data "aws_storagegateway_local_disk" "cache" {
  disk_path   = "/dev/xvdf"
  gateway_arn = "${aws_storagegateway_gateway.nfs_file_gateway.arn}"
}

一旦我添加了这个块,我就重构了配置缓存的Terraform,如下所示:

resource "aws_storagegateway_cache" "nfs_cache_volume" {
  disk_id     = "${data.aws_storagegateway_local_disk.cache.id}"
  gateway_arn = "${aws_storagegateway_gateway.nfs_file_gateway.id}"
}

现在,当我运行terraform initterraform plan时,网关卷不会显示为需要任何更改或替换。

谢谢你帮我找到这个。

-戴夫

 类似资料:
  • 在这里使用谷歌云。我刚刚从GCP向Terraform导入了一个项目资源。我看到了以下问题- 资源没有全面导入。资源项目有多个参数需要设置——每个参数都是自己的资源。正如您在下面看到的,有. project来命名项目,new_service_project将其转换为服务项目,以及该项目的每个启用的API的.project_service[n]。 所有这些都必须手动完成,并通过运行以下单独的命令分别完

  • 我正在尝试缓存多页资源,但是只缓存了6个页面中的4个页面。有人在做这件事时有问题吗?将所有这些页面缓存在内存中效果很好,但将其保存到本地存储不起作用。有我不知道的限制吗?我正在用Chrome进行测试,它有足够的空间来存储我所存储的内容。

  • 我想我调用AWS存储网关refreshCache方法的频率太高了(如消息所示),但我不确定我需要等待多长时间,直到我再次点击它,任何帮助都将是感激的。 com.amazonaws.services.StorageGateway.model.InvalidGatewayRequestException:向服务器发送的请求太多。(服务:AwsStorageGateway;状态代码:400;错误代码:I

  • 问题内容: 是否有可能迫使浏览器刷新缓存的CSS? 这并不是每个请求都那么简单。我们有一个站点已有一段时间稳定的CSS。 现在,我们需要对CSS进行一些重大更新;但是,已缓存CSS的浏览器将在两天内不会收到新CSS,从而导致呈现问题。 有没有一种方法可以强制刷新CSS,还是最好选择特定于版本的CSS URL? 问题答案: 有几件事情需要考虑,有多种方法可以解决。首先,规格 我们要完成什么? 理想情

  • 我正在尝试调用我的类来检查存储权限 但问题是,它不让我在一个类中实现它,我得到了以下错误- "类型权限的方法onRequest estPermissionsResult(int, String[], int[])必须覆盖或实现超类型方法" 类型权限的方法requestPermissions(字符串[],int)未定义 这是我的密码- }

  • Glassfish 3.1.2,Mojarra 2.1.6,SSL已激活 也是一篇关于资源缓存的好文章。在我们的应用服务器中,SSL被激活。我们看到静态资源(图像、脚本、css)没有缓存。 下面是我的测试筛选器: 过期:确定。它是一个静态资源,不会改变,因此我们将到期日期设置在未来的一个月。 上次修改:不确定。我读到,将此设置为过去也会影响缓存 缓存控制:OK。允许安全缓存。安全影响? 此设置是否