🎉

JFrog ArtifactoryがTerraform Private Registry、remote backendに対応しました

2022/06/01に公開

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 するような自動化もできそうです:
https://github.com/jfrog/setup-jfrog-cli

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 でウェビナーをやりました。アーカイブも下記から視聴できます。
https://twitter.com/jrsyo/status/1530106475083071488

Discussion