こんにちは。k.takeiです。
Oracle Cloud Infrastructure Advent Calendar 2025のDay23の記事です。
本記事ではDevOpsとリソースマネージャーについて紹介いたします。
主な内容としてはDevOpsとリソースマネージャーを連携してコード管理とデプロイの自動化を試してみた感想について書かせていただきます。
今回使用するサービスについて
OCI DevOpsは、OCI上でCI/CDパイプラインを提供するサービスです。
今回はコード管理からビルドパイプライン、デプロイメントパイプラインを使用して、コードの更新をトリガーにOCI上のリソースを更新するために使用します。
リソースマネージャーは、TerraformベースでOCIリソースの構築・変更・削除を自動化するためのIaCサービスです。
既存のTerraformコードをほぼそのまま持ち込めるようになっていたりします。
DevOpsの作成
まずはDevOpsを構築していきます。
今回参考にさせていただいたドキュメントは下記になります。
https://docs.oracle.com/ja/learn/rm-ocidevops/index.html#introduction
DevOpsの画面に遷移するとDevOpsプロジェクトの作成ボタンがありますので、クリックします。

プロジェクト名などを入力して作成をします。
※トピックを選択しないと作成できないので、注意が必要です。

プロジェクトの作成が完了したら、Terraformのコードを管理するためのコード・リポジトリを作成していきます。
リポジトリ名を入力して作成ボタンをクリックします。

手元のGit環境にクローンをします。
Terraformのコードを上げた状態が下記になります。

次にアーティファクトを作成していきます。
このアーティファクトにリソースマネージャーのスタックに対してTerraformの実行をしてもらいます。


コマンド仕様というタイプで作成していますが、詳細は参考にしているドキュメントの方を確認いただければと思います。
インラインの中身は下記になります。
内容はoci cliコマンドでリソースマネージャーのスタックに対してApplyのジョブを実行するものになっています。
※試す場合は<>の部分を対象のスタックのOCIDに置き換えてください。
version: 0.1
component: command
timeoutInSeconds: 1200
steps:
- type: Command
timeoutinSeconds: 900
name: Invoke TEST
command: |
echo "Running TEST apply command"
job_id=$(oci resource-manager job create-apply-job --stack-id <リソースマネージャーのスタックOCID> --execution-plan-strategy AUTO_APPROVED --wait-for-state SUCCEEDED --wait-for-state FAILED --query data.id --raw-output)
echo "TSET plan job id is:"
echo $job_id
job_state=$(oci resource-manager job get --job-id $job_id --raw-output --query 'data."lifecycle-state"')
echo "Apply job lifecycle-state is:"
echo $job_state
if [ $job_state == SUCCEEDED ]; then
echo "Resource Manager job succeeded"
exit 0
else
echo "Resource Manager job failed"
exit 1
fi
続いて、デプロイメント・パイプラインを作成していきます。
これは先ほど作成したアーティファクトを実行するためのものになります。

パイプラインの作成をしたら詳細画面に遷移します。

赤枠の部分をクリックするとパイプラインの設定ができます。
※画面のSHELL_TESTはすでに設定したものになります。
今回はアーティファクトがコマンド仕様なので、シェル・コマンドを指定します。
その後に下記の画面に遷移しますので、対象のアーティファクトを設定していきます。

注意点として、DevOpsに対してポリシーを付与する必要がありますので、ポップアップにしたがって、ポリシーを設定することを忘れないようにしてください。
次はビルド・パイプラインを作成していきます。
これはデプロイメント・パイプラインを実行するために用意します。

デプロイメントのトリガーを選択します。

作成したデプロイメント・パイプラインを設定し、完了になります。

最後にトリガーの作成をします。
これはコード・リポジトリに変更が加えられた際にビルド・パイプラインを実行するためのものです。

ソース・ブランチや含めるファイルの部分はコードに合わせて修正してください。
これでDevOpsの準備が整いましたので、続いてリソースマネージャーの構築をしていきます。
リソースマネージャーでOCIリソースを構築
リソースマネージャーの画面からスタックを作成します。

DevOpsで管理しているコードを使用します。

ここで作成したスタックのOCIDをアーティファクトのoci cliコマンド部分に埋め込みます。
これで準備は完了したので、実際に動かして見たいと思います。
DevOpsの実行
コード・リポジトリにpushをして実際に実行してみます。
ビルド・パイプラインで失敗してしまいました。

DevOpsのログが設定されていないため、トリガーからビルド・パイプラインへの連携がうまくできていないようでした。
DevOpsの画面からログを有効化します。

この状態で再度pushしたら成功しました。




無事にCI/CDを実現することができました!
おまけ
今回はDevOpsとリソースマネージャーを使用しましたが、GitLabからOCIに向けてTerraformが実行できるか気になったのでやってみました。
手順は下記の記事を参考にしています。
https://docs.oracle.com/ja/learn/oci-gitlab-repo-using-terraform/index.html#introduction
GitLabにTerraformのコードをアップロードして、「.gitlab-ci.yml」ファイルを作成します。
OCI側にユーザを作成し、APIキーを発行したら、それを使用して認証を行います。
ここら辺は参考先のリンクに記載がありますので、参照してください。
ファイル構成はこちら


こちらもコードをpushすると自動でデプロイされます。

OCI側にもきちんとリソースが作成されていました。

まとめ
最後まで読んでいただき、ありがとうございます。
今回はDevOpsを使用してTerraformの実行をしてみました。
少しエラーはありましたが、比較的スムーズに実装できたかと思います。
StateをOCI側で持ってくれているので、リソースの変更をする際も同じスタックであれば特に意識することなく更新ができました。
また、事情があってOCI側でDevOpsなどが作成できない場合でもGitLabでCI/CDを実現することが可能でした。
気軽に実装できると思いますので、みなさんもぜひお試しください!