クラウドでのIaC:Oracle CloudでのResource Managerを用いたTerraform利用の応用編/IaC in the Cloud: Advanced Terraform on the Oracle Cloud with Resource Manager

 原文はこちら:https://blogs.oracle.com/developers/iac-in-the-cloud%3a-advanced-terraform-on-the-oracle-cloud-with-resource-manager

このシリーズのひとつ前のポストでは、Oracle CloudでResource Managerを使ってTerraformを実行する方法の初歩を紹介しました。そこではとても基本的な、不自然な例を使って説明しましたが、今回のポストではより実践的な例を使い、TerraformとResource Managerのもう少し複雑な用法を紹介していきます。

スキーマドキュメント

前回のポストでは、すべての変数のデフォルト値がハードコードされたシンプルなTerraformスクリプトの実行について学びました。みなさんご存知のように、そうしたやり方はスクリプトについての一般的な例とは言えません。多くの場合、スクリプトは実行者からなにがしかのデータ入力を必要とするものです。ときには、オプションの動的なリストを必要とする場合もあります。こうしたシナリオは、スタックを別のチームに共有する場合や、別のクラウドテナンシーにデプロイされるオープンソースプロジェクトの場合にはとても一般的なものだと言えます。スタックは時にはインスタンスシェイプやOSイメージなどの動的な値を扱ったり、時には利用可能なコンパートメントをリストして、どこにリソースを保持したいかスタックをデプロイするひとに選ばせたりといったことも必要になります。

明らかに、OSイメージなどなどのリストをスクリプトの中にハードコードしたくはありませんよね(しばしば更新されますし、リージョンによって異なったりもしますからね)。テナンシーごとに異なる値についてはそもそも、候補値を事前に知っておくことはできません。

動的な入力値こそ、Resource Managerの役立つところです。必須の入力値を定義しておくことで、スタックが作成されるときにResource Managerが専用のフォームを生成して値を収集してくれます。このフォームでは、動的な(テナンシーやコンパートメントごとに異なる)データをドロップダウンリストとして表示させることもできます。スタックにschema.ymlドキュメントを含めておくことで実現できます。やり方を見ていきましょう。

前回のポストで使った例を拡張していきましょう。お忘れの方のために、前回のポストのdemo.tfファイルはこのようなものでした。

variable "compartment_ocid" {
    default = "ocid1.compartment.oc1..[redacted]"
}
variable "region" {
    default = "us-phoenix-1"
}
variable "bucket_namespace" {
    default = "toddrsharp"
}
variable "bucket_name" {
    default = "resource_manager_demo_bucket"
}
provider "oci" {
    region = var.region
}
resource "oci_objectstorage_bucket" "create_bucket" {
    # required
    compartment_id = var.compartment_ocid
    name = var.bucket_name
    namespace = var.bucket_namespace
    # optional
    access_type = "NoPublicAccess" # <---- updated from "ObjectRead"
}
output "new_bucket" {
    value = oci_objectstorage_bucket.create_bucket
}
view rawdemo.tf hosted with ❤ by GitHub

すぐにいくつかの改善できる点があることに気づくでしょう:

  • compartment_ocidはテナンシー内の実際のコンパートメントを表示するドロップダウンにできる
  • regionもドロップダウンにできる
  • bucket_nameもスタックを実行するひとに動的に提供させることができる
  • bucket_namespaceはデータソースから取得させられる
  • access_typeは動的にできる
これらの5のかんたんな拡張によって、このスタックを使いやすくできます。やってみましょう。まず、プロジェクトのルートにschema.ymlというファイルを作ります。メタ情報を記入しておきましょう。

title: "Resource Manager Demo Stack"
stackDescription: "A stack to demonstrate how to use Resource Manager in the Oracle Cloud."
schemaVersion: 1.1.0
version: "20200301"
locale: “en"
logoUrl: https://objectstorage.us-phoenix-1.oraclecloud.com/n/toddrsharp/b/object-upload-demo-public/o/Todd_Head_Square_130_x_130.png
view rawschema.yml hosted with ❤ by GitHub

Tip:VS Codeを使っている場合は、Meta Schema for Resource ManagerをYAMLスキーマとして追加することで、コード補完とバリデーションが行えます。

必要に応じてtitlestackDescriptionlogoUrlの値を修正してください(ロゴは縦横130pxにしておく必要があります)。次に、variableGroupsを定義していきます。これは変数をどのようにグループ化するかについての定義で、例えば入力値を必須グループとオプショナルグループに分けるのに役立ちます。

variableGroups:
    - title: "Required Inputs"
      variables
        - "compartment_ocid"
        - "region"
        - "bucket_name"
        - "access_type"
view rawschema.yml hosted with ❤ by GitHub

では、個々の変数を定義していきましょう。まずはcompartment_ocidから。それぞれの変数は後で見るように、いくつかのオプションを持っています。タイトル、備考、UIで見えるかどうか、必須かどうか(見えるものかつ必須なものは別の変数から依存することもできます)。このステップはサッと済ませて、入力値のバリデーションのための正規表現まで加えてしまいます!最後に、標準Terraformタイプをサポートするtype属性について、Resource Managerではさらに事前に値を読み込ませた動的なドロップダウンを描画するタイプもサポートされていることには留意ください。どのような値がサポートされているかについて詳しくはドキュメントを参照するべきですが、だいたい必要になるだろうと想像するようなもの(コンパートメント名、リージョン、インスタンスシェイプなどなど)はサポートされており、次々追加されています。ここでの例ではcompartment_ocidについては、テナンシー内の候補コンパートメントを収めたドロップダウンにすることにしましょう。

variables:
    "compartment_ocid":
        type: oci:identity:compartment:id
        visible: true
        required: true
        title: "Compartment"
        description: "The compartment to create the resources in."
view rawschema.yml hosted with ❤ by GitHub

リージョンについても同じようにします。

"region":
    type: oci:identity:region:name
    visible: true
    required: true
    title: "Region"
    description: "The region in which to create resources."
view rawschema.yml hosted with ❤ by GitHub

バケット名については、stringtypeを使いますが、ユーザーからの入力が正しいバケット名かどうかのバリデーションを追加しておきましょう。受け付ける文字は英字(大文字、小文字)と数字、ハイフン、アンダースコア、そしてピリオドとします。

"bucket_name":
    type: string
    visible: true
    required: true
    title: "Bucket Name"
    description: "The name of the bucket to create."
    pattern: "^([a-zA-Z\\d-_\\.]+)$"
view rawschema.yml hosted with ❤ by GitHub

enumとハードコーディングした値を用いてドロップダウンを作ることもできます。デフォルトを指定できることも覚えておきましょう。以下では作成するバケットのaccess_typeを入力させています。

"access_type":
    type: enum
    visible: true
    required: true
    title: "Bucket Access Type"
    default: “NoPublicAccess"
    enum:
      - NoPublicAccess
      - PublicRead
view rawschema.yml hosted with ❤ by GitHub

前述したとおり、bucket_namespaceをデータソースから取得できます。なのでdata.tfをそのように修正しましょう。また、既定の変数を取り除くこともできます。更新したdata.tfはこのようになります。

variable "compartment_ocid" {}
variable "region" {}
variable "bucket_name" {}
provider "oci" {
    region = var.region
}
data "oci_objectstorage_namespace" "namespace" {
    compartment_id = var.compartment_ocid
}
resource "oci_objectstorage_bucket" "create_bucket" {
    # required
    compartment_id = var.compartment_ocid
    name = var.bucket_name
    namespace = data.oci_objectstorage_namespace.namespace.namespace
    # optional
    access_type = "NoPublicAccess" # <---- updated from "ObjectRead"
}
output "new_bucket" {
    value = oci_objectstorage_bucket.create_bucket
}
view rawdata.tf hosted with ❤ by GitHub

ここまででschema.ymlファイルが完成し、data.tfも更新できたので、これらをGitHubリポジトリにプッシュして、新しいスタックをそこから作成してみましょう。

Nextをクリックすると、スキーマに定義したとおりにフォームが表示されることでしょう。


素晴らしい!コンパートメント変数は適切にコンパートメントをドロップダウンリストから選択させてくれていますし、リージョンもドロップダウンになっています。バケット名はテキスト入力になっており、バケットのアクセスタイプは「NoPublicAccess」をデフォルトとするドロップダウンになっています。不正なバケット名の入力を試してみましょう:


なるほど、実際にバリデーションしてくれました。しかしバリデーションメッセージはあまりフレンドリーなものとは言えません。この点については開発チームとスキーマドキュメントでカスタムバリデーションエラーメッセージをサポートするように検討していますのでご期待ください。それまでは、入力フィールドの備考欄にバリデーションルールを記載しておくといいかもしれません。

まとめ

ここまで見てきたように、Oracle Cloudで実行するTerraformスクリプトに、スキーマドキュメントに対しResource Managerを用いることで、かんたんに動的なデータ入力を受け付けるようにできます。もちろん、もっと複雑なスタックでそうしたやり方が役に立つことはたくさんあるでしょう。インスタンスシェイプやVirtual Cloud Network、サブネットなどなどを選ばせる場合など。紹介したやり方で、あなたのTerraformインフラストラクチャ定義をかんたんに作成して、容易にチーム内で共有したり、オープンソースとして他のひとたちがあなたのアプリケーションをOracle Cloudにデプロイするのを容易にしたりできることをわかっていただければ幸いです。

0 件のコメント:

コメントを投稿