amazon-web-services - 在 terraform 中,如何在目标上拉取 Docker 镜像?

标签 amazon-web-services terraform terraform-provider-aws

Terraform v0.12.x

我正在使用 aws_instance 资源创建一个 AWS EC2 实例,并且我想在目标内提取一个 Docker 镜像(我已使用正确的 AWS 凭证对其进行了设置)。我看到了 docker_image 资源,但是它在我的笔记本电脑上拉取图像,而不是在目标上。

如何在目标上拉取 docker 镜像?我知道我可以使用 user_data,但是还有其他方法吗?

谢谢。

最佳答案

这是可以的,下面的例子是基于this repo 协议(protocol)。

ma​​in.tf -

provider "aws" {
    region = "ap-southeast-1"
}

# Creating key_pair for SSH in AWS instance

resource "tls_private_key" "createkey" {
  algorithm = "RSA"
  rsa_bits  = 4096
}


resource "aws_key_pair" "generated_key" {
  key_name   = "terraform-key"
  public_key = tls_private_key.createkey.public_key_openssh
}

resource "null_resource" "savekey"  {
  depends_on = [
    tls_private_key.createkey,
  ]
    provisioner "local-exec" {
        command = "echo  '${tls_private_key.createkey.private_key_pem}' > wordpress_key.pem"
    }
}



# Creating AWS EC2 Instance with previously created key pair and security group

resource "aws_instance" "webserver" {
  #  Change ami id according to your region
  #  https://github.com/losDaniel/spot-connect/blob/d474cbbf8c2aa02127c445c303d0ac435d88a0d2/build/lib/spot_connect/data/ami_data.csv
  ami           = "ami-0fe1ff5007e7820fd" 
  instance_type = "t2.micro"
  key_name = aws_key_pair.generated_key.key_name
  security_groups = [ "open" ] # your security group name

  connection {
    type     = "ssh"
    user     = "ec2-user"
    private_key = tls_private_key.createkey.private_key_pem
    host     = aws_instance.webserver.public_ip
  }

  provisioner "remote-exec" {
    inline = [
    "sudo yum update -y",
    "sudo yum install git -y",
    "sudo yum install docker -y",
    "sudo service docker start",
    "sudo usermod -a -G docker ec2-user",
    "sudo curl -L \"https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose",
    "sudo chmod +x /usr/local/bin/docker-compose",
    "docker pull mysql:5.7",
    "docker pull wordpress",
    "docker pull phpmyadmin/phpmyadmin",
    "mkdir wordpress_data"   
    ]
  }

  tags = {
    Name = "terraform-docker-pull"
  }

}

# Storing IP address in file
resource "null_resource" "getIp"  {
    provisioner "local-exec" {
        command = "echo  ${aws_instance.webserver.public_ip} > publicip.txt"
    }
}

如果您想针对不同的区域工作,请相应地更新 ami。

验证 docker 已拉入机器:

enter image description here

关于amazon-web-services - 在 terraform 中,如何在目标上拉取 Docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64809479/

相关文章:

amazon-web-services - 地形 : Specifying the working directory when running terraform apply/plan

azure - Terraform - Azure 如何创建 B2C 身份提供商

terraform - Vault - 为一个身份组分配多个别名

amazon-web-services - 如何使用 Terraform 和 cloud-init 安全地允许访问 AWS Secrets Manager

amazon-web-services - 使用 Terraform 将文件传递给新创建的 ec2 实例而不共享 "connection"部分中的私钥

amazon-web-services - Terraform-尽管在同一文件中声明了变量,但找不到变量资源

amazon-web-services - 由于子网无效,无法在 AWS 中创建 VPC

amazon-web-services - 如何为ELB实例安装外部SSL?

php - 如何以编程方式获取实例的公共(public) DNS?

amazon-web-services - 类型不正确。在 vscode 中编辑时,cloudformation yml 文件中应有 "string"