使用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参数应该是可选的