はじめに
勉強のため、サーバーを立てたいと思いましたが、コストを少額でも払いたくないと最近思っています(ケチ)。
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の「無料で始める」からアカウントを作成することができます。
今回使う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
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ファイルをデプロイするボタン↓も作ってみました。
[](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コンソール画面に飛びます。
簡単に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
する際に、コマンドのオプションに認証情報を渡します。
引数が多くなるので、スクリプト化しました。
$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"
$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を利用できるようになりました。
これからも勉強します。