ABEJA Platform(の一部)をTerraformで管理してみる

ABEJA Platform Advent Calendar 2018の5日目です。


自己紹介

はじめまして、KICONIA WORKSの日熊です。

今年のABEJA Platform Advent Calendarでは数少ないの非ABEJA社員の投稿だと思います。(元社員ですが) 来年はもうちょっとコミュニティが育ってるといいですねと思っています。

今日の記事ではterraformについて書きますが、インフラ屋さんではありません。

よくわからない職種なのであんまり言いたくないですが、AIエンジニア的な立ち位置な人です。(趣味でWeb開発とか触ったり、ひょんなことからTerraformを触ったりしてました)


はじめに

ABEJA Platformはいわゆるクラウド型の深層学習向け(AI向け?)Platformです。

誤解を恐れずにいうとAIの学習や実行インフラを提供してくれてるわけです。

こちら(ABEJA Platformを使ってコード0行でresnet50のモデルをデプロイしてみる)の記事を読んでいただけるとわかりやすいのですが、コード0行で深層学習を実行する WebAPIを作ることができたりします。

コードレス・コマンドレスで実行環境を用意してくれるのは嬉しいですね。

しかし、あえていいましょう。

毎回画面をポチりたくないですよね。

ABEJA Platformは見渡した感じでは Cloud Trail的な機能も見当たりませんので、画面をポチってると履歴とかも残らず再現性は厳しそうな感じです。(Cloud Trailは再現性の為の機能で無いのは理解の上です)

ということで、

TerraformでABEJA PlatformにResnet50をデプロイしていきたいと思います。(内容的にはこちらといっしょです)


Terraformとは

Terraform は、Vagrant などで有名な HashiCorp が作っているコードからインフラリソースを作成する・コードでインフラを管理するためのツールです。AWS, GCP, Azure, DigitalOcean といったクラウドプロバイダや DNSimple, Mailgun, Rundeck を含む多くの SaaS に幅広く対応しています。 (参照元)


事前準備


TerraformってABEJA Platformに対応してるの?

とりあえず、皆さんterraformで適当なクラウドサービスを管理したいときどうしますか?

そうですねググりますね

とりあえず、僕もググってみました

「abeja platform terraform provider」

なんと出ません。。。

なぜだ

image.png

悲しいですね。まだまだ、マイナーだ(伸びしろがある)ということなので頑張って欲しいところです。

つまり、(公式/非公式合わせて)対応してません (2018/12/01 現在)


どうするのか

なければ作ります。

こちらに作り方が書いてあるので、読みつつ。

足りない部分はaws providerのコードを読みつつ。

がんばります。

terraformのprovider(plugin的なの) は基本Go言語で書くのですが。

ABEJA platformには公式/非公式合わせてGoのSDKは無いみたい(Pythonのみ?)ですので、WebAPIをnet/httpで叩きながらって感じになりました。(CLIが提供されてるからそれでやればっていうのもありますが、一応勉強も踏まえてWebAPIで作りました)


ミニマムなproviderができました

https://github.com/higumachan/terraform-abeja-platform

ここにコードは全部おいてあります。

Go言語は初めて書いたので普通にいろいろしくったなと思う部分が多かったりします。


(本題) abeja platform を terraformで管理する方法


providerのビルド

上のリポジトリで

go build -o /path/to/{terraformの作業ディレクトリ}

ように実行します。

これで、abeja platform用の(ミニマムな)providerがビルドされます。


学習ファイルのダウンロード

ABEJA Platformでは実行するための関連ファイルを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ファイルを書きます


main.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ファイルを作る


my.tfvar

user_id = "{ABEJA PlatformのUserID}"

personal_access_token = "{ABEJA PlatformのPersonal Access Token}"
organization_id = "{ABEJA PlatformのOrganization ID}"

こちらの認証情報は未契約の方はぜひABEJA Platformを契約して取得してください。(中の人から、興味あったら連絡ください!ってコメントがありました)


terraform init

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 plan

とりあえず、planしましょう。

terraform plan --var-file my.tfvars


  • abeja_deployment.my-deployment

  • abeja_deployment_service.my-service

  • abeja_model.my-model

  • abeja_model_version.my-modelversion

を作るよって書いてあれば、問題ありません。


事前確認

とりあえず、ABEJA Platformに何も無いことを確認しておきましょう。

image.png


terraform apply

そして、applyです。

terraform apply --var-file my.tfvars


確認

image.png

何かが作られてますね。

image.png

このようにWeb APIも作られています。

何度も言いますが、成果はこちらといっしょです。


破棄

Deleteも実装されているので、destroyもできます。

terraform destory --var-file my.tfvars

image.png

跡形もなく消え去りました。

検証しながらやってるときは意外と便利ですね、ポチポチやってるときには無い体験かなと思います。


まとめ

今回はABEJA PlatformのチュートリアルをTerraformで行いました。

ABEJA Platformは


  • (もちろん)terraformの定義ファイルが書けて

  • goが書けて

  • 十分に時間があれば (今回はGoの勉強やawsのproviderを読んでる時間含めて、所要時間6時間くらい)

Terraformで管理できることがわかりました。

これがあれば、画面ポチポチとはおさらばです。