はじめに
クラウドでは、デプロイをGUI上で人手によって行うことでヒューマンエラーが発生する可能性もあります。
また、大規模システムになればなるほど、効率的なデプロイも求められると思います。
それを踏まえたIaCという手法や、最近だと仕様駆動開発(Spec-Driven Development)というキーワードも頻繁に聞くようになりました。
ということで、今回は、GitHub ActionsとOCIのResource Managerを組み合わせて、GitHubで管理しているTerraformファイル(.tf)が更新されたら、自動的にリソースに反映する仕組みを実装してみました。
Terraform設定ファイルは、以前投稿したQiitaの内容のものをほぼそのまま使用しています。公開鍵の部分の記述とシェイプをE4に変えています。
前提
本記事では、以下はすでに完了している前提です。
・Terraform構成ファイルを作成していること
・GitHubの任意のリポジトリにTerraform構成ファイルを格納していること
・OCIアカウントおよび、VCNの作成が完了していること
GitHub側の準備
- Personal access tokenを作成
- Setting -> Developer settings -> Tokens (classic) の順に選択
- Generate new token (classic) を選択
- NoteとExpirationは自由に埋めて、Select scopesはrepoだけ選択
- 生成したtokenの値をテキストエディタなどに貼り付けて、メモしておく
[OCI] Resource Manager 構成ソース・プロバイダの作成
- GitHubのエンドポイントの情報を定義
- 開発者サービス -> リソース・マネージャ -> 構成ソース・プロバイダ の順に選択
- 構成ソース・プロバイダの作成を選択し、以下の値で設定
| 項目 | 値 |
|---|---|
| 名前 | 任意 |
| 説明 | 任意 |
| コンパートメント | 任意のコンパートメント |
| エンドポイント | パブリック・エンドポイント |
| タイプ | GitHub |
| サーバーURL | https://github.com/ |
| 個人アクセストークン | 先ほど控えたtokenの値 |
[OCI] Resource Manager スタック作成
- スタックの作成
- 開発者サービス -> リソース・マネージャ -> 構成ソース・プロバイダ の順に選択
- スタックの作成を選択し、以下の値で設定
| 項目 | 値 |
|---|---|
| Terraformの構成オリジン | ソース・コード制御システム |
| ソースコード管理タイプ | GitHub |
| 構成ソース・プロバイダ | 先ほど作成した構成ソース・プロバイダの名前 |
| リポジトリ | Terraform構成ファイルのあるリポジトリ |
| ブランチ | Terraform構成ファイルのあるブランチ |
| 名前 | 任意 |
| 説明 | 任意 |
| コンパートメントに作成 | 任意 |
| Terraformのバージョン | 任意 |
- 作成したスタックのOCIDをテキストエディタなどに貼り付けて、メモしておく
[GitHub] Secretの登録
- Terraform構成ファイルのあるリポジトリにブラウザからアクセス
- Settingタブに移動
- 左側のメニューのSecrets and Variables -> Actions をクリック
- New repositoy secretをクリックし、以下の5つのSecretを作成する
| Secret名 | 値 |
|---|---|
| OCI_CLI_USER | ユーザーのOCID |
| OCI_CLI_TENANCY | テナンシのOCID |
| OCI_CLI_KEY_CONTENT | APIキーの内容 |
| OCI_CLI_FINGERPRINT | APIキーのフィンガープリント |
| OCI_CLI_REGION | リージョン名(ap-tokyo-1、ap-osaka-1など) |
ワークフロー定義ファイルのコミット
- 以下の内容で、ワークフロー定義ファイルをリポジトリにコミット
-
OCI_RM_STACKの値は、先ほどメモしたResource Managerのスタックの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: ocid1.ormstack.oc1.ap-tokyo-1.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"'
[GitHub/OCI] 自動更新とデプロイの確認
- 任意の.tfファイルの任意の箇所を修正し、コミット (私はMemoryの値を修正しました)
- GitHubのリポジトリにブラウザでアクセスし、Actionsタブから左側に記載のある、Apply Resource Manager Stackが成功していることを確認する
- OCIのResource Managerの画面から、自動実行されたジョブが成功していて、Computeが作成されていることを確認する
確認できました!
さいごに
今回は、GitHub ActionsとOCIのResource Managerを組み合わせて、GitHubで管理しているTerraform構成ファイルの更新をトリガーにして、構成ファイルの内容をOCI Computeに反映しました。
昨今、IaCや仕様駆動開発的なことを取り組んでいるOCIユーザーの方の参考になれば幸いです。
参考


