尝试使用Terraform来管理ABEJA平台(的一部分)
这是 ABEJA Platform Advent Calendar 2018 的第五天。
自我介绍
初次见面,我是KICONIA WORKS的日熊。我认为在今年的ABEJA平台圣诞日历中,我的投稿是很少见的非ABEJA员工投稿。(虽然我是以前的员工) 我希望明年社区能够更加充实发展。
今天的文章将写关于Terraform,但我并不是一个基础架构工程师。
由于不是太了解这个职位,所以不太想多说,但我可以被理解为是一个AI工程师(曾经在业余时间接触过Web开发,偶尔也会接触Terraform)。
首先
ABEJA Platform是一种所谓的云端深度学习 (AI) 平台。
不怕误解地说,它为我们提供了AI的学习和执行基础设施。
如果您阅读这篇文章(使用ABEJA平台在零代码的情况下部署ResNet50模型),就会更容易理解,您可以创建一个能够在零代码的情况下运行深度学习的WebAPI。
没有线和没有命令行的环境是非常令人高兴的。 但是,我们可以刻意一下。 每次都不想去点击屏幕对吧。从概览来看,ABEJA 平台似乎没有类似于 Cloud Trail 的功能,所以如果继续通过点击屏幕操作,历史记录等都不会被保存,可重现性会变得困难。(请理解 Cloud Trail 不是用来实现可重现性的功能)
所以,我想在ABEJA平台上使用Terraform部署Resnet50模型。(与内容相同)
Terraform是什么?
Terraform是由著名的HashiCorp开发的一款工具,可以通过代码创建和管理基础设施资源。它广泛适用于各种云提供商,如AWS、GCP、Azure、DigitalOcean,以及包括DNSimple、Mailgun和Rundeck在内的多个SaaS服务。(参考来源)
事先准备
Terraform是否支持ABEJA平台?
首先,当大家想要在云服务上进行一些基本的管理时,可以考虑使用terraform。
嗯,我会去搜索一下。
我也试着搜索了一下,“abeja平台terraform提供者”。
不知道為什麼出不來…

很可悲啊。因为它仍然相对较小(有发展空间),所以希望能加油努力。
简而言之,截至2018年12月1日,它(无论是官方还是非官方)都没有得到处理。
你打算怎么办?
如果没有的话,我会制作出来。
因为这里写着制作方法,所以你可以边阅读边参考。
在遇到不足的部分时,可以参考AWS提供者的代码。
努力加油。
Terraform的供应商(类似插件)通常会用Go语言编写。然而,在ABEJA平台上没有官方/非官方提供Go的软件开发工具包(只有Python?)。因此,我选择使用net/http来调用Web API(虽然可以使用提供的CLI进行操作,但我还是选择用Web API进行开发,考虑到学习的需要)。
我們成功創建了一個最小的提供者。
这里的代码都已经放在这里了。
因为是第一次写Go语言,所以有很多地方我觉得有点乱七八糟。
如何使用Terraform来管理abeja平台
提供者的构建
在上面的存储库中
go build -o /path/to/{terraformの作業ディレクトリ}
那么执行就可以了。
通过这个,将为abeja平台构建一个(最小的)provider。
下载学习文件
在ABEJA平台上,需要将要运行的相关文件打包成zip或tar.gz格式(类似于AWS Lambda),所以这次我们需要下载它并给它一个合适的名称。
curl https://abeja-platform-config-prod.s3.amazonaws.com/sample_code/keras/resnet50.tar.gz > upload/model.tar.gz
写tf文件
我会写一个类似下面的tf文件
variable "user_id" {}
variable "personal_access_token" {}
variable "organization_id" {}
provider "abeja" {
user_id = "${var.user_id}"
personal_access_token = "${var.personal_access_token}"
organization_id = "${var.organization_id}"
}
resource "abeja_model" "my-model" {
name = "nadeko"
description = "nadeko is cute"
}
resource "abeja_model_version" "my-modelversion" {
model_id = "${abeja_model.my-model.id}"
version = "0.0.1"
image = "abeja-inc/all-cpu:18.10"
handler = "main:handler"
upload_file_path = "upload/model.tar.gz"
}
resource "abeja_deployment" "my-deployment" {
model_id = "${abeja_model.my-model.id}"
name = "rikka"
default_environment = "{}"
}
resource "abeja_deployment_service" "my-service" {
deployment_id = "${abeja_deployment.my-deployment.id}"
instance_number = 1
instance_type = "cpu-0.25"
environment = "{}"
version_id = "${abeja_model_version.my-modelversion.id}"
}
请随意决定一个名字。
请指定之前下载的文件到abeja_model_version.my-version.upload_file_path。
创建一个tfvar文件。
user_id = "{ABEJA PlatformのUserID}"
personal_access_token = "{ABEJA PlatformのPersonal Access Token}"
organization_id = "{ABEJA PlatformのOrganization ID}"
如果您尚未签约,请务必立即订阅ABEJA平台以获取此认证信息。(内部人员已留言,如有兴趣请联系!)
初始化terraform
terraform init
只要能够顺利构建,就没有问题。
Initializing provider plugins...
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
会出现这样的说明。
计划使用Terraform
暂且先制定个计划吧。
terraform plan --var-file my.tfvars
-
- abeja_deployment.my-deployment
-
- abeja_deployment_service.my-service
-
- abeja_model.my-model
- abeja_model_version.my-modelversion
如果写着要做【X】,就没有问题。
提前确认
首先,让我们确认一下ABEJA平台上没有任何内容。

执行terraform应用程序
然后,进行申请。
terraform apply --var-file my.tfvars
确认

你做了些什么东西呢?

就像这样,Web API 也是以这种方式创建的。
我再说一遍,成果是一致的。
废弃
由于已经实现了Delete,因此也可以进行destroy操作。
terraform destory --var-file my.tfvars

并没有留下任何踪迹就消失了。
边做边验证的时候还是挺方便的,我认为这是在噼里啪啦打字时没有的一种体验。
整理
这次我们使用Terraform进行了ABEJA平台的教程。ABEJA平台是
-
- (もちろん)terraformの定義ファイルが書けて
-
- goが書けて
- 十分に時間があれば (今回はGoの勉強やawsのproviderを読んでる時間含めて、所要時間6時間くらい)
我发现可以使用Terraform进行管理。
如果有了这个,就能轻松地告别频繁点击屏幕的操作了。