初めに
Oracle Cloud Infrastructure(OCI)には、Amazon Web Services(AWS)のS3に相当するサービスであるのオブジェクト・ストレージという機能があります。
Oracle Cloud Infrastructureドキュメント抜粋
「オブジェクト・ストレージ・サービスは、信頼性のあるコスト効率の高いデータ耐久性を実現するインターネット規模の高パフォーマンス・ストレージ・プラットフォームです。」
本記事では、OCIのオブジェクト・ストレージサービスをTerraformで構築し、その主な機能を実際に確認した結果を紹介します。
流れとしては、「OCIオブジェクト・ストレージの機能」、「Terraformファイルの作成ポイント」で記載します。(私はTerraform好きなんですよね。)
OCIオブジェクト・ストレージの機能
ファイルのアップロードとストレージ層の選択
ファイル(オブジェクト)のアップロード時には、ストレージ層を選択することができます。これもAWS S3に似た機能で、「標準(Standard)」「アーカイブ(Archive)」などから選択が可能です。
また、ストレージ層の概要は以下になります。キャプチャの下のOCI のガイドからより詳細なものが確認できます。
ファイルのダウンロード
ファイルをダウンロードするには、オブジェクトストレージの管理コンソール上でファイルの右側にある「:」アイコンをクリックし、「ダウンロード」ボタンを選択します。
ライフサイクルポリシー
OCIのオブジェクト・ストレージには、AWS S3と同様にライフサイクルポリシーがあります。以下のように、指定した日数経過後にオブジェクトを「アーカイブ」層に移動したり、削除することが可能です。
ストレージ層の変更
アップロード済みのファイルについて、後からストレージ層を変更することも可能です。たとえば、「標準」から「アーカイブ」に変更することができます。ただし、「アーカイブ」に変更した場合、ダウンロードは直接行えません。(以下のキャプチャのようにダウンロードがグレーアウトされます)一度ストレージ層を「標準」に戻してからダウンロードする必要があります。
バージョニング機能
バージョニングを有効にすると、同じ名前の新しいバージョンのファイルをアップロードするたびに、以前のバージョンが過去バージョンになります。ストレージ層のオプションから過去のバージョンを確認することができます。また、最新のバージョンは「最新のバージョン」として表示されます。
Terraformファイルの作成ポイント
上記機能を確認するために、以下のTerraformファイルを実行しました。各設定のポイントは以下の通りです。
# OCIプロバイダーの設定
provider "oci" {
region = "ap-tokyo-1"
auth = "InstancePrincipal"
}
# オブジェクトストレージのネームスペースを取得
data "oci_objectstorage_namespace" "namespace" {}
# IAMポリシーの追加(ソースコンパートメントに必要な権限を付与)
resource "oci_identity_policy" "object_storage_service_policy" {
name = "allow_object_storage_service_to_manage_buckets"
compartment_id = var.stg_compartment_ocid # コンパートメントのOCIDを指定
statements = [
"Allow service objectstorage-ap-tokyo-1 to manage buckets in compartment ${var.compartment_name}",
"Allow service objectstorage-ap-tokyo-1 to manage object-family in compartment ${var.compartment_name}"
]
description = "Allows Object Storage service to manage buckets and object-family in the source compartment"
}
# オブジェクトストレージバケットの作成(東京リージョン)
resource "oci_objectstorage_bucket" "bucket" {
namespace = data.oci_objectstorage_namespace.namespace.namespace # バケットが属するネームスペースを指定
name = "test-bucket" # 作成するバケットの名前
compartment_id = var.stg_compartment_ocid # バケットを作成するコンパートメントのOCID(変数で定義)
storage_tier = "Standard" # ストレージのティアを「Standard」に設定
versioning = "Enabled" # バージョニングを有効に設定
access_type = "NoPublicAccess" # パブリックアクセスを許可しない設定
}
# オブジェクトの古いバージョンを自動的に管理するライフサイクルポリシー
resource "oci_objectstorage_object_lifecycle_policy" "bucket_lifecycle_policy" {
namespace = data.oci_objectstorage_namespace.namespace.namespace # ネームスペースの設定
bucket = oci_objectstorage_bucket.bucket.name # ポリシーを適用するバケットの名前
# 10日後にオブジェクトをアーカイブ
rules {
action = "ARCHIVE"
is_enabled = true
name = "archive_after_10_days"
time_amount = 10
time_unit = "DAYS"
}
# 20日後にオブジェクトを削除
rules {
action = "DELETE"
is_enabled = true
name = "delete_after_20_days"
time_amount = 20
time_unit = "DAYS"
}
}
# 変数の定義
variable "stg_compartment_ocid" {
description = "The OCID of the staging compartment"
}
variable "compartment_name" {
description = "The name of the compartment where the bucket is created"
}
ポイント①
IAMポリシーの設定: oci_identity_policy
リソースで、オブジェクトストレージサービスに対して、バケットの管理や操作を許可するポリシーを設定しています。この設定により、Terraform(リソースマネージャー)でバケットの作成やライフサイクルポリシーの適用が可能になります。
ここで以下のエラーが出てたのですが、何回TF流してもうまくいかずに、まったく原因わからず、ChatGPT先生に教えてもらいました。ここはちょっと難しいかと思います。webの情報もまだ少ないのでそういった面でも解決難しかったです。
Error: 400-InsufficientServicePermissions, Permissions granted to the object storage service principal "objectstorage-ap-tokyo-1" to this bucket are insufficient.
ポイント②
変数の利用 variable
ブロックで、コンパートメントのOCIDなどの動的に変更可能な値を定義しています。これにより、設定の再利用(StgやPrdで)や管理のしやすさが向上します。
以下のようにリソースマネージャーで実行する際に入力画面が返るようになります。
ここも上記ポイント①を直すときにChatGPT先生が提案してくれました。
(stg_compartment_ocidのようにstgしたのは良くなかったです、、、)
参考リンク
- oci_objectstorage_bucket
- oci_objectstorage_object_lifecycle_policy