🐈

terraform aws, Google Cloudの公開モジュール試用

2024/08/30に公開

概要

先日こちらの記事を書きました。
https://zenn.dev/haggar/articles/4f7373c7c5d9f9

これが我ながらとても気持ち悪い仕上がりになってしまい(気持ち悪いけどもう面倒なので直さない)、当初やりたかったawsとGoogle Cloudのモジュールを使ってリソース作成する、という目的が一切果たせんかったな、と思いながら後日awsとGoogle Cloudの公開モジュールを試しました。

したら思った以上にすんなりとリソース作成ができてしまったので、これは良いぞ!と思い早速で記事でも簡単に書いておこうと思い、以下に試し記録を書き残し。

awsの公開モジュールを使う

こちらのリンクからが探しやすいかなと。
https://registry.terraform.io/search/modules?namespace=terraform-aws-modules

で今回はS3のバケット作成を試そうと思います。
上記リンクから探してくとS3バケットのモジュールはこれだ

  • static web-site hosting

  • access logging

  • versioning

  • CORS
    .
    .
    .
    などなどの機能がサポートされてるよ、と書いてあります。

  • S3バケットのサンプル
    それで早速サンプルが載ってます。バージョニングが有効なバケットを作るサンプルですね。

module "s3_bucket" {
  source = "terraform-aws-modules/s3-bucket/aws"

  bucket = "my-s3-bucket"
  acl    = "private"

  control_object_ownership = true
  object_ownership         = "ObjectWriter"

  versioning = {
    enabled = true
  }
}

上記コードのバケット名だけ変えて、もうそれで試してみよう。
main.tfに上記コードを記載します。(ファイル名は.tfなら何でも良い。)

  • 準備: providerファイル
    あとはawsのproviderのファイルを用意します。
    providerファイルの設定については今回は詳細は触れませんがリンク貼っておきます。providerの方は自分もまた使いそうだし

  • AWS Provider

    作業ディレクトリ内はこんな感じで至ってシンプル。

.
├── main.tf
└── provider.tf
  • 準備: aws接続の設定
    あとは各自の環境に合わせてawsに接続するためのcredentialやらの設定をします。
    こちらも詳細は触れませんがリンクを貼っておきます。

    設定についてはこちらのページが分かりやすいかなと思います。

  • 準備: terraform init
    モジュールの使用時は一通りtfファイルの設定が終わったらまずterraform initを実行します。
    これでS3バケットのモジュールやらaws providerのpluginやらがインストールされます。

  • いざ apply
    terraform apply

出力内容
### 出力省略

Plan: 5 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

module.s3_bucket.aws_s3_bucket.this[0]: Creating...
module.s3_bucket.aws_s3_bucket.this[0]: Creation complete after 2s [id=haga-haga-s3-bucket]
module.s3_bucket.aws_s3_bucket_public_access_block.this[0]: Creating...
module.s3_bucket.aws_s3_bucket_versioning.this[0]: Creating...
module.s3_bucket.aws_s3_bucket_public_access_block.this[0]: Creation complete after 0s [id=haga-haga-s3-bucket]
module.s3_bucket.aws_s3_bucket_ownership_controls.this[0]: Creating...
module.s3_bucket.aws_s3_bucket_ownership_controls.this[0]: Creation complete after 1s [id=haga-haga-s3-bucket]
module.s3_bucket.aws_s3_bucket_acl.this[0]: Creating...
module.s3_bucket.aws_s3_bucket_acl.this[0]: Creation complete after 0s [id=haga-haga-s3-bucket,private]
module.s3_bucket.aws_s3_bucket_versioning.this[0]: Creation complete after 2s [id=haga-haga-s3-bucket]

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

あっさりできちゃいました。
あとこれ何が嬉しいかって、通常?resourceブロック使ってS3バケット作成しようとすると、一つのバケットに対してaws_s3_bucket_public_access_blockのリソースとかaws_s3_bucket_versioningのリソースとかそれぞれ作ってバケット一つ作るにも複数のリソースブロックが必要だったりする訳なんですが、モジュールではこれがオールインワン!(語弊ありそうですが)
今後個人開発やらでterraform使う時はモジュール使おうと誓いました。

Google Cloudの公開モジュールを使う

こちらのリンクからが探しやすいかなと。
https://registry.terraform.io/search/modules?namespace=terraform-google-modules

Google cloudの方もバケット(cloud storage)でいこう。
するとモジュールはこれかな。

簡単に一つまたは複数のバケットが作れて、バケットに対する基本的な権限設定もできるよといった事が書かれてます。(Google Cloudのことあんま知らんのでちゃんと分かってないですが)
ちなみにシンプルにバケット作るモジュールならこっちのモジュールとの事です。

  • GCSバケットのサンプル
module "gcs_buckets" {
  source  = "terraform-google-modules/cloud-storage/google"
  version = "~> 6.1"
  project_id  = "<PROJECT ID>"
  names = ["first", "second"]
  prefix = "my-unique-prefix"
  set_admin_roles = true
  admins = ["group:foo-admins@example.com"]
  versioning = {
    first = true
  }
  bucket_admins = {
    second = "user:spam@example.com,user:eggs@example.com"
  }
}

うむ、たしかに何かしらのIAM設定をしようとしてる感。。。とりあえず今回は何かバケットができればいいので、上記コードからいくつかの行は抜いちゃおう。
set_admin_roles,admins,bucket_adminsのパラメータは抜いたコードをmain.tfとして使ってきます。(ファイル名は.tfなら何でも良い。)

  • 準備: Google Cloudコンソールでcloudshell起動
    今回Google Cloudの方の試しはcloudshellから行います。なので必要なファイルもcloudshellエディタを使ってきます。

    先日受けたG-genさんのトレーニングでもcloudshellを使ったハンズオンを行ってて便利さは何となく把握できたので。

    詳細は触れませんが、最初からterraform入ってるのと、エディタ機能があること、そのエディタでterraformの構文チェックしてくれる機能も最初から入ってるのがgood!!

    ちなみにawsのモジュール使用の時に「準備: aws接続の設定」として記載してたcredentialの設定やらも不要!いいね。

  • 準備: providerファイル
    Google Cloud用のproviderファイルを用意します

こちらのページなど参考に設定します。
Google Cloud provider

これで必要なファイルの準備はok。

  • 準備: terraform init
    繰り返しになりますが、モジュールの使用時は一通りtfファイルの設定が終わったらまずterraform initを実行します。
    これでGCSバケットのモジュールやらGoogle Cloud providerのpluginやらをインストール。

  • いざ apply
    エディタからターミナルに戻ってterraform applyです

出力内容
### 出力省略

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

module.gcs_buckets.google_storage_bucket.buckets["first"]: Creating...
module.gcs_buckets.google_storage_bucket.buckets["second"]: Creating...
module.gcs_buckets.google_storage_bucket.buckets["second"]: Creation complete after 1s [id=bucket-hogege-second]
module.gcs_buckets.google_storage_bucket.buckets["first"]: Creation complete after 1s [id=bucket-hogege-first]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

こちらもあっさりできました!
Google Cloudのことよく分かってなくてもできちゃう。
「terraformモジュールこれからも使う」と再び誓いました。

さいごにぼやき

今回はawsもGoogle Cloudも単純なバケット作成のみ、というところでしたが公開モジュールを使って簡単にリソースが作れることは把握できました。
特にawsの複数リソースが必要だったものが単一ブロックで済むようになるのは嬉しかったなぁ。

今度はこの公開モジュールをあれこれ使ってWEBアプリの一般的な構成を一通り作ってみたいなぁ、と展望が生まれた。

あと今回全く触れてないですが、モジュールの使い方は公開されてるリモートのよりローカルファイルをモジュールとして扱う方が難易度高いです。こっちも改めて試さんと。

以上

Discussion