目次
はじめに
こんにちは。クラウド事業部 IaC技術推進部の西野です。
Git管理しているIaCファイルの更新に伴うデプロイを人手で行っている場合、
デプロイ忘れなどのヒューマンエラーで、環境とIaCファイルに差異が出てしまった経験はないでしょうか。
IaCファイルのデプロイ自動化を導入することで、デプロイの手間の削減になるほか、
環境とIaCファイルが一致する状態を維持することができます。
今回は、Oracle Cloud Infrastructure(OCI)のOracle Resource Manager(Resource Manager)とGitHub Actionsを組み合わせて、
GitHubで管理しているTerraform設定ファイル(.tf)が更新されたら自動的にOCIリソースに反映する仕組みを実装しました。
本記事では、Terraformテンプレートは任意のものを準備している想定で、GitHubとの連携方法を紹介しています。
動作検証ではTerraform設定ファイルはオラクル社提供のテンプレートOracle Cloud Development Kitを流用しています。
テンプレートは、一度Git連携させない設定でスタックを作成し、スタック情報のTerraform構成のダウンロードリンクから入手しました。
Oracle Resource Managerとは
OCIリソースのデプロイメントと操作を自動化するOracleマネージドサービスです。
Terraform実行エンジンがOCI上に実装されており、リソースの状態(State)はOCI上で管理されます。
スタックという単位でTerraform設定ファイルに定義されたリソースを管理し、
Plan・Apply・Destoryなどのスタックに対する操作はジョブという単位で実行管理されます。
GitHubやGitLabなどのソース・コード制御システムで管理しているTerraform設定ファイルを利用してスタックを構成することも可能です。
前提
本記事で紹介する手順は以下の項目を前提としています。
- GitHubに任意名前のリポジトリを作成している
- OCIのアカウントを保有している
- Terraform設定ファイルを用意している
構成
手順
GitHub側の連携準備
Resource Manager 構成ソース・プロバイダの作成
Resource Managerのスタックを作成する前に、GitHubのエンドポイント情報を定義します。
- OCIにログインし、
開発者サービス
のメニューからリソースマネージャー
->構成ソース・プロバイダ
をクリック 構成ソース・プロバイダを作成
ボタンをクリックし、以下の値を設定して作成する
項目名 | 値 | 備考 |
---|---|---|
名前 | 任意の名前 | |
コンパートメント | 任意のコンパートメント | |
エンドポイント | パブリックエンドポイント | |
タイプ | GitHub | |
サーバー | https://github.com | 参考 |
個人アクセス・トークン | GitHub側の連携準備手順2で控えたpersonal access tokenの値 |
Resource Manager スタック作成
- OCIにログインし、
開発者サービス
のメニューからリソースマネージャー
->スタック
をクリック
- OCIにログインし、
Terraformの構成のオリジンを選択します。
は「ソース・コード制御システム」を選択する以下の値を設定して
Next
ボタンをクリックする項目名 値 ソースコード管理タイプ GitHub 構成ソース・プロバイダ 構成ソース・プロバイダで作成した構成ソース・プロバイ ダ リポジトリ Terraform設定ファイルをコミットしているリ ポジトリ ブランチ デプロイ対象とするブランチ カスタムプロバイダ チェックなし 名前 任意のスタック名 説明 スタックの説明 - 必要な構成の画面で、適宜変数を設定し、
Next
ボタンをクリックする - 設定内容を確認し
作成
をクリックする - 作成したスタックのOCIDを控える
Resource Manager スタック自動更新の仕組み実装
OCI CLIのセットアップ
スタックの自動更新は、GitHub ActionsのワークフローからOCI CLIを実行することで実現します。
GitHub ActionsからOCI CLIを実行するための事前準備を実施します。
※検証に利用したOCI CLIのバージョン:3.56.0
- OCI CLIを作業端末にインストール(手順)
- 以下の情報を確認する(手順)
- OCI CLI実行ユーザーのOCID
- OCI CLI実行対象のテナンシのOCID
- APIキーペアの作成(手順)
- APIキーペアをアップロードし、フィンガープリントを控える(手順)
Secretの登録
OCI CLIのセットアップで確認した値をGitHub Actionsのワークフローで利用するため、 GitHubのSecretsに登録します。
- GitHubリポジトリにブラウザからアクセスする
Settings
タブに移動する- 左メニューの
Secrets and Variables
を展開し、Actions
をクリックする new repository secret
をクリックし、以下の値を入力したSecretをAdd secret
で追加する
Secret名 | 値の説明 |
---|---|
OCI_CLI_USER | OCI CLIのセットアップ手順2で控えたOCI CLI実行ユーザーのOCID |
OCI_CLI_TENANCY | OCI CLIのセットアップ手順2で控えたOCI CLI実行対象のテナンシのOCID |
OCI_CLI_KEY_CONTENT | OCI CLIのセットアップ手順3で作成したキーペアの秘密鍵のファイル内容 |
OCI_CLI_FINGERPRINT | OCI CLIのセットアップ手順4で控えたフィンガープリント |
OCI_CLI_REGION | リージョン(例: ap-tokyo-1) |
ワークフロー定義ファイルのコミット
以下の内容でワークフロー定義ファイル(./github/workflows/auto_apply.yml
)をリポジトリにコミットしてください。
OCI_RM_STACK: xxx
部分はResource Manager スタック作成手順6で控えたOCIDに置き換えてください。
name: Apply Resource Manager Stack on: push: branches: - main # 対象ブランチを指定 paths: - '**/*.tf' jobs: apply-resource-manager-stack: runs-on: ubuntu-latest name: Apply Resource Manager Stack env: OCI_CLI_USER: ${{ secrets.OCI_CLI_USER }} OCI_CLI_TENANCY: ${{ secrets.OCI_CLI_TENANCY }} OCI_CLI_FINGERPRINT: ${{ secrets.OCI_CLI_FINGERPRINT }} OCI_CLI_KEY_CONTENT: ${{ secrets.OCI_CLI_KEY_CONTENT }} OCI_CLI_REGION: ${{ secrets.OCI_CLI_REGION }} OCI_RM_STACK: xxx # スタックのOCID steps: - name: Create apply job uses: oracle-actions/run-oci-cli-command@v1.3.2 id: create-apply-job with: command: 'oci resource-manager job create-apply-job --stack-id ${{ env.OCI_RM_STACK }} --execution-plan-strategy AUTO_APPROVED' - name: Display job name run: | echo ${{ steps.create-apply-job.outputs.output }} | jq '.data."display-name"'
注意事項
本検証で作成したワークフロー定義ファイルは以下の仕様になっています。
運用に乗せるとしたら、要件によっては実装した方が良いと思います。
- planジョブの結果は確認はしていない
- applyジョブでplanジョブを自動承認している
- applyジョブの実行をトリガーするのみ処理で、ジョブの実行結果確認まではしていない
- 検証していないので推測ですが、ワークフローでジョブの実行結果確認を実装するより、Oracle Resource Managerのジョブの結果を通知する仕組みをOCIサービスを利用して構築する方が簡単に実装できそうかなと思います。
自動更新の確認
- Terraform設定ファイルの任意の個所を修正し、mainブランチにコミット
- GitHubリポジトリにブラウザからアクセスし、Actionsタブからワークフロー
Apply Resource Manager
が成功していることを確認する - step
Display job name
でResouce Managerスタックで実行されたジョブの名前が出力されます。 - OCIのResource Managerの画面から、自動起動したジョブが成功していることを確認する
おわりに
Oracle Cloud Infrastructure(OCI)のOracle Resource Manager(Resource Manager)とGitHub Actionsを組み合わせて、
GitHubで管理しているTerraform設定ファイル(.tf)が更新されたら自動的にOCIリソースに反映する仕組みの実装方法を紹介しました。
OCIリソース管理の効率化の参考になれば幸いです。
お知らせ
私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。