
はじめに
こんにちは、クラウド事業部丸山です。
直近でOCIを触る機会があり、昨年はAWSでIaCの魅力に触れたため、OCI環境ではどのような方法でIaCが実現可能かをするのかということが気になったため試してみることにしました。
OCIでは基本としてはTerraformをベースとしてIaCが利用ができるようですが、残念ながら筆者はTerraformを利用した経験がありません。
学習コストを削減するべく、AWS CDKで学んだことが活かせるものがないかと探してみたところ、
CDK for Terraformというものを見つけましたためこちらを試してみることにしました。
事前準備
まず最初に、OCIのAPIキーを設定する必要があります。
Terraform利用時の公式ドキュメントを参考にして、以下のコマンドで秘密鍵と公開鍵を作成しました。
user@Machine temp % openssl genrsa -out $HOME/.oci/test_tf_oci.pem 2048 user@Machine temp % chmod 600 $HOME/.oci/test_tf_oci.pem user@Machine temp % openssl rsa -pubout -in $HOME/.oci/test_tf_oci.pem -out $HOME/.oci/test_tf_oci_public.pem writing RSA key user@Machine temp % cat $HOME/.oci/test_tf_oci_public.pem -----BEGIN PUBLIC KEY----- xxxxxxxxxxxxxxxxxxxxxxxxxxx ... (残りのキー) ... xxxxxxxxxxxxxxxxxxxxxxxxxxx -----END PUBLIC KEY----- user@Machine temp %
OCI上からの鍵生成もできそうでしたが、今回は手順に沿って以下のように進めました。

APIキーを作成したら、~/.oci/configに貼り付ける旨が表示されたため、その通りに設定しました。

CDK for Terraformプロジェクトの作成
プロジェクトのディレクトリを作成し、初期化していきます。
mkdir -p temp/src cd temp/src npm init -y npm install cdktf-cli@latest
次に、CDKTFプロジェクトを初期化します。
cdktf init --template=typescript --providers=oracle/oci
インフラストラクチャコードの実装
肝心のコードはというと、今回は動作確認が目的のためパパッと生成AIに作成してもらいました。
実際の実装時に参考となるリファレンスはこちらにありました。 developer.hashicorp.com
OCIの基本的なネットワークインフラを作成するため、以下のリソースを定義するmain.tsファイルを実装しました。
- VCN(Virtual Cloud Network)
- サブネット
- セキュリティリスト
- インターネットゲートウェイ
- ルートテーブル
また、OCIの認証情報などを変数として管理するためのvariables.tsファイルも作成しました。
次に、実際の認証情報を設定するためのterraform.tfvarsファイルの例として、terraform.tfvars.exampleを作成しました。
リソースのデプロイ
実際にデプロイする際は、terraform.tfvarsファイルに認証情報を設定します。
ここでprivate_keyを設定する必要がありますが、改行が使えないため以下のようにheredoc形式にする必要がありました。
private_key = <<-EOT -----BEGIN PRIVATE KEY----- xxxxxxxxxxxxxxxxxxxxxxxxxxx ... (残りのキー) ... xxxxxxxxxxxxxxxxxxxxxxxxxxx -----END PRIVATE KEY----- EOT
OCI環境作成後、デプロイ先となる子コンパートメントを作成したところうまくデプロイが動作しました。
user@Machine src % cdktf list
Stack name Path
oci-infra cdktf.out/stacks/oci-infra
user@Machine src % cdktf deploy oci-infra
(途中省略)
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
No outputs found.
OCIコンソールで確認すると、無事にリソースが作成されていることがわかります。

そのままデプロイしただけではStackManagerからは管理されないようでした。
この状態ではIaC管理のメリットが半減しているように思えます。
きちんと整理・検証はできていないのですが、CDK for TerraformはコードからTerraformテンプレートを作成して、
作成テンプレートからのデプロイと順を踏んだを動作になると推測しているので、OCI側の仕様なのでしょうか?
リソースの削除
リソースの削除も簡単に行えます。
user@Machine src % cdktf destroy oci-infra
(途中省略)
Destroy complete! Resources: 5 destroyed.
コンソールでも削除が反映されています。

OCIリソースマネージャー用テンプレートの作成とGUIからのデプロイ
OCIのリソースマネージャーでインフラを管理するためには、Terraformテンプレートを作成する必要がありました。
CDKTFで生成したTerraformコードをベースに、OCIリソースマネージャー用のテンプレートを作成しました。
user@Machine src % cdktf synth Generated Terraform code for the stacks: oci-infra
これにより、cdktf.out/stacks/oci-infraディレクトリに生成されたTerraformコードを参考に、以下のファイルを含むテンプレートを作成しました:
cdk.tf.json- インフラリソースの定義terraform.tfvars.example- 環境変数の設定例
これらのファイルをZIPファイルにパッケージ化し、OCIリソースマネージャーにアップロードすることでスタックを作成できます。
OCIコンソールでリソースマネージャーを開き、「スタックの作成」からマイ構成を選びZIPファイルをアップロードします。

terraform.tfvars の入力内容のように、必要なパラメータの入力をすると、スタックとして作成されるようです。

今回はスタックとして作成され、リソースも作成されました。


その他気づいた点
CDK for TerraformはOCI環境に対してはまだまだ成長段階のようで、動作はするものの完全には対応していない部分もいくらかある様に思えました。
上記で挙げたスタック管理されない点もですが、初期化コマンド時に providers オプションでoracle/ociを指定することでOCIに対応できますが、指定しない場合対話式の選択肢として初期化対象には表示がされませんでした。

GithubのリポジトリのexampleとしてもOCI用のものは用意されていないようでした。
まとめ
今回はCDK for Terraformを使ってOCIにインフラストラクチャをデプロイする方法を試してみました。
CDK for Terraformを使うことで、TypeScriptのような高レベル言語を使ってインフラを定義し、TerraformdeでOCIに展開することができます。
また、生成されたTerraformコードをOCIリソースマネージャーにアップロードして管理することも可能です。これにより、コードとしてのインフラストラクチャ(IaC)の利点を最大限に活かしながら、OCIの管理コンソールからも操作できる柔軟性を得ることができます。
CDK for TerraformはTypeScriptやPythonなど複数の言語をサポートしており、AWSのCDKに慣れている方にとっては馴染みやすいかもしれません。OCIでIaCを実践する際の選択肢として検討してみてはいかがでしょうか。
現状はひとまず操作感を試してみただけの状態なので、今後も使いこなせるように調査を進めていきたいと思います。
おわりに
私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。
また、一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。