使用Terraform从GCR的Docker镜像创建GCE实例

尝试使用Terraform时的各种笔记

Terraform是什么?

10分钟内掌握Terraform

不再使用手册和操作指南来创建云环境,而是使用全部由代码完成的工具。
使用代码进行管理可以更方便地对环境进行版本控制,消除了个人依赖等方面的好处。

我的目标 (我个人的情况下)

在Colaboratory上测试Web爬虫脚本时,
需要在需要整夜运行脚本时快速启动服务器或其他用途。

环境只需要一个选择。

由于默认的CloudShell Docker镜像中已经安装了Terraform,因此无需创建自定义镜像。

假设/假定/条件

已将Docker镜像推送到GCR

(参考)用于 Python 爬虫的 Dockerfile

可以使用Selenium和Beautiful Soup进行网络爬虫,将结果投入到Pandas数据框中,然后通过Dockerfile将数据从Pandas插入到BigQuery。

假设GCP的JSON密钥文件和用于爬虫的Python文件与Dockerfile位于同一目录中。

FROM python:3

ARG project_dir=/selenium/
ARG credential_json=<JSONキーファイル名>

ADD requirements.txt $project_dir
ADD $credential_json $project_dir
ADD <スクレイピングpythonファイル> $project_dir
ENV GOOGLE_APPLICATION_CREDENTIALS ./$credential_json 

WORKDIR $project_dir

RUN apt-get update
RUN apt-get install -y vim less python3-selenium

RUN pip install -r requirements.txt

CMD ["/bin/bash"]
selenium==3.141.0
requests==2.23.0
pandas==1.0.4
bs4==0.0.1
google-cloud-bigquery==1.21.0
pandas-gbq==0.11.0
lxml==4.5.1

创建terraform配置文件(tf文件)

创建一个文件(tf文件),在适当的目录中定义资源。

主要.tf

设定GCE相关各项事务的主文件

provider "google" {
    credentials = "${file("<JSONキーファイル>")}"
    project     = "${var.project_name}"
    region      = "${var.region}"
  }

data "google_compute_network" "default" {
  name = "default"
}

resource "google_compute_instance" "apps-gcp-terraform" {
  name         = "selenium-docker"
  machine_type = "n1-standard-1"
  zone         = "${var.zone}"

  boot_disk {
    auto_delete = true
    initialize_params {
      image = "${var.boot_image_name}"
      type  = "pd-standard"
    }
  }

  metadata = {
    gce-container-declaration = "${var.docker_declaration}"
  }

  network_interface {
    network       = "default"
    access_config {
    }
  }

  service_account {
    email = "<サービスアカウント>"
    scopes = ["cloud-platform"]
  }
}

变量.tf

处理参数的文件

如果要通过Docker镜像创建GCE实例,可以使用container-optimized image作为引导镜像。通过以下命令可以确认当前container-optimized image的版本。

gcloud compute images list --project cos-cloud --no-standard-images
variable "project_name" {
  type    = string
  default = "<プロジェクトID>"
}

variable "region" {
  type    = string
  default = "us-central1"
}

variable "zone" {
  type    = string
  default = "us-central1-a"
}

variable "boot_image_name" {
  type    = string
  default = "projects/cos-cloud/global/images/cos-stable-81-12871-119-0"
}

variable "docker_declaration" {
  type    = string
  default = "spec:\n  containers:\n    - name: selenium-docker\n      image: '<dockerイメージ>'\n      stdin: false\n      tty: true\n  restartPolicy: Always\n"
}

使用Terraform创建GCE实例

在包含tf文件的目录中执行以下命令。

1. 初始化 Terraform

执行 terraform 初始化
成功后,会在执行的目录下创建一个 .terraform 目录,并安装所需的插件和其他内容

当出现此类消息时,Terraform已初始化,但可能需要进行配置升级。

升级到Terraform 0.12
可以将tf文件更新为最新版本,效果很好。

2. 地球造型计划

检查tf文件是否正确,如果出现错误则修正tf文件。

3. 应用 Terraform

将其上传至 GCP 时,会被询问是否要在途中执行,请输入“是”。

你想执行这些操作吗?
Terraform将执行上述描述的动作。
只接受“是”作为批准。

输入一个值:是的

谷歌云计算实例.apps-gcp-terraform: 正在创建中…
谷歌云计算实例.apps-gcp-terraform: 仍在创建中… [已经过去10秒]
谷歌云计算实例.apps-gcp-terraform: 创建完成,总共耗时13秒

申请完成!资源:新增1个,修改0个,删除0个。

如果有类似↑的感觉,那就可以了。

只需要一种选项:接下来是进入已创建的GCE实例。

docker container ls 

然后,集装箱开始运作。

docker container exec -it コンテナID /bin/bash 

通过”等”命令进入容器内部

nohup python スクレイピングpythonファイル > log.txt 2>&1 & 

可以使用类似的方法来执行程序。

删除实例

摧毁Terraform

你真的想要摧毁所有资源吗?
正如上面所示,地球染整将会摧毁你所有的受管基础架构。
没有撤销的机会,确认时只接受“是”作为答案。

输入一个值:是的

被删除

迷恋之处

当地在中国本地区创建并绑定服务账户。

错误:无法获取身份验证令牌:元数据服务器返回了404状态。在这种情况下,似乎从GCE元数据服务器无法获取令牌。

所以,当在实例中执行以下命令时,

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
-H "Metadata-Flavor: Google"

该实例未启用服务帐户。

只需一个选项:
因此,当在main.tf中添加服务帐户附件后,这就可以了↓

service_account {
    email = "<サービスアカウント>"
    scopes = ["cloud-platform"]
  }

请帮我参考这个问题。

terraform文档
实例的创建与配置
使用Terraform的变量
GCP基础架构建设自动化之路的第一部分-引入Terraform
使用Terraform将Web应用程序部署到Google Compute Engine
Terraform 0.12发布后,尝试进行升级
尝试使用Terraform构建GCP环境
google_compute_instance的service_account的scopes参数应该是可选的

广告
将在 10 秒后关闭
bannerAds