4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCIアカウントを作成してコストアラートをTerraformで設定する

Last updated at Posted at 2025-09-16

はじめに

勉強のため、サーバーを立てたいと思いましたが、コストを少額でも払いたくないと最近思っています(ケチ)。
OCIアカウントには無料枠(インスタンス、バケットなど)があることを知り、それを使えばよさそうだと気づきました。
使う準備として、OCIアカウントを作成して、コストアラートを設定することにしました。

まとめ

先にやったことのまとめです。

①Oracle Cloud Free Tierアカウントを作成しました
②OCI Resource Managerを使ってtfstateを保管するためのバケットを作成しました(Always Free)
③Terraformで予算アラート・ルールを作成しました(Always Free)

①Oracle Cloud Free Tierアカウントの作成

Oracle Cloud Free Tierアカウントとは

以下FAQ形式ですが、詳細が載っています。

Oracle Cloud Free Tierアカウントは申し込みをすればすぐに作成することができ、$300分のクレジット(課金の割引券のようなもの)がついてきます。
アカウント内では以下無料枠のリソースを使うことができます。

・無料トライアル:$300分のクレジットの範囲内で使うことができます。
・Always Free:常に無料で、クレジットを使い切っても無料で使い続けることができます。

無料トライアルの終了後、30日間の間に、有償アカウントへアップグレードしないとリソースが削除されるので注意が必要です。

※アカウント作成時にホームリージョンを指定します。ホームリージョンにてIAMリソースが定義され、別リージョンをサブスクライブすると自動で伝搬されるようです。
※この記事作成時点で、東京リージョンではAlways FreeであるOCI Ampere A1 Computeの作成ができませんでした。使うリージョンは選んだ方がよさそうです。

Oracle Cloud Free Tierアカウントを作成する

以下URLの「無料で始める」からアカウントを作成することができます。

image.png

今回使うAlways Freeリソース

この記事ではすべて無料範囲内で構築します。以下記事から使用するAlways Freeリソースを記載します。

・オブジェクトストレージ:
標準層、頻度の低いアクセス層およびアーカイブ層データを組み合せた20 GB
1か月当たり50,000のオブジェクト・ストレージAPIリクエスト

②OCI Resource Managerを使ったtfstate用バケットの作成

バケットを作成するためのTerraformファイルを作成しました。
https://github.com/kohei39san/mystudy-handson/tree/main/028.oci-bucket-tfstate

main.tf
terraform {
  required_providers {
    oci = {
      source  = "oracle/oci"
      version = "~> 7.0"
    }
  }
}

provider "oci" {}

resource "oci_objectstorage_bucket" "tfstate_bucket" {
  compartment_id = var.compartment_ocid
  name           = var.bucket_name
  namespace      = data.oci_objectstorage_namespace.ns.namespace

  versioning = "Enabled"

  access_type = "NoPublicAccess"

  storage_tier = "Standard"

  object_events_enabled = false

  freeform_tags = {
    Purpose = "terraform-state"
  }
}

data "oci_objectstorage_namespace" "ns" {
  compartment_id = var.compartment_ocid
}

Terraformコマンドからデプロイすることもできますが、OCI Resource Managerを使うとOCIコンソールにtfファイルをアップロードすることでデプロイできます。

さらに、クエリパラメータのようにtfファイルを含むZIPファイルにアクセスできるURLを指定することもできます。
OCI公式では「Oracle Cloudへのデプロイ」ボタンとして紹介されています。

今回私が作ったtfファイルをデプロイするボタン↓も作ってみました。

Deploy to Oracle Cloud

[![Deploy to Oracle Cloud](https://oci-resourcemanager-plugin.plugins.oci.oraclecloud.com/latest/deploy-to-oracle-cloud.svg)](https://cloud.oracle.com/resourcemanager/stacks/create?zipUrl=https://github.com/kohei39san/mystudy-handson/raw/refs/heads/main/028.oci-bucket-tfstate/src/terraform-config.zip)

※ZIPファイルのURLはリリースではなくmainブランチを指しています。

ボタンを押すと、以下のようにOCIコンソール画面に飛びます。

image.png

簡単にTerraformファイルを配布するできるのは便利ですね!

③予算アラート・ルールを作成する

OCI CLIをインストールする

予算アラート・ルールをTerraformから作成するにあたり、OCI CLIを使用します。
以下URLからインストール手順を確認することができます。
https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm

Terraformから予算アラート・ルールをデプロイする

OCIでは予算アラート・ルールを使うことで、メールで利用料金のアラートを上げることができます。

以下予算アラート・ルールを作成するTerraformファイルを作成しました。リソースを作成する部分のみ抜粋しています。

# Budget Resource
resource "oci_budget_budget" "main_budget" {
  compartment_id = var.compartment_id
  amount         = var.budget_amount
  reset_period   = var.budget_reset_period
  display_name   = var.budget_display_name
  description    = "Budget for monitoring costs and triggering alerts"

  # Target the entire compartment
  targets = [var.compartment_id]

  freeform_tags = var.freeform_tags
}

# Budget Alert Rule
resource "oci_budget_alert_rule" "budget_alert_rule" {
  budget_id      = oci_budget_budget.main_budget.id
  display_name   = "${var.budget_display_name}-Alert-Rule"
  description    = "Alert rule to notify when budget threshold is exceeded"
  type           = "ACTUAL"
  threshold      = var.alert_threshold_percentage
  threshold_type = "PERCENTAGE"

  # Recipients for the alert
  recipients = join(",", var.alert_email_addresses)

  # Message template
  message = "Budget alert: Your spending has reached ${var.alert_threshold_percentage}% of your ${var.budget_amount} budget for ${var.budget_display_name}."

  freeform_tags = var.freeform_tags
}

今回はTerraformコマンドでデプロイします。作成したバケットにtfstateファイルを格納するようにします。

terraform {
  required_version = ">= 1.9.6"
  required_providers {
    oci = {
      source  = "oracle/oci"
      version = "~> 7.0"
    }
  }

  backend "oci" {}
}

provider "oci" {
  region = var.region
}

バックエンドに対して認証情報を渡す必要がありますが、永続的な認証情報を書きたくなかったので、一時的な認証ができるセッション・トークンを使用します。
https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/clitoken.htm

以下コマンドでトークンを払い出せます。

oci session authenticate

その後、terraform initする際に、コマンドのオプションに認証情報を渡します。
引数が多くなるので、スクリプト化しました。

terraform-init-oci-be.ps1
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
. "$scriptDir\terraform-conf-oci-be.ps1"

terraform init @args -backend-config="namespace=$namespace" `
    -backend-config="bucket=$bucket" `
    -backend-config="config_file_profile=$config_file_profile" `
    -backend-config="auth=$auth" `
    -backend-config="key=$key" `
    -backend-config="region=$region"
terraform-conf-oci-be.ps1
$config_file_profile = "DEFAULT"
$bucket = "terraform_state_bucket"
$auth_cli="security_token"
$auth = "SecurityToken"
$namespace = (oci os ns get --query data --raw-output --auth $auth_cli)
$key = "$(Split-Path -Leaf (Get-Location))-terraform.tfstate"
$region = (oci iam region-subscription list --auth $auth_cli --query 'data[0].\"region-name\"' --raw-output)

以下コマンドでデプロイしました。
https://github.com/kohei39san/mystudy-handson/tree/main/029.oci-cost-alert

# 初期化
PowerShell -ExecutionPolicy RemoteSigned '..\scripts\terraform-init-oci-be.ps1'

# プランの確認
terraform plan

# 適用
terraform apply

おわりに

勉強用のOCIアカウントを作成し、Terraformから利用することができました。
無料利用枠を使えば、無料でバケット作成やアラートの設定ができました。
これで、勉強場所を問わずTerraformを利用できるようになりました。
これからも勉強します。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?