JFrog ArtifactoryがTerraform Private Registry、remote backendに対応しました
tl;dr;
- JFrog Artifactory で Terraform module/provider (private) がホストできるようになった (バージョン管理ができる!)
- JFrog Artifactory が Terraform remote backend (state file) に対応した
JFrog 公式 blog post: https://jfrog.com/ja/press/jfrog-extends-support-for-terraform/
JFrog Artifactory
JFrog Artifactory はユニバーサルなアーティファクト管理を実現するツールです。単純なビルド成果物はもちろん、Docker や npm など、非常に多くのアーティファクト用レジストリとして機能させることができ、例えばプライベートな Docker イメージの Push/Pull 先として簡単に利用できます。
対応しているパッケージタイプの豊富さに加え、RBAC によるユーザー管理も可能なため、大規模な組織でのチーム開発には便利でしょう。
また、これら様々なレジストリに対して、JFrog Artifactory が提供する統一されたインタフェースおよびその認証システムを利用可能になるため、運用コスト・セキュリティの面でもメリットは大きいでしょう。
Private module のバージョン管理問題
世の中には有志によって公開されている public な module がたくさん存在していますが、チームで開発していると、やはり独自のニーズに合わせてカスタマイズした private な Terraform module を作って運用しているケースは多いと思います。
こうなると当然出てくるのが、たくさんの private module をどうやってバージョン管理するか、という問題です。
monorepo のような形で Terraform module をソースコードと一緒に管理し、Local Paths
で module を読み込んでいるような場合、そのままでは module だけに対してのバージョン管理を担保するのは難しく、同じリポジトリの中で複数の namespace タグを切り分けて git 経由での読み込みを行う、などして運用上の工夫が必要です。
このような場合、例えば HashiCorp が提供している Terraform Cloud (SaaS) や Terraform Enterprise (self-hosted) では、機能として private module がサポートされており、自組織だけが使える private な Terraform Registry を使うことができます。
Terraform Registry を使って module を管理すると、バージョン管理がそこでしっかりと保証されるため、運用上のミスを防ぐことができます。
Terraform Registry on JFrog Artifactory
今回の JFrog のサポート拡大により、前述した Terraform Cloud/Enterprise 以外でも気軽に Terraform Registry を使える選択肢が増えたことになります。
また、Terraform Registry は module だけでなく provider の管理をすることも可能なため、機会は少ないかもしれませんが、例えば自社のプライベートサービスに対してカスタムの Terraform Provider を作って運用している場合 (+ Provider を外部に公開したくない場合)、この private provider の publish 先としても使うことができます。
JFrog 公式ドキュメント: https://www.jfrog.com/confluence/display/JFROG/Terraform+Registry
JFrog CLI による module の publish
JFrog Artifactory 上の Terraform Registry に対して module を publish する際には、JFrog が公式に提供している JFrog CLI を利用します (便利!)。
# 対象の module ディレクトリに移動
$ cd modules/test-module-1
# module を publish
$ jfrog terraform publish --namespace=tf-demo --provider=aws --tag=v0.1.0
09:32:24 [🔵Info] Running Terraform publish
09:32:24 [🔵Info] [Thread 2] Uploading artifact: tf-modules-local/tf-demo/test-module-1/aws/v0.1.0.zip
09:32:24 [🔵Info] Terraform publish finished successfully.
{
"status": "success",
"totals": {
"success": 1,
"failure": 0
}
}
* 上記の例では Artifactory 内にある
tf-modules-local
という名前のリポジトリに module が publish されている (リポジトリはjfrog tfc
コマンドによって変更可能)
publish した private module は、terraform login
コマンドによって自分の JFrog ドメインに対して認証を行うことで利用が可能になります (JFrog ドキュメント)。
このように、JFrog CLI を使うと、1つのリポジトリの中で複数の module を管理していたとしても、フォルダ毎にコンテキストを切り替えて publish、バージョン管理することができるので非常に便利です。
公式の GitHub Actions も公開されているので、例えば module を集めたリポジトリを1つ作り、その中で各 module を publish するような自動化もできそうです:
Terraform Backend on JFrog Artifactory
もう1つの機能として、JFrog Artifactory が Terraform remote backend に対応しました。
JFrog 公式ドキュメント: https://www.jfrog.com/confluence/display/JFROG/Terraform+Backend+Repository
terraform {
backend "remote" {
hostname = "my-artifactory-domain.jfrog.io"
organization = "artifactory backend repository name"
workspaces {
prefix = "my-prefix-"
}
}
}
Terraform をチーム開発で利用する上で欠かせないのが state ファイルのリモート管理です。
Terraform がサポートしている backend type はいくつか存在しますが、backend によっては state locking 機能を使うことができないため、注意が必要です。
例えば先程紹介した Terraform Cloud は remote backend に対応しており、当然 state locking が利用できますが、state を S3 バケットで管理するような場合には Dynamo DB と組み合わせる必要があったり、backend の種類によって対応が異なります。
今回 JFrog Artifactory で新たに追加された Terraform remote backend リポジトリは、その名の通り remote backend で、state locking も built-in でサポートされています。安心して利用できますね。
その他宣伝
先日 JFrog と HashiCorp でウェビナーをやりました。アーカイブも下記から視聴できます。
Discussion