【今から覚えるONTAPの操作】オブジェクトストレージ 用のSVMを作成する

## はじめに
**ONTAPでは、ONTAP S3と呼ばれるオブジェクトストレージ機能を提供できます。この機能は、Amazon Web Services (AWS) のSimple Storage Service (S3) と同じプロトコルを使用**することで、データの保存、取得、管理をシンプルなAPI呼び出しで行えるようにします。これにより、アプリケーションの開発者はクラウドネイティブなデータアクセスパターンをオンプレミス環境で利用できるようになります。

また、既存のONTAP環境に統合されることで、高い可用性、セキュリティ、パフォーマンスを提供し、エンタープライズレベルのオブジェクトストレージソリューションを実現します。本記事では、**オンプレミス環境でONTAP S3の設定をCLIで実施する手順について記載**します。

なお、ONTAP S3利用時のベストプラクティスについては、[S3 in ONTAP best practices](https://www.netapp.com/media/17219-tr4814.pdf)をご参照ください。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9dce5ed9-2d74-9e11-d79f-d9c9c9a396bd.png>



## 何をしたい？できる？
- **ONTAPにオブジェクトストレージ用のSVMの作成**
- **作成するBacketにVersioningを有効化**
- LinuxからAWSのS3コマンドを使用してS3アクセスの実施

## S3用の仮想ストレージ（SVM）作成の流れ
基本的な設定作業の流れは下図の通りになります。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b9b65dcb-cde0-493a-1822-860d3387875f.png)

**本記事では図の1～3の物理的な設定は完了済と想定しての記載**で、仮想ストレージであるSVMからの作成について記載致します。

Aggregate作成や物理Networkの設定については確認したい際は、[過去記事](https://qiita.com/s_yosh1d/items/8139061376354d087bf9)を参照頂ければと思います。


## 記事における環境情報
本記事では、以下の環境で実施した内容となります。
- Red Hat Enterprise Linux  : 8.10
- ONTAP  : 9.15.1

環境のイメージとしては以下の通りです。

<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/679db30a-ec6a-e13a-4169-bfd272915c9b.png>


## 実施手順


### 1. 仮想ストレージの作成

仮想ストレージ(SVM)をS3用途として作成します。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cccbb5e7-4950-be5d-9ca2-74fc9afd8a3e.png>


```bash:
> vserver create -vserver s3_test -subtype default -data-services data-s3-server -language C.UTF-8
[Job 102] Job succeeded:
Vserver creation completed.
```

### 2. HTTPS疎通に関する証明書関連処理の実施
本記事では、社内の検証環境における手順例となっている為、
信頼性には欠けますが自ら発行する自己署名証明書を利用した形で実施します。

<img width="550" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/949f5c00-8ef8-e537-d37a-94fb65d71476.png>


#### 2-1. SSL自己署名証明書を作成(ルート認証局の証明書)
**本記事では、自己署名デジタル証明書を作成してインストール**します。
自己署名デジタル証明書は、サーバ認証、認証局（CA）として動作する他の証明書への署名、またはSSLクライアントとしてのONTAPで使用できます。
但し、CAによって署名された証明書ほどセキュアではないため、実稼働環境では推奨されません。

```bash:
> security certificate create -vserver s3_test -type root-ca -common-name s3_test_ca

The certificate's generated name for reference: s3_test_ca_180724491D358AA4_s3_test_ca
```

#### 2-2. CSRを生成し、コンソールに表示

**CSR(証明書署名要求)は、デジタル証明書を発行してもらうために認証局（CA）に送信されるメッセージ**となり、次の手順で必要となります。ここではCertificate Signing Requestを控えておきます。
```bash:
> security certificate generate-csr -common-name s3_test.demo.netapp.com

Certificate Signing Request :
-----BEGIN CERTIFICATE REQUEST-----
MIICpzCCAY8
(中略)
KqYMPI+wrfmF3dY=
-----END CERTIFICATE REQUEST-----


Private Key :
-----BEGIN PRIVATE KEY-----
MIIEvAIBADAN
(中略)
J1VfKuxg==
-----END PRIVATE KEY-----

Note: Keep a copy of your certificate request and private key for future reference.
```

#### 2-3. CSRに署名
**2-2で作成したCSRに署名**し、2-1で作成した自己署名ルートCA証明書を使用してデジタル証明書を生成します。
**コマンド実行後に表示される"Enter certificate signing request (CSR): Press <Enter> when done"の後に2-2で表示されたCSR要求を貼り付け**ます。

```bash:
> security certificate sign -vserver s3_test -ca s3_test_ca -ca-serial 180724491D358AA4 -expire-days 356

Enter certificate signing request (CSR): Press <Enter> when done

-----BEGIN CERTIFICATE REQUEST-----
MIICpzCCAY8
(中略)
KqYMPI+wrfmF3dY=
-----END CERTIFICATE REQUEST-----


Signed Certificate :
-----BEGIN CERTIFICATE-----
MIIDQjCCAiqgAwIBAgIIGAbUKvxl0sEwDQYJKoZIhvcNAQELBQAwIjETMBEGA1UE
(中略)
f1e3VQ/NsvtR37cdfEKEQb/WlNPSaQ==
-----END CERTIFICATE-----
```

設定内容を確認します。
```bash:
> security certificate show -vserver s3_test -common-name s3_test_ca -type root-ca  -instance
                             Vserver: s3_test
                    Certificate Name: s3_test_ca_180724491D358AA4_s3_test_ca
          FQDN or Custom Common Name: s3_test_ca
        Serial Number of Certificate: 180724491D358AA4
               Certificate Authority: s3_test_ca
                 Type of Certificate: root-ca
 Size of Requested Certificate(bits): 2048
              Certificate Start Date: Tue Nov 12 06:21:18 2024
         Certificate Expiration Date: Wed Nov 12 06:21:18 2025
              Public Key Certificate: -----BEGIN CERTIFICATE-----
                                      MIIDXTCCAkWgAwIBAgII
                                      (中略)
                                      dRb/HENw==
                                      -----END CERTIFICATE-----
        Country Name (2 letter code): US
  State or Province Name (full name):
           Locality Name (e.g. city):
    Organization Name (e.g. company):
    Organization Unit (e.g. section):
        Email Address (Contact Name):
                            Protocol: SSL
                    Hashing Function: SHA256
                             Subtype: -
```

### 3. LIFの作成
S3アクセス用のIPを付与する為にLIFの作成を実施します。
LIFの作成時には、IPの他に普段の通信経路となるコントローラとPortを指定を行い、**S3利用としてservice-policyの作成**を実施します。

<img width="500" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/24816a2b-7f5e-f636-1a08-c0e1f1b9868f.png>

#### 3-1. Service-policyの作成

Advanced ModeでS3アクセス用のPolicy作成を実施します。
```bash:
> set advanced

Warning: These advanced commands are potentially dangerous; use them only when directed to do so by NetApp personnel.
Do you want to continue? {y|n}: y

*> net int service-policy create -vserver s3_test -policy policy01 -services data-core,data-s3-server
```


#### 3-2. LIFの作成

3-1で作成したPolicyを指定してLIFの作成を実施します。
```bash:
*> net int create -vserver s3_test -lif data01 -service-policy policy01 -home-port e0f -home-node cluster2-01 -address 192.168.0.161 -netmask 255.255.255.0
  (network interface create)
```



### 4. Object Storeの作成

Object Store Serverの作成を実施します。
なお、Object StoreとBucketの違いは以下の通りとなります。

- **Object Store**
データをObjectとして保存するストレージシステム全体
データの保存、管理、アクセスを行うためのインフラ全体を意味

- **Bucket**
Object Store内のデータを整理するためのコンテナ
各バケットには、複数のオブジェクトが含まれる
Bucketは、特定のプロジェクト、ユーザー、またはアプリに関連するデータをグループ化するため利用


<img width="450" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d4543602-36b2-2116-b043-f3ab4e233bc8.png>


#### 4-1. Server Typeの証明書名の確認
本記事では、HTTPSアクセスのみ有効となる形で作成しますが、**HTTPS利用にあたってObject Store Serverの作成時に指定する証明書名は**、サーバCA証明書（中間またはルートCA証明書）ではなく、**サーバ証明書**（エンドユーザまたはリーフ証明書）の名前にする必要があります。


```bash:
#　serverTypeの証明書名の確認
*> security certificate show -vserver s3_test
Vserver    Serial Number   Certificate Name                       Type
---------- --------------- -------------------------------------- ------------
s3_test    180724480147EEF9
                           s3_test_180724480147EEF9               server
    Certificate Authority: s3_test
          Expiration Date: Wed Nov 12 06:21:13 2025

s3_test    180724491D358AA4
                           s3_test_ca_180724491D358AA4_s3_test_ca root-ca
    Certificate Authority: s3_test_ca
          Expiration Date: Wed Nov 12 06:21:18 2025

s3_test    180724491D358AA4
                           s3_test_ca_180724491D358AA4            client-ca
    Certificate Authority: s3_test_ca
          Expiration Date: Wed Nov 12 06:21:18 2025

s3_test    180724491D358AA4
                           s3_test_ca                             server-ca
    Certificate Authority: s3_test_ca
          Expiration Date: Wed Nov 12 06:21:18 2025

4 entries were displayed.
```

#### 4-2. Object Store Serverの作成
本記事では、HTTPSアクセスのみ有効となる形で作成します。
その為、HTTPは有効化しないで進めます。

```bash:
#　Object Store Serverの作成
*> vserver object-store-server create -vserver s3_test -object-store-server s3_test.demo.netapp.com -status-admin up -certificate-name s3_test_180724480147EEF9


#　Object Store Serverの状態確認
*> vserver object-store-server show

Vserver: s3_test

           Object Store Server Name: s3_test.demo.netapp.com
               Administrative State: up
                       HTTP Enabled: false
             Listener Port For HTTP: 80
                      HTTPS Enabled: true
     Secure Listener Port For HTTPS: 443
  Certificate for HTTPS Connections: s3_test_180724480147EEF9
                  Default UNIX User: pcuser
               Default Windows User: -
          Maximum Value for Key TTL: -
                            Comment:
```


### 5. Bucket作成、User作成、権限設定

#### 5-1. Bucket作成
**ONTAP S3は、FlexGroupをベースにBucketを提供**されます。
Bucket作成時に利用する対象Aggregateとサイズを指定する事でBacketを作成する事ができます。

<img width="450" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/c58eb601-c32b-84c3-6246-77dfb0eb15c4.png>

```bash:
*> vserver object-store-server bucket create -vserver s3_test -bucket bk001 -aggr-list aggr1_node1,aggr1_node2 -size 10g
[Job 112] Job succeeded: Successful
```


#### 5-2. Bucket Versioningを有効化
**本記事ではONTAP9.11.1以降で利用可能なBucket Versioningを有効化**する為、Backet作成後にmodifyを実施します。
**Bucket Versioningは、オブジェクトの複数のバージョンを保持クライアント側で削除済みオブジェクトをリストアしたり、以前のバージョンのオブジェクトを読み出したりすることが可能**となりますが、**有効にすると一時停止のみで無効には出来ない機能**となります。
```bash:
*> object-store-server bucket modify -bucket bk001 -versioning-state enabled
  (vserver object-store-server bucket modify)
[Job 141] Job succeeded: Successful

object-store-server bucket show -vserver s3_test -instance
  (vserver object-store-server bucket show)

Vserver: s3_test

  Bucket                               :bk001
  Type                                 :s3
  Versioning                           :enabled
  Uuid                                 :65ebb7b9-a0bf-11ef-bb53-00505681bd7f
  Volume                               :fg_oss_1731392927
  Size                                 :10GB
  Logical Used Size                    :0KB
  Object Count                         :0
  Encryption                           :false
  Comment                              :
  Qos Policy Group                     :-
  Role                                 :standalone
  Bucket Protected                     :false
  Bucket Protected On ONTAP            :false
  Bucket Protected On Cloud            :false
  Bucket Protected on External Cloud   :false
  NAS Path                             :-
  Object Lock Retention Mode           :no-lock
  Object Lock Default Retention Period :-
```

#### 5-3. S3アクセス用のユーザ作成
Object StoreまたはBucketにアクセスする為のユーザ作成を実施します。
**ユーザ作成時に表示されるSecret Keyは後で再確認ができない**為、ユーザ作成時に
Access KeyとSecret Keyを合わせて控えておきます。
```bash:
*> vserver object-store-server user create -vserver s3_test -user s3user
    Vserver: s3_test
       User: s3user
 Access Key: 123456789
 Secret Key: abcdfrghijklmnopqrstuvwxyz
    Warning: The secret key won't be displayed again. Save this key for future use.
```

#### 5-4. S3アクセス用のグループ作成とObject Storeへの権限設定

本記事の設定では、**SVM上に作成したBucketをS3クライアント側からは参照はできるが、作成や削除はできないように、デフォルトで用意されているreadOnlyAccessというPolicyを紐づけて利用**します。
```bash:
#Read OnlyのPolocy確認
*> vserver object-store-serve policy statement show -policy readOnlyAccess
Vserver   Policy       Index  Effect Actions          Resources
--------- ------------ ------ ------ ---------------- -----------------
s3_test
          readOnlyAccess    1 allow  GetObject,       *
                                     ListBucket,
                                     GetBucketAcl,
                                     GetObjectAcl,
                                     ListAllMyBuckets
                                     ,
                                     ListBucketMultip
                                     artUploads,
                                     ListMultipartUpl
                                     oadParts,
                                     GetObjectTagging
                                     ,
                                     GetBucketLocatio
                                     n,
                                     GetBucketVersion
                                     ing,
                                     ListBucketVersio
                                     ns,
                                     GetBucketPolicy,
                                     GetLifecycleConf
                                     iguration,
                                     GetObjectRetenti
                                     on,
                                     GetBucketObjectL
                                     ockConfiguration
   Sid: ReadOnlyPolicyStatementForPolicyReadOnlyAccess


＃ グループ作成時に作成したS3用のユーザとPolicyの紐づけ
*> vserver object-store-server group create -vserver s3_test -name group01 -users s3user -comment "" -policies ReadOnlyAccess
```

#### 5-5. Backetへ権限設定
BacketへのアクセスPolicyを設定します。
本記事の設定では、作成したBucketに対してファイルのUploadや一覧参照、削除ができるような設定を適用しています。

```bash:
*> object-store-server bucket policy statement create -bucket bk001 -effect allow -action GetObject,PutObject,DeleteObject,ListBucket -vserver s3_test -resource bk001,bk001/*
  (vserver object-store-server bucket policy statement create)


*> object-store-server bucket policy statement show
  (vserver object-store-server bucket policy statement show)
Vserver     Bucket     Index Effect Action       Principal       Resource
----------- ---------- ----- ------ ------------ --------------- --------------
s3_test
            bk001          1 allow  GetObject,   -               bk001, bk001/*
                                    PutObject,
                                    DeleteObject
                                    , ListBucket
```


### 6. LinuxからのAWS CLIを利用したONTAP S3へのアクセス確認

設定したONTAP S3のBucketに対してアクセス確認を実施します。
本記事では、LinuxにAWS CLIをInstallしてアクセス確認を実施します。

:::note warn
ここからの操作はLinux上における内容になります
:::

#### 6-1. AWS CLIのInstall
```bash:
# awscliのInstall
> pip3 install awscli
Collecting awscli
  Downloading awscli-1.24.10-py3-none-any.whl (3.9 MB)
     |████████████████████████████████| 3.9 MB 5.2 MB/s
Requirement already satisfied: PyYAML<5.5,>=3.10 in /usr/lib64/python3.6/site-packages (from awscli) (3.12)
Collecting s3transfer<0.6.0,>=0.5.0
  Downloading s3transfer-0.5.2-py3-none-any.whl (79 kB)
     |████████████████████████████████| 79 kB 18.2 MB/s
(中略)


# Versionの確認
> aws --version
aws-cli/1.24.10 Python/3.6.8 Linux/4.18.0-553.el8_10.x86_64 botocore/1.26.10
```

#### 6-2. AWS CLIにアクセスキー情報を設定
手順5-3でONTAP上にて実施した、S3アクセス用のユーザ作成時に表示されたAccess KeyとSecret Keyの入力を実施します。

Amazon S3およびONTAP S3の使い分けが必要な場合には、[AWS CLIを使ったAmazon S3とONTAP S3の操作](https://qiita.com/Yoshinori_Tsukioka/items/5981bcd317ec4bc570d1)を参照頂ければと思います。

```bash:
> aws configure
AWS Access Key ID [None]: 123456789
AWS Secret Access Key [None]: abcdfrghijklmnopqrstuvwxyz
Default region name [None]:
Default output format [None]:
```

#### 6-3. S3へフォルダ作成とFileのUpload
ONTAPに作成したBucketへのアクセスを実施します。
自己証明書を使ってHTTPSアクセスをできるようにしている為、**CERTIFICATE_VERIFY_FAILED エラーでアクセスできない事を回避する為、--no-verify-sslオプションをつけて操作を実施**します。(Warningは出るが、アクセスを試すことができる)

```bash:
# Bucket上にフォルダを作成
> aws --no-verify-ssl --endpoint-url  https://192.168.0.161/ s3api put-object --bucket bk001 --key "folder/"

/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py:1068: InsecureRequestWarning: Unverified HTTPS request is being made to host '192.168.0.161'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  InsecureRequestWarning,
  
{
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\""
}


# UploadするサンプルFileの作成
>  cat sample.txt
Tue Nov 12 05:41:07 EST 2024


# サンプルFileのUpload
>  aws --no-verify-ssl --endpoint-url  https://192.168.0.161/ s3 cp sample.txt s3://bk001/folder/
(Warning省略)

upload: ./sample.txt to s3://bk001/folder/sample.txt


# Bucket上のFile一覧の確認
>  aws --no-verify-ssl --endpoint-url  https://192.168.0.161/ s3 ls s3://bk001/folder/
(Warning省略) 

2024-11-12 02:14:45          0
2024-11-12 05:41:24         29 sample.txt
```

#### 6-4. Versioningを確認
ファイルを更新しUploadして、Versioningされているかの確認を実施します。

<img width="500" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/02c4b40f-bf60-9aeb-79c4-baa366d65514.png>


```bash:
# LinuxでFileの作成
>  date > verion-test.txt
>  cat verion-test.txt
Thu Nov 14 00:20:43 EST 2024

# 作成したFileのS3へのUpload
> aws --no-verify-ssl --endpoint-url  https://192.168.0.161/ s3 cp verion-test.txt s3://bk001/folder/
(Warning省略) 

upload: ./verion-test.txt to s3://bk001/folder/verion-test.txt

# Linux上のFileを更新
> date >>verion-test.txt
> cat verion-test.txt
Thu Nov 14 00:20:43 EST 2024
Thu Nov 14 00:21:52 EST 2024

# 更新したFileのS3へのUpload
> aws --no-verify-ssl --endpoint-url  https://192.168.0.161/ s3 cp verion-test.txt s3://bk001/folder/
(Warning省略) 

upload: ./verion-test.txt to s3://bk001/folder/verion-test.txt


# UploadされたFileのVersion確認
> aws --no-verify-ssl --endpoint-url  https://192.168.0.161/ s3api list-object-versions --bucket bk001 --prefix "folder/verion-test.txt"
(Warning省略) 

{
    "Versions": [
        {
            "ETag": "75a1dfd731954e86ee8d5a77a44888e1",
            "Size": 58,
            "StorageClass": "STANDARD",
            "Key": "folder/verion-test.txt",
            "VersionId": "OTc2MjM4MDAwLnYxLjIuMTczMTU2MTcyNS4u",
            "IsLatest": true,
            "LastModified": "2024-11-14T05:22:05.976Z"
        },
        {
            "ETag": "79dc7114110ade4fa21e9b76422cb1db",
            "Size": 29,
            "StorageClass": "STANDARD",
            "Key": "folder/verion-test.txt",
            "VersionId": "NjI2MjY3MDAwLnYxLjIuMTczMTU2MTY3Ny4u",
            "IsLatest": false,
            "LastModified": "2024-11-14T05:21:17.626Z"
        }
    ]
}
```


## 参考及びリンク
[S3の設定ワークフロー](https://docs.netapp.com/ja-jp/ontap/s3-config/workflow-concept.html)

[S3 in ONTAP best practices](https://www.netapp.com/media/17219-tr4814.pdf)

[Unable to access ONTAP S3 server using HTTPS via s3 browser](https://kb.netapp.com/on-prem/ontap/da/S3/S3-KBs/Unable_to_access_ONTAP_S3_server_using_HTTPS_via_s3_browser)

[Cannot delete ONTAP S3 bucket "because it is not empty"](https://kb.netapp.com/on-prem/ontap/da/S3/S3-KBs/Cannot_delete_ONTAP_S3_bucket_because_it_is_not_empty)