Oracle Cloud Infrastructureにおけるオブジェクト・ストレージの概要

### 初めに
Oracle Cloud Infrastructure（OCI）には、Amazon Web Services（AWS）のS3に相当するサービスであるのオブジェクト・ストレージという機能があります。

Oracle Cloud Infrastructureドキュメント抜粋
「オブジェクト・ストレージ・サービスは、信頼性のあるコスト効率の高いデータ耐久性を実現するインターネット規模の高パフォーマンス・ストレージ・プラットフォームです。」

https://docs.oracle.com/ja-jp/iaas/Content/Object/Concepts/objectstorageoverview.htm

本記事では、OCIのオブジェクト・ストレージサービスをTerraformで構築し、その主な機能を実際に確認した結果を紹介します。

流れとしては、「OCIオブジェクト・ストレージの機能」、「Terraformファイルの作成ポイント」で記載します。(私はTerraform好きなんですよね。)

### OCIオブジェクト・ストレージの機能

#### ファイルのアップロードとストレージ層の選択
ファイル（オブジェクト）のアップロード時には、ストレージ層を選択することができます。これもAWS S3に似た機能で、「標準（Standard）」「アーカイブ（Archive）」などから選択が可能です。


![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/d888a0cc-724a-d3dd-982a-97ae1351b6a0.png)

また、ストレージ層の概要は以下になります。キャプチャの下のOCI のガイドからより詳細なものが確認できます。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/96422419-3d95-e4a9-30db-c16ec5890d33.png)

https://docs.oracle.com/ja-jp/iaas/Content/Object/Concepts/understandingstoragetiers.htm

#### ファイルのダウンロード

ファイルをダウンロードするには、オブジェクトストレージの管理コンソール上でファイルの右側にある「:」アイコンをクリックし、「ダウンロード」ボタンを選択します。

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/68d3a5f6-b0cc-0fa2-8355-64f3df42b5cb.png)

#### ライフサイクルポリシー
OCIのオブジェクト・ストレージには、AWS S3と同様にライフサイクルポリシーがあります。以下のように、指定した日数経過後にオブジェクトを「アーカイブ」層に移動したり、削除することが可能です。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/edc8e4dc-6433-4639-b062-05d2dfce054a.png)


#### ストレージ層の変更
アップロード済みのファイルについて、後からストレージ層を変更することも可能です。たとえば、「標準」から「アーカイブ」に変更することができます。ただし、「アーカイブ」に変更した場合、ダウンロードは直接行えません。（以下のキャプチャのようにダウンロードがグレーアウトされます）一度ストレージ層を「標準」に戻してからダウンロードする必要があります。
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/f2491703-b9e0-78db-ee88-9f72a67d18e3.png)

#### バージョニング機能
バージョニングを有効にすると、同じ名前の新しいバージョンのファイルをアップロードするたびに、以前のバージョンが過去バージョンになります。ストレージ層のオプションから過去のバージョンを確認することができます。また、最新のバージョンは「最新のバージョン」として表示されます。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/bd13ef09-ebb9-5ae0-556c-7d542b69d29a.png)

### Terraformファイルの作成ポイント
上記機能を確認するために、以下のTerraformファイルを実行しました。各設定のポイントは以下の通りです。

```Strage.tf
# 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したのは良くなかったです、、、）
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/9d0a13a0-b651-5bc7-da5c-bf842c3f0ad5.png)

参考リンク
 - oci_objectstorage_bucket

https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/objectstorage_bucket

 - oci_objectstorage_object_lifecycle_policy

https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/objectstorage_object_lifecycle_policy