APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【OCI】Oracle Resource ManagerとGitHub ActionsでOCIリソースのデプロイを自動化

目次

はじめに

こんにちは。クラウド事業部 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設定ファイルを利用してスタックを構成することも可能です。

www.oracle.com

前提

本記事で紹介する手順は以下の項目を前提としています。

  • GitHubに任意名前のリポジトリを作成している
  • OCIのアカウントを保有している
  • Terraform設定ファイルを用意している

構成

手順

GitHub側の連携準備

  1. Terraform設定ファイルをGitHubリポジトリにコミットする
  2. personal access tokenを作成し、値を控える(手順)
    • 参考に記載の通りrepoの項目を許可

Resource Manager 構成ソース・プロバイダの作成

Resource Managerのスタックを作成する前に、GitHubのエンドポイント情報を定義します。

  1. OCIにログインし、開発者サービスのメニューからリソースマネージャー->構成ソース・プロバイダをクリック
  2. 構成ソース・プロバイダを作成ボタンをクリックし、以下の値を設定して作成する
項目名 備考
名前 任意の名前
コンパートメント 任意のコンパートメント
エンドポイント パブリックエンドポイント
タイプ GitHub
サーバー https://github.com 参考
個人アクセス・トークン GitHub側の連携準備手順2で控えたpersonal access tokenの値

Resource Manager スタック作成

    1. OCIにログインし、開発者サービスのメニューからリソースマネージャー->スタックをクリック
  1. Terraformの構成のオリジンを選択します。は「ソース・コード制御システム」を選択する
  2. 以下の値を設定してNextボタンをクリックする

    項目名
    ソースコード管理タイプ GitHub
    構成ソース・プロバイダ 構成ソース・プロバイダで作成した構成ソース・プロバイ ダ
    リポジトリ Terraform設定ファイルをコミットしているリ ポジトリ
    ブランチ デプロイ対象とするブランチ
    カスタムプロバイダ チェックなし
    名前 任意のスタック名
    説明 スタックの説明
  3. 必要な構成の画面で、適宜変数を設定し、Nextボタンをクリックする
  4. 設定内容を確認し作成をクリックする
  5. 作成したスタックのOCIDを控える

Resource Manager スタック自動更新の仕組み実装

OCI CLIのセットアップ

スタックの自動更新は、GitHub ActionsのワークフローからOCI CLIを実行することで実現します。 GitHub ActionsからOCI CLIを実行するための事前準備を実施します。
※検証に利用したOCI CLIのバージョン:3.56.0

  1. OCI CLIを作業端末にインストール(手順)
  2. 以下の情報を確認する(手順)
    • OCI CLI実行ユーザーのOCID
    • OCI CLI実行対象のテナンシのOCID
  3. APIキーペアの作成(手順)
  4. APIキーペアをアップロードし、フィンガープリントを控える(手順)

Secretの登録

OCI CLIのセットアップで確認した値をGitHub Actionsのワークフローで利用するため、 GitHubのSecretsに登録します。

  1. GitHubリポジトリにブラウザからアクセスする
  2. Settingsタブに移動する
  3. 左メニューのSecrets and Variablesを展開し、Actionsをクリックする
  4. 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サービスを利用して構築する方が簡単に実装できそうかなと思います。

自動更新の確認

  1. Terraform設定ファイルの任意の個所を修正し、mainブランチにコミット
  2. GitHubリポジトリにブラウザからアクセスし、ActionsタブからワークフローApply Resource Managerが成功していることを確認する
  3. stepDisplay job nameでResouce Managerスタックで実行されたジョブの名前が出力されます。
  4. OCIのResource Managerの画面から、自動起動したジョブが成功していることを確認する

おわりに

Oracle Cloud Infrastructure(OCI)のOracle Resource Manager(Resource Manager)とGitHub Actionsを組み合わせて、
GitHubで管理しているTerraform設定ファイル(.tf)が更新されたら自動的にOCIリソースに反映する仕組みの実装方法を紹介しました。
OCIリソース管理の効率化の参考になれば幸いです。

お知らせ

私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp