amazon-web-services - 如何使用 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 安装不在其中。我该如何解决这个问题?
解决方案
我认为创建 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"
]
}
}
您可以在此处找到文档。
推荐阅读
- sql - 基于计费周期的用户年度总支出 (SQL)
- typescript - 将多个 vscode 调试配置统一为一个
- ios - Flutter 在为 iOS 构建时卡在“正在运行 Xcode 构建...”
- java - 在 Spring Security 中如何实现 SAML 和自定义身份验证处理程序
- c# - 如果我每隔一小时运行一次 azure WebJob,我会在印度标准时区收到 30 分钟的延迟通知
- r - 有没有更好的方法来组合这些数据框和匹配值?
- ruby-on-rails - 为 bundle exec 指定环境变量
- javascript - Google Maps JS API 中的虚线折线未在 iOS 上显示
- c# - 使用 .exe 文件作为内容文件创建 NuGet 包
- excel - VBA 直接从 Excel 打开嵌入的 Word 文档