[その2] Terraform Cloud Private Registory で モジュールを管理

## これは何? 
Terraform CloudにおけるPrivate Registoryの機能の紹介になります。

## Private Registoryを使用するメリット
Private Registory について詳しく知りたい方は[こちら](https://developer.hashicorp.com/terraform/registry/private)をさんこうに。

https://developer.hashicorp.com/terraform/registry/private

Private Registoryを使用するメリットとして、私が触れて感じたことは大きく2点になります。

- ローカルモジュールを置くことなく、複数環境でモジュールを呼び出すことができること。
- バージョン管理が容易であること。
    - 以下のように利用したいバージョンを指定することで、任意のバージョンの状態でリリースできる。
    - ローカルモジュールでは、既存モジュールの最新化に伴い思わぬ変更/削除も発生するかもしれないが、バージョンを変更しなければ、従来の使い方ができる。

```hcl
module "network-templates" {
  source  = "<<プライベートレジストリ名>>"
  version = "1.0.0"
      ...
}
```

## 作業手順
今回実施する内容の大まかな内容としては以下の通りです。
- GitHubなどのVCS上のバージョンタグ登録
- プライベートレジストリの登録
- ワークスペースの新規作成

になります。

### プライベートレジストリ用リポジトリの準備
GitHubなどのリポジトリを用意します。今回使用するリポジトリは[こちら](https://github.com/atsw0q0/terraform-aws-network-templates)になります。

https://github.com/atsw0q0/terraform-aws-network-templates


### バージョンタグを追加
mainブランチを最新の状態にした後、バージョンタグを追加します。
```bash
git tag v1.0.0
git tag 
git push origin v1.0.0
git show v1.0.0
```



### Private Registory の登録
リポジトリの用意ができたら次はプライベートレジストリの登録になります。
以下のようにPublishボタンを押下することで、レジストリを登録することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/ea431be3-da52-a566-8aee-b0d1da9011af.png)

バージョン管理システムとの接続画面が表示されるので任意のサービスを指定して次へをクリック。
今回はGitHubを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/f4675d9a-5ff1-4c85-f061-5b5373b3d2d7.png)

先ほど作成したリポジトリを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/44354f0d-727e-0e1a-bdb8-2af08e99ea3f.png)

パブリッシュタイプを指定することができます。
今回はバージョンタグで管理するため、タグを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/b4c7d135-00da-335d-2da9-b0111022f46a.png)

作成されたプライベートレジストリは以下の通りとなります。
「Usage Instructions」下のような記述でモジュールとして呼び出すことができるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/601c0546-d407-0d6c-0e04-61af4e97c8a6.png)




### プライベートレジストリを呼び出すtfファイルを作成
次にプライベートレジストリ上で定義されたモジュールを呼び出す実行用のリポジトリを用意します。
今回利用するためのリポジトリは以下の通りです。
https://github.com/atsw0q0/test-terraform-cloud/tree/main/02_private_registory

上記のリポジトリのディレクトリ「02_private_registory」上で.tfファイルを用意し、以下のようにsource部分で呼び出します。

```hcl:main.tf
module "network-templates" {
  source  = "app.terraform.io/atsuw0w-test-terraform/network-templates/aws"
  version = "1.0.0"
  # Variables
  pj_tags = {
    name = "fuga"
    env = "test"
  }
  vpc_prefix = {
    prefix     = "net"
    cidr_block = "10.1.0.0/16" 
  }
  subnet ={
    pub = {
      pub_a = {
        prefix           = "pub"
        cidr_block       = "10.1.0.0/24"
        az               = "a"
        is_public_subnet = true
      }
      pub_c = {
        prefix           = "pub"
        cidr_block       = "10.1.1.0/24"
        az               = "c"
        is_public_subnet = true
      }
    }
    pri = {
      pri_a = {
        prefix           = "pri"
        cidr_block       = "10.1.10.0/24"
        az               = "a"
        is_public_subnet = false
      }
      pri_c = {
        prefix           = "pri"
        cidr_block       = "10.1.11.0/24"
        az               = "c"
        is_public_subnet = false
      }
    }
    edp = {
      edp_a = {
        prefix           = "edp"
        cidr_block       = "10.1.20.0/24"
        az               = "a"
        is_public_subnet = false
      }
      edp_c = {
        prefix           = "edp"
        cidr_block       = "10.1.21.0/24"
        az               = "c"
        is_public_subnet = false
      }
    }
  }
}
```

### ワークスペース新規作成
[\[その1\] Terraform Cloud 触ってみた](https://qiita.com/atw0_0w/items/6b55f671e1088cbc140e)で、作成したワークスペースでも良いのですが、折角なので今回用のワークスペースを新規で作成します。

**Terraform Working Directory** で作業ディレクトリ「02_private_registory」を指定します。

あとはワークスペース変数なども[\[その1\] Terraform Cloud 触ってみた](https://qiita.com/atw0_0w/items/6b55f671e1088cbc140e)と同じように設定して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/42402c82-e774-2c87-843d-8f321d51ece3.png)


これで準備の方は完了です。

## テスト
以下のようにプライベートレジストリを呼び出して実行することができました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/e84ee982-20ff-b2c4-4594-5fac294de173.png)

これでさまざまなプロジェクトから統一のモジュールを呼び出すことができるようになりました。
結構便利。