gpt4 book ai didi

amazon-web-services - 如何使用 Terraform 格式化和挂载临时磁盘?

转载 作者:行者123 更新时间:2023-12-03 17:16:27 28 4
gpt4 key购买 nike

我正在编写 Packer 和 Terraform 代码以在 aws 上创建一个不可变的基础设施。但是,在磁盘上安装 ext4 并挂载它似乎不是很简单。

步骤看起来很简单:

  • 在包含所有软件的 t2.micro 上使用打包程序创建 ami,首先用于测试,然后用于生产。
  • 从这个 ami 启动一个 r3.4xlarge 实例,它有一个 300GB 的临时磁盘。出于性能原因,将此磁盘格式化为 ext4,挂载它并将/var/lib/docker 重定向到新文件系统。
  • 完成其余的应用程序启动。

  • 首先:

    最佳实践是使用您将使用它的相同实例类型创建 ami 还是拥有一个“通用”镜像并从中启动多实例类型?
    什么哲学是最好的?
  • 打包程序(软件版本)-> terraform(实例 + 挂载磁盘)-> 部署?
  • 打包器(软件版本)-> 打包器(特定于实例类型的安装)-> terraform(实例)-> 部署?
  • 打包程序(软件版本,特定于实例的安装)-> terraform -> 部署?

  • 后者开始看起来越来越好,但每个实例类型都需要一个 ami。

    到目前为止我尝试过的:

    根据 this answer最好使用 user_data 工作方式而不是供应商方式。所以我要走那条路。

    This answer看起来很有希望,但太旧了,它不再起作用了。我可以更新它,但可能有不同的更好的方法。

    This answer似乎也很有希望,但提示 ${DEVICE}。我想知道该变量来自哪里,因为 template_file 中没有指定变量。如果我将自己的 DEVICE 变量设置为 xvdb,则它会运行,但不会产生结果,因为 xvdb 在 lsblk 中可见但在 blkid 中不可见。

    这是我的代码。 format_disks.sh 文件与 the one mentioned above 相同.任何帮助是极大的赞赏。
    # Create a new instance of the latest Ubuntu 16.04 on an
    # t2.micro node with an AWS Tag naming it "test1"
    provider "aws" {
    region = "us-east-1"
    }

    data "template_file" "format-disks" {
    template = "${file("format_disk.sh")}"

    vars {
    DEVICE = "xvdb"
    }
    }

    resource "aws_instance" "test1" {
    ami = "ami-98181234"
    instance_type = "r3.4xlarge"
    key_name = "keypair-1" # This needs to be changed so multiple users can use this
    subnet_id = "subnet-a0aeb123" # maps to the vpc for the us production
    associate_public_ip_address = "true"
    vpc_security_group_ids = ["sg-f3e91234"] #backendservers
    user_data = "${data.template_file.format-disks.rendered}"
    tags {
    Name = "test1"
    }
    ephemeral_block_device {
    device_name = "xvdb"
    virtual_name = "ephemeral0"
    }
    }

    最佳答案

    让我谈谈我对这个话题的看法。
    我认为 cloud-init 是 AWS 的关键,因为您可以动态创建您想要的机器。
    首先,尝试更改一些全局脚本,将在您的机器启动时使用。然后,您应该将该脚本添加为用户数据 我建议您同时使用 ec2 自动缩放,因此,如果您更改 cloud-init 脚本,您可能会终止该实例,另一个将自动创建。
    我的结构目录。

    .
    |____main.tf
    |____templates
    | |____cloud-init.tpl
    main.tf
    provider "aws" {
    region = "us-east-1"
    }

    data "template_file" "cloud_init" {
    template = file("${path.module}/templates/cloud-init.tpl")
    }

    data "aws_ami" "linux_ami" {
    most_recent = "true"
    owners = ["amazon"]

    filter {
    name = "name"
    values = ["amzn2-ami-hvm-2.0.????????.?-x86_64-gp2"]
    }
    }

    resource "aws_instance" "test1" {
    ami = data.aws_ami.linux_ami.image_id
    instance_type = "r3.4xlarge"
    key_name = "keypair-1"
    subnet_id = "subnet-xxxxxx"
    associate_public_ip_address = true
    vpc_security_group_ids = ["sg-xxxxxxx"]
    user_data = data.template_file.cloud_init.rendered
    root_block_device {
    delete_on_termination = true
    encrypted = true
    volume_size = 10
    volume_type = "gp2"
    }

    ebs_block_device {
    device_name = "ebs-block-device-name"
    delete_on_termination = true
    encrypted = true
    volume_size = 10
    volume_type = "gp2"
    }

    network_interface {
    device_index = 0
    network_interface_id = var.network_interface_id
    delete_on_termination = true
    }

    tags = {
    Name = "test1"
    costCenter = "xxxxx"
    owner = "xxxxx"
    }
    }
    模板/云初始化.tpl
    #!/bin/bash -x 

    yum update -y
    yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
    systemctl enable amazon-ssm-agent
    systemctl start amazon-ssm-agent

    pip install aws-ssm-tunnel-agent

    echo "[INFO] SSM agent has been installed!"
    # More scripts here.
    您想要附加一个临时磁盘吗?您是否尝试将 root_block_devicedelete_on_terminationtrue 作为值添加?这样在销毁aws ec2实例资源后,磁盘将被删除。这是在 AWS 上节省成本的好方法,但要小心,如果存储的数据不重要或已备份,请使用它。
    如果您需要在此实例上附加外部 ebs 磁盘,您可以使用 AWS API,确保您的机器与您可以使用的磁盘在同一 AZ 中。
    如果您需要一些 bash 脚本,请告诉我,但这很简单。

    关于amazon-web-services - 如何使用 Terraform 格式化和挂载临时磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44800174/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com