首页 > 解决方案 > 如何使用 terraform 从创建的实例创建 AWS AMI?

问题描述

我正在使用 wordpress 安装设置 aws 实例,并希望使用创建的实例创建 AMI。下面附上我的代码。

provider "aws" {

    region = "${var.region}"
    access_key = "${var.access_key}"
    secret_key = "${var.secret_key}"
}

resource  "aws_instance" "test-wordpress" {

    ami = "${var.image_id}"
    instance_type = "${var.instance_type}"
    key_name = "test-web"
    #associate_public_ip_address = yes

    user_data = <<-EOF

      #!/bin/bash

      sudo yum update -y
      sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
      sudo yum install -y httpd mariadb-server
      cd /var/www/html
      sudo echo "healthy" > healthy.html
      sudo wget https://wordpress.org/latest.tar.gz
      sudo tar -xzf latest.tar.gz
      sudo cp -r wordpress/* /var/www/html/
      sudo rm -rf wordpress
      sudo rm -rf latest.tar.gz
      sudo chmod -R 755 wp-content
      sudo chown -R apache:apache wp-content
      sudo service httpd start
      sudo chkconfig httpd on

      EOF


    tags = {
      Name = "test-Wordpress-Server"
    }
} 


resource  "aws_ami_from_instance" "test-wordpress-ami" {
    name               = "test-wordpress-ami"
    source_instance_id = "${aws_instance.test-wordpress.id}"

  depends_on = [
      aws_instance.test-wordpress,
      ]

  tags = {
      Name = "test-wordpress-ami"
  }

}

将创建 AMI,但是当我使用该 AMI 创建另一个实例时 wordpress 安装不在其中。我该如何解决这个问题?

标签: amazon-web-servicesterraform

解决方案


我认为创建 AMI 图像的最佳方法是使用 Packer,也来自 Hashicorp,例如 terraform。

什么是打包机?

使用 Packer 配置基础架构 Packer 是 HashiCorp 的开源工具,用于从源配置创建机器映像。您可以为您的特定用例配置带有操作系统和软件的 Packer 映像。

Packer 创建一个具有临时密钥对、security_group 和 IAM 角色的实例。在供应商“shell”中可以自定义内联命令。之后,您可以将此 ami 与您的 terraform 代码一起使用。

示例脚本可能如下所示:

packer {
  required_plugins {
    amazon = {
      version = ">= 0.0.2"
      source  = "github.com/hashicorp/amazon"
    }
  }
}

source "amazon-ebs" "linux" {
  # AMI Settings
  ami_name                      = "ami-oracle-python3"
  instance_type                 = "t2.micro"
  source_ami                    = "ami-xxxxxxxx"
  ssh_username                  = "ec2-user"
  associate_public_ip_address   = false
  ami_virtualization_type       = "hvm"
  subnet_id                     = "subnet-xxxxxx" 
  
  launch_block_device_mappings {
    device_name = "/dev/xvda"
    volume_size = 8
    volume_type = "gp2"
    delete_on_termination = true
    encrypted = false
  }

  # Profile Settings
  profile                       = "xxxxxx"
  region                        = "eu-central-1"
}

build {
  sources = [
    "source.amazon-ebs.linux"
  ]
  provisioner "shell" {
    inline = [
        "export no_proxy=localhost"
    ]
  }
}

您可以在此处找到文档。


推荐阅读