クラウドでのIaC:Resource Manager入門/IaC in the Cloud: Getting Started with Resource Manager

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

Terraformの使い方とOracle Cloud Infrastructureの管理についてのブログシリーズにおかえりなさい。シリーズの最初のポストでは開発者向けのTerraformの基礎を、第二弾ではTerraformをインストールし、スクリプトを記述し適用してOracle Cloud Infrastructureのテナンシーでリソースを作成しました。このポストでは、OCIのエンジニアたちがResource Managerというツールを使い、どのようにわれわれのクラウドにTerraformを統合しているかについてご紹介していきます。

OCI Resource Managerとは?

Resource ManagerはTerraformをクラウドで記述し、実行するひとつの方法です。ここで、「Terraformをローカルで、あるいはCI/CDパイプライン、Terraform CLI、また、さまざまなプラグインで実行できるのに、どうしてそんなものが必要なの?」と疑問を抱いているかもしれません。答えは、有り体に言えば「場合による」というものです。なるほど、Terraformプランをクラウドで実行する必要がない(あるいはしたくない)ときもあるでしょう。でも、後述するように、そうすることが便利なこともあるわけです。Resource Managerは、あなたのTerraformプロジェクトを改善するために、また、あなたが定義したインフラストラクチャをデプロイするユーザーのために役立つ機能を備えています。時には定義したインフラストラクチャを分散させるようなかたちで定義することもありますよね。この場合、あなたは定義を内部/外部のチームと共有することになります。また、あなたは他のひとたちがOracle Cloudにデプロイするオープンソースのプロジェクトを作成するかもしれません。Resource Managerはそのようなときにあなたを手助けしてくれます。

Tip:Resource Managerを使うときは、 provider ブロックで必要なフィールドは対象の region だけです。これは、ジョブがテナンシー内でセキュアに実行され、ログインしているユーザーのパーミッションとポリシーを継承しているためです。

後で混乱するのを防ぐために、いくつかの用語についてはっきりさせておく必要があります。詳細は公式ドキュメントを参照していただく必要がありますが、概要は以下の通りです。

Configuration Source Provider

Terraform設定ファイルのバージョン管理のために使っている外部のソースコントロールシステムに関連する情報。これらにより、ZIPファイルにパッケージしてアップロードすることなく、バージョン管理システムから直接ビルドできるようになるためとても便利です。

Stacks(スタック)

ひとつのプランの一部として実行されるスクリプトのグループ。ZIPファイルとしてアップロードするか、Configuration Source Providerから直接プルすることもできます。

Job(ジョブ)

Stackに対して実行されるもの。プラン、適用、破棄のジョブ。

Drift(ドリフト)

実際のステートと、そのスタックに対して最後に実行したジョブが保存していたステートとの差分。例えば、Resource Managerジョブによって作成/更新したリソースをあなたが手動で変更した場合、ステートにドリフトを持ち込んだことになります。このようなケースでは、ドリフト検知レポートが役に立ちます。

Resource ManagerはOCIコンソール、SDK、OCI CLIから利用可能です。

Resource Managerの使用

To learn about Resource Manager, I think it will be best if we use a project for our configuration and use that project to create a stack and execute our plan/apply jobs.

Resource Managerについて知るためには、例となるプロジェクトで設定とスタックの作成、プランと適用のジョブを実行してみるのが一番だと思います。

Gitリポジトリの作成

このデモのために、コードをGitHubに保存しておき、OCI Configuration Source Providerで自動的に最新のTerraform設定をリポジトリからプルできるようにしましょう。これでスタックを実行するたびにZIPしてアップロードする手間が省けます。

https://github.com/newでGitHubに新しいリポジトリを作成します。

そうしたらローカルにリポジトリをチェックアウトしましょう。

trsharp at ora-recursivecodes-mb in /projects/terraform
$ git clone https://github.com/recursivecodes/oci-resource-manager-demo.git
Cloning into 'oci-resource-manager-demo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
view rawcheckout.sh hosted with ❤ by GitHub

では設定ファイルを追加していきます。

Configuration Source Providerの作成

まずは、GitHubプロジェクトからスタックを直接ビルドできるよう、Configuration Source Providerをセットアップしておきましょう。GitHubのパーソナルアクセストークンが必要になるので、https://github.com/settings/tokensに行ってトークンの生成をクリックします。

トークンに名前をつけて、スコープは read:packages を選択します。

作成をクリックして次のページでトークンをコピーしましょう。


OCIコンソールで、"configuration source provider"を探してそこに移動します。


「Create Configuration Source Provider」をクリック。

ダイアログでは名前をつけ(1番)、備考を記述し(2番)、コンパートメントを選択し(3番)、「GitHub」のタイプを選択し(4番)、サーバーURLには https://github.com を入力し(5番)、GitHubパーソナルアクセストークンをペーストします(6番)。

これで次のステップでプロバイダーを使う準備ができました。

スタックの作成

このステップでは、基本的なリソース作成を行うTerraformスクリプトを作成し、それをGitHubリポジトリにチェックインし、GitHubリポジトリからResource Managerにプルさせてスタックを作成します。

先程GitHubリポジトリをクローンしたディレクトリに移動し、demo.tfというファイルを作成します。複雑になりすぎるといけないので、ここではTerraform設定ファイルを単一のファイルにしておきます。まず、providerブロックを追加します。このスクリプトはOracle Cloud内で実行されるため、providerで宣言が必要なのはregionだけです。

variable "compartment_ocid" {
    default = "ocid1.compartment.oc1..[redacted]"
}
variable "region" {
    default = "us-phoenix-1"
}
provider "oci" {
  region = var.region
}
view rawdemo.tf hosted with ❤ by GitHub

次に、Object Storageバケットを作成するresourceブロックを追加します。バケット名、ネームスペースを格納する変数を記述し、バケット作成結果を出力させます。以下がスクリプトです。

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

ではファイルをGitコミット、プッシュしましょう。

trsharp at ora-recursivecodes-mb in ~/Projects/terraform/oci-resource-manager-demo (main●)
$ git add demo.tf 
trsharp at ora-recursivecodes-mb in ~/Projects/terraform/oci-resource-manager-demo (main●)
$ git commit -m "initial commit"                                         
[main e2f22f2] initial commit
1 file changed, 26 insertions(+)
create mode 100644 demo.tf
trsharp at ora-recursivecodes-mb in ~/Projects/terraform/oci-resource-manager-demo (main)
$ git push -u origin main  
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 538 bytes | 538.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/recursivecodes/oci-resource-manager-demo.git
   0f30c39..e2f22f2  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
view rawgit.sh hosted with ❤ by GitHub

ではスタックをビルドしましょう。OCIコンソールで"Stacks"を探して移動します。

「Create Stack」をクリック。

オリジンに「Souce Code Control System」(1番)、GitHub Source Provider(2番)、プロジェクトリポジトリ(3番)、mainブランチ(4番)をそれぞれ選択しましょう。スタックに名前をつけます(5番)。


「Next」をクリックすると必須な変数設定がないことの確認をする二番目のウィザードに移ります。必要な場合にはここで変数の入力ができますが、それはあとで見ることにしましょう。

Nextをクリックして、情報を確認してからCreateをクリックします。するとスタック詳細ページに遷移します。


スタックが作成できたので、ジョブの実行を見ていきましょう。

注意:GitHubリポジトリからスタックを作成したので、ジョブを実行するたびに指定したブランチの最新のコミットをプルします。

ジョブの実行

ページの上のほうにTerraform Actionsというラベルがついたドロップダウンがありますね?これをクリックして実行できるアクションを見てみましょう。

このスタックに対してterraform planを実行するにはPlan(1番)をクリックします。terraform applyを実行するにはApply(2番)を、terraform destroyを実行するにはDestroy(3番)をクリックします。

When running a plan, give it a name and click ‘Plan’.

プランを実行するには、名前をつけてPlanをクリックします。

プランを実行したら、プラン詳細ページで成功メッセージが表示されるでしょう。コミットハッシュはこのプランを実行するために使われたコミットのものです。

プラン詳細ページでログをチェックしてみましょう。

Initializing provider plugins...
- Finding latest version of hashicorp/oci...
- Installing hashicorp/oci v4.12.0...
- Installed hashicorp/oci v4.12.0 (unauthenticated)
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, we recommend adding version constraints in a required_providers block
in your configuration, with the constraint strings suggested below.
*hashicorp/oci: version = "~> 4.12.0"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create
Terraform will perform the following actions:
  # oci_objectstorage_bucket.create_bucket will be created
  + resource "oci_objectstorage_bucket" "create_bucket" {
      [removed for brevity]...
    }
Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
This plan was saved to: <path hidden>
To perform exactly these actions, run the following command to apply:
    terraform apply "<path hidden>"
view rawlog.sh hosted with ❤ by GitHub

スタック詳細ページに戻ってプランを適用しましょう。

Observe the Log output on the apply job, and once it’s complete you can view the job output.

ジョブの適用で出力されたログをチェックしておき、ジョブが完了すればアウトプットも見られます。



Object Storageバケットリストページを見ると新しいバケットが作成されていることを確認できます。

最後に、スタックから作成したバケットをクリーンアップして削除します。スタック詳細ページに行ってDestroyジョブを作成し実行しましょう。

破棄はログ出力で確認できます。

oci_objectstorage_bucket.create_bucket: Refreshing state... [id=n/toddrsharp/b/resource_manager_demo_bucket]
oci_objectstorage_bucket.create_bucket: Destroying... [id=n/toddrsharp/b/resource_manager_demo_bucket]
oci_objectstorage_bucket.create_bucket: Destruction complete after 2s
view rawlog.sh hosted with ❤ by GitHub

まとめ

このポストではResource Managerを使いTerraformスクリプトをOracle Cloudで動かす方法を学びました。次のポストでは、Terraformプロジェクトを配布、共有したり、シンプルにスクリプトを使うチームメンバーのUXを改善したりすることができるよう、様々な変数の入力と検証に対応するようにスクリプトをパワフルなものに拡張します

0 件のコメント:

コメントを投稿