Terraformを使用したOracle Cloudリソースのプロビジョニングの多くの方法 (2022/12/31)
Terraformを使用したOracle Cloudリソースのプロビジョニングの多くの方法 (2022/12/31)
投稿者:Lucas Jellema
Terraformは、Oracle Cloud Infrastructure上のリソースの自動プロビジョニングに使用されます。リソースはHCL(Terraformでインフラを記述するためのDSL)で定義され、これらの定義はTerraform用のOCIプロバイダによって処理され、定義がOCI REST APIの必要な呼び出しに変換されます。
Terraformの定義に基づいてOCIリソース管理を実行するには、いくつかの方法があります。この記事ではそれらをまとめ、OCI CLIを使ったStackの作成とその後の適用を簡単にデモしています。
Terraformの定義からOCI Resourcesを作成する方法です。
- スタンドアロン Terraform を実行する (どこでも、セルフインストール) - OCI Provider をインストールし、ローカルの OCI 設定と認証を行う - 私の記事を読んでください。
- Terraform を使って作成できる OCI リソースの 1 つは、Terraform の設定をベースにした Stack で、OCI リソースのプロビジョニングに使用できることに留意してください。
- OCI CloudShell から Terraform を実行する - Terraform は既に含まれており、Instance Principal Authorization (秘密鍵不要) で実行できる - 私の記事を読んでください。
- Terraform を使って、Terraform の設定に基づいた Stack を作成することができます(そして、その Stack はさらに別の Stack を定義したりすることができます)。
- Terraform の設定に基づき OCI でスタックを作成し、変数に値を与えた後、スタックを適用します。Terraform は完全に管理された VM を実行します(Terraform、OCI Provider、認証が管理されます); スタックはいくつかの方法で作成できます。
- コンソールから - アップロードされたZipファイル、ソースコードリポジトリ(OCI DevOps Code Repo, GitHub, BitBucket, GitLab, ...)への参照、プライベートテンプレート、既存の区画(とそのリソース)- 私の記事を読んでください。
- OCI CLIから - ローカルまたはCloud Shellで実行 - ローカルZIPファイルまたはソースコード・リポジトリへのリファレンスを使用
- Oracle DevOps Build Pipelineから - OCI DevOps Build Serverは、OCI CLIがプリインストールされたVMである(Terraformはないが)。
- (近い将来-執筆時点では未サポート-2022年12月)OCI DevOps Deployment Pipelineを実行し、次にStackを適用するResource Managerジョブを実行する。
以前の記事で、このリストの最初の3つのオプションを紹介しました(参考文献を参照)。この記事の残りの部分では、OCI CLIを使用してTerraformの設定から素早くStackを作成し、そのStackを適用します。この方法は、OCI Console Cloud Shell や OCI DevOps Build Pipeline など、OCI CLI が動作する場所であればどこでも使用することができます。
OCI CLIによるStackの作成と適用
まず、StackのベースとなるTerraformの構成が入ったGitリポジトリをクローンします。そして、Terraformの設定を構成するファイルを含むZIPファイルを作成します。今回の場合、GitリポジトリはこちらのGitHub URLにあります。Terraformの設定はstackBucketAndObjectというディレクトリに格納されています。以下のコードでは、リポジトリのクローンを作成し、このディレクトリの内容でzipファイルbucket-and-object-stack.zipを作成し、クローンしたリポジトリを削除しています。
cd /tmp
git clone https://github.com/lucasjellema/oci-terraform-composites
cd ./oci-terraform-composites/stackBucketAndObject
zip -r bucket-and-object-stack.zip .
mv bucket-and-object-stack.zip ../..
rm -Rf oci-terraform-composites
cd ../..
スタック用の zip ファイルを手に入れたら、次は OCI CLI を使ってスタックを作成し、そのスタック用の適用ジョブを作成する 2 つのコマンドを実行します。
export config_source_zip=./bucket-and-object-stack.zip
export compartment_id=ocid1.compartment.oc1..aaaaaaaa5q2srleka3ll2xgpcdj3uns3nshzc3lbn2wgx2kcuah5blh47icq
export stack_display_name=object-storage-bucket-stack
STACK_ID=$(oci resource-manager stack create –compartment-id $compartment_id –display-name=$stack_display_name –description “Created through OCI CLI” –config-source $config_source_zip | jq -r ‘.data.id’)
oci resource-manager job create-apply-job –execution-plan-strategy AUTO_APPROVED –stack-id $STACK_ID –display-name “Running Apply Job from OCI CLI”
これらのコマンドの実行は、次のようになります(Command Shellの場合)。
すべてがうまくいっているように見えます。しかし、このジョブは失敗していることが判明しました。この方法でスタックを作成すると、コンソールからスタックを作成したときと同じデフォルト値が tenancy_ocid と compartment_ocid に適用されないらしいのです。
したがって、スタックの作成時に、これらの変数に(デフォルトの)値を提供する必要があります。適用するジョブが作成されるとき、スタックに定義された値を上書きするために、変数も提供することができます。
2番目の試みは次のようなものです。
export config_source_zip=./bucket-and-object-stack.zip
export compartment_id=ocid1.compartment.oc1..aaaaaaaa5q2srleka3ll2xgpcdj3uns3nshzc3lbn2wgx2kcuah5blh47icq
export tenancy_ocid=ocid1.tenancy.oc1..aaaaaaaag7c7slwmlvsodyym662ixlsonnihko2igwpjwwe2egmlf3gg6okq
export stack_display_name=object-storage-bucket-stack
export region=”us-ashburn-1″
export variables=(‘{“compartment_ocid”: “‘${compartment_id}'”, “tenancy_ocid”: “‘${tenancy_ocid}'” , “region”: “‘${region}'” }’)
STACK_ID=$(oci resource-manager stack create –compartment-id $compartment_id –display-name=$stack_display_name –description “Created through OCI CLI” –config-source $config_source_zip –variables “${variables}” | jq -r ‘.data.id’)
oci resource-manager job create-apply-job –execution-plan-strategy AUTO_APPROVED –stack-id $STACK_ID –display-name “Running Apply Job from OCI CLI”
そして、今回はスタックが作成され、ジョブが正常に実行されました。
仕事の成果:
BucketとObjectが作成されます。
別のBucketとオブジェクトのために、2つ目のスタックを作成し、適用してみましょう。
export bucket_name=”atlas-bucket”
export object_name=”countries-collection.csv”
export source_url=”https://raw.githubusercontent.com/mledoze/countries/master/dist/countries.csv”
export variables=(‘{“compartment_ocid”: “‘${compartment_id}'”, “tenancy_ocid”: “‘${tenancy_ocid}'” , “region”: “‘${region}'”, “bucket_name”:”‘${bucket_name}'”, “object_name”:”‘${object_name}'”, “source_url”:”‘${source_url}'” }’)
STACK_ID=$(oci resource-manager stack create –compartment-id $compartment_id –display-name=$stack_display_name –description “Created through OCI CLI” –config-source $config_source_zip –variables “${variables}” | jq -r ‘.data.id’)
oci resource-manager job create-apply-job –execution-plan-strategy AUTO_APPROVED –stack-id $STACK_ID –display-name “Running Apply Job from OCI CLI”
そして、対応するBucketとObjectが作成されます。
Bucketにディープリンクすることも
リソース
run standalone Terraform (anywhere, self installed) – with OCI Provider
installed and with local OCI configuration and authentication – read my article
run Terraform from OCI CloudShell – which already contains Terraform
and can run with Instance Principal Authorization (no private key
required) – read my article
create a Stack in OCI based on a Terraform configuration and – after
providing values for variables – apply the stack – through the console – based on an uploaded Zip-file –
read my article
OCI Documentation CLI Reference Create Stack – https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.22.0/oci_cli_docs/cmdref/resource-manager/stack/create.html
my GitHub Repo with OCI Terraform definitions – https://github.com/lucasjellema/oci-terraform-composites
コメント
コメントを投稿