Alibaba Cloud OSSの紹介① ~OSSの概要と機能について~

アリババクラウドのパートナーのAPコミュニケーションズ様より、アリババクラウドについて第二弾のレポートをいただきましたので共有させていただきます。本編は[こちら](https://techblog.ap-com.co.jp/entry/2020/06/16/123020)のサイトでご覧ください。
今回はOSSについてとなります。

[＜ techblogAPCについて（はじめにお読み下さい） ＞](https://techblog.ap-com.co.jp/info)

#はじめに
こんにちは、IaC技術推進部の山路です。本記事では、Alibaba Cloudの提供するOSS（Object Storage Service）の機能紹介、およびOSSと合わせて利用できるツールの利用方法について紹介いたします。各機能・ツールの詳細にまでは触れませんが、それぞれの概要と利用方法、オブジェクトストレージサービスとして代表的なAW S3との比較を行い、OSSの全体像について把握することを目的に、本記事を書きました。

本記事ではまずOSSの機能についての概要を紹介し、次回の記事でOSSの周辺ツールについてご紹介したいと思います。

#OSSとは
OSSはAlibaba Cloudの提供するオブジェクトストレージサービスです。クラウドプロバイダーの提供するオブジェクトストレージサービスとして有名なものには、AWS S3 / Azure blob / GCP Cloud Storageなどがありますが、OSSもそれらと同様の機能を提供します。OSSはバケット/オブジェクトという概念で利用されており、バケットごとにエンドポイントを通じてオブジェクトを利用することができます。主な特徴は以下の通りです。

- 信頼性: 99.999999999％の耐久性と99.99%のサービス可用性を保証。またゾーン冗長ストレージ、リージョン跨ぎのレプリケーション作成をサポートします。
- ストレージクラス: OSSには標準・低頻度アクセス・アーカイブの3つのクラスが存在し、オブジェクトストレージの利用方法法に応じて選択できます。
- セキュリティ: バケットごとのACL、RAM（Resurce Access Management）毎のアクセスポリシーの設定によるセキュリティの向上。
- コスト: アップストリームトラフィックは無料。
OSSには一部利用制限もあるため、主なものは以下に記載をいたします。

- バケット数: 各リージョンに作成できるバケット数は30まで。
- アップロード: Webコンソールや簡易ツールによるオブジェクトアップロードは5GBまで対応。5GBを超える場合は[OSSUtil](https://github.com/aliyun/ossutil)や各プログラム言語のSDKを利用（最大48.8TB）。
- ドメインのバインド: OSSのバケットにドメインを紐づけ、中国本土リージョンにある公開サーバーに Web サイトをリンクさせる場合は、 [ICP ライセンス](https://jp.alibabacloud.com/solutions/icp)を申請する必要がある
※参考リンク：

- [Alibaba Cloud - OSS：制限](https://jp.alibabacloud.com/help/doc-detail/54464.htm?spm=a21mg.p38356.b99.6.138371acHrjaGR)

#OSSの利用方法
###ブラウザ
Alibaba CloudのサービスであるOSSは、Alibaba CloudのWebコンソールから利用することが可能です。なお、本記事ではWebコンソール上の言語は英語を指定していますが、日本語の利用も可能です。

まずはログイン後の画面からOSSを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d7fc653f-1eec-de50-faab-f2048af6ddaa.png)

バケットを作成する場合は、まず「Create Bucket」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/670a22d3-cbfe-9b09-13c5-0fcdaa216dda.png)

バケット作成画面が表示されるので、バケット名やリージョンなどを指定します。Storage Classには以下の3種類が存在します。

- `標準（Standard）`：頻繁なデータへのアクセスをサポート。3種類の中では最もコストが高い。
- `低頻度アクセス（IA、Infrequent Access）`：長期間（1か月以上）保存する必要があり、アクセスは月に1～2回程度のデータ保存に適している。
- `アーカイブ（Archive）`：長期間（半年以上）保存し、めったにアクセスをしないデータに適する。3種類のクラスで最もコストが低い。

※参考リンク：

- [Alibaba CLoud - ストレージクラスの概要](https://jp.alibabacloud.com/help/doc-detail/51374.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/20f6a349-085d-050d-0a45-b9e39d66a617.png)
バケットごとのアクセスできる範囲を指定するAccess Control List（ACL）は、バケット作成後も変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5a00f35a-9589-7c24-7d71-c05abd8edf8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f7df9556-eecb-6ba3-f9fa-36e3dd11b778.png)

なお、選択したリージョンによっては、選択できないサービスも存在します。例えば本記事執筆時点では、中国リージョンを選択した場合、以下のように`Zone-Redundant Storage` `Versioning`が利用できますが、日本リージョンでは表示されません。また中国リージョンを利用する場合は[いくつか注意しなければならない項目もある](https://techblog.ap-com.co.jp/entry/2020/06/08/165652)ため、今回は日本リージョンを選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/704b0384-fbb2-63cc-ad65-be9d010407b6.png)

作成が完了した場合、バケット画面に遷移します。これでオブジェクトを格納することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c0a1ae45-da5c-7f9a-05d5-fd0ce4d7c909.png)

「File」を選択し、オブジェクトの一覧を表示するページに遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/43e4bea9-2df1-6601-8932-74a626bfc576.png)

Web管理画面からファイルをアップロードする場合、「Upload」を選択すれば、以下のような画面が表示され、ファイル名の指定・ドラッグ＆ドロップなどで指定のファイルをアップロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/52c382e7-0948-f8d4-37f0-85d251297e47.png)

アップロードが完了した場合、Statusが`Uploaded`となります。これでファイルのアップロードが完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8cfcf51d-15da-920a-fa53-93a7c18aa4d6.png)

アップロードしたオブジェクトは、アップロード完了後もタグ付けやACLの設定を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a50d0503-b844-fae3-594a-24dc5bfaed27.png)

#aliyunコマンド
Alibaba Cloudでは`aliyun`CLIを通じて各種リソースの操作を行うことができます。OSSを操作する場合は`aliyun oss`コマンドを利用します。

ここではAlibaba CloudのECSでaliyunコマンドを利用し、OSSを操作します。

```
# aliyun cli インストール
[root@test01 ~]# wget https://aliyuncli.alicdn.com/aliyun-cli-linux-3.0.45-amd64.tgz
[root@test01 ~]# tar -xzvf aliyun-cli-linux-3.0.45-amd64.tgz
[root@test01 ~]# mv aliyun /usr/local/bin


# バージョン確認
[root@test01 ~]# aliyun version
3.0.45


# aliyun oss コマンド
[root@test01 ~]# aliyun oss --help
Object Storage Service

Usage:
  aliyun oss [command] [args...] [options...]

Commands:
  getallpartsize    Get bucket all uncompleted multipart objects's parts size and sum size
  appendfromfile    Upload the contents of the local file to the oss appendable object by append upload mode
  cors              Set, get or delete the cors configuration of the oss bucket
  bucket-encryption Set, get or delete bucket encryption configuration
  lifecycle         Set, get or delete bucket lifecycle configuration
  logging           Set、get or delete bucket log configuration
  bucket-policy     Set, get or delete bucket policy configuration
  bucket-qos        Set, get or delete bucket qos configuration
  referer           Set、get or delete bucket referer configuration
  bucket-tagging    Set, get or delete bucket tag configuration
  bucket-versioning Set, get bucket versioning configuration
  website           Set, get or delete bucket website configuration
  cat               Output object content to standard output
  cors-options      Send http options request to oss for CORS detection
  cp                Upload, Download or Copy Objects
  create-symlink    Create symlink of object
  du                Get the bucket or the specified prefix(directory) storage size
  hash              Get crc64 or md5 of local file
  help              Get help about commands
  listpart          List parts information of uncompleted multipart object
  ls                List Buckets or Objects
  mb                Make Bucket
  mkdir             Create a oss directory whose object name has the suffix character '/'
  object-tagging    Set, get or delete object tag configuration
  probe             Probe command, support for multiple function detection
  read-symlink      Display meta information of symlink object
  request-payment   Set, get bucket request payment configuration
  restore           Restore Frozen State Object to Read Ready Status
  rm                Remove Bucket or Objects
  set-acl           Set acl on bucket or objects
  set-meta          set metadata on already uploaded objects
  sign              Generate download link for object
  stat              Display meta information of bucket or objects
  user-qos          Get user's qos configuration

Use `oss --help` for more information.



# Alibaba Cloud接続情報の登録（aliyun configure）
[root@test01 ~]# aliyun configure
Configuring profile 'default' in 'AK' authenticate mode...
Access Key Id []: <AccessKeyId>    # Alibaba Cloud AccessKeyId情報を指定
Access Key Secret []: <AccessKeySecret>    # Alibaba Cloud AccessKeySecret情報を指定
Default Region Id []: ap-northeast-1    # ここでは日本を選択
Default Output Format [json]: json (Only support json)    # 特に指定せずEnterキーを実行
Default Language [zh|en] en:    # 特に指定せずEnterキーを実行
Saving profile[default] ...Done.

Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............


# バケットの作成
[root@test01 ~]# aliyun oss mb oss://testbucket20200601

0.993953(s) elapsed


# 作成後のバケットの確認
[root@test01 ~]# aliyun oss ls
CreationTime                                 Region    StorageClass    BucketName
2020-06-01 15:37:30 +0800 CST    oss-ap-northeast-1        Standard    oss://testbucket20200601
Bucket Number is: 1

0.337527(s) elapsed


# テスト用ファイルの生成
[root@test01 ~]# dd if=/dev/zero of=testfile_ecs_local_20200528 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.05775 s, 351 MB/s


# バケットへのアップロード
[root@test01 ~]# aliyun oss cp testfile_ecs_local_20200528 oss://testbucket20200601
Succeed: Total num: 1, size: 1,073,741,824. OK num: 1(upload 1 files).

1581.623815(s) elapsed
[root@test01 ~]#


# アップロード後のバケット確認
[root@test01 ~]# aliyun oss ls oss://testbucket20200601
LastModifiedTime                   Size(B)  StorageClass   ETAG                                  ObjectName
2020-06-01 16:07:09 +0800 CST   1073741824      Standard   679D3C338EF35FADDBA432CA3E2717C3-400  oss://testbucket20200601/testfile_ecs_local_20200528
Object Number is: 1

0.048180(s) elapsed
[root@test01 ~]#
```
#OSS SDK
OSSでは各プログラミング言語用のSDKを提供しています。本記事を書いている時点では、以下の言語で利用可能です。

| 言語 | バージョン |
|:--|:--|
| Java | ver 1.6 以降 |
| Python | 2.6,2.7,3.3,3.4,3.5 |
| Android | - |
| iOS | ver 8.0以降 |
| .Net | .NET Framework 2.0 以降 |
| Node.js | ver 6以降 |
| Browser.js | - |
| PHP | - |
| C | - |
| Ruby | ver 1.9.3以降 |
| Go | ver 1.6以降 |
| Media-C | - |



※参考リンク：

- [Alibaba Cloud - SDKリファレンス](https://jp.alibabacloud.com/help/doc-detail/52834.htm?spm=a21mg.p38356.b99.137.48516e45PJAtuz)
今回はGo言語を利用し、テストファイルをアップロードする例を下に載せます。

```
package main
import (
    "fmt"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main(){
    client, err := oss.New("<Endpoint>", "<AccessKeyId>", "<AccessKeySecret>")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    bucket, err := client.Bucket("<Bucket名を指定>")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    err = bucket.PutObjectFromFile("<格納後のObject名を指定>", "<ローカルファイル名>")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
}
```

今回は以下のような値を指定しました。

- `Endpoint`: [http://oss-ap-northeast-1.aliyuncs.com](http://oss-ap-northeast-1.aliyuncs.com/)
- `Bucket名`: testbucket20200601
- `格納後のObject名`: testfile_20200526.txt
- `ローカルファイル名`: testfile.txt

```
# 実行
[root@test01 ~]# go get github.com/aliyun/aliyun-oss-go-sdk/oss
[root@test01 ~]# go run osstest.go

# 実行後の確認

[root@test01 ~]# aliyun oss ls oss://testbucket20200601
LastModifiedTime                   Size(B)  StorageClass   ETAG                                  ObjectName
2020-06-01 16:42:23 +0800 CST   1073741824      Standard   CD573CFAACE07E7949BC0C46028904FF      oss://testbucket20200601/testfile_20200526.txt
2020-06-01 16:07:09 +0800 CST   1073741824      Standard   679D3C338EF35FADDBA432CA3E2717C3-400  oss://testbucket20200601/testfile_ecs_local_20200528
Object Number is: 2

0.048055(s) elapsed

```

#OSSの機能
OSSには単にオブジェクトを格納するだけでなく、それに関する様々な機能が備わっています。ここではその一部について紹介します。

##OSS Transfer Acceleration
###概要
OSSはデフォルトではインターネット経由、またはVPC内部からアクセスする用のエンドポイントを提供します。インターネット経由の場合、通信の状態によってはオブジェクトのアップロード・ダウンロードが遅延し、場合によっては処理が失敗することもあります。Transfer Accelerationを有効にすることで、高速通信用のエンドポイントが提供され、それを利用することで、インターネット経由で高速のファイルアップロード・ダウンロードが可能になります。

###利用方法
Transfer Accelerationを有効にするには、Alibaba CloudのWebコンソール画面から操作する必要があります。以下の画面キャプチャのように、Transfer Accelerationの有効化ボタンをクリックすることで、この機能を利用できます。ただし有効化してから機能を利用できるまでは30分程度は時間が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e04949e3-fed5-6475-6130-0df446de2b37.png)

「Enable」ボタンを選択すると、以下のようにTransfer Accelerationの説明と注意書きが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f6e6554e-5452-42eb-b03b-f85cb42e1754.png)

表示画面下部の「Transfer Acceleration」をクリックし、有効にしたうえで「Save」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4eb7f848-7112-0f38-1b3b-810e47c530e6.png)

Transfer Accelerationのエンドポイントが表示され、利用可能になっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7303d080-926f-847d-102e-f237de2aefd1.png)

Transfer Accelerationを有効化することで、Webコンソール画面から以下のようにTransfer Accelerationの設定画面へアクセスすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a81f2539-4fa0-fe65-bcf4-1216dfa021dc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/157aa4bd-aecd-1413-9244-95cac4576b20.png)

設定画面では、Transfer Accelerationを有効化・無効化を変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5668d78c-3f5d-18bf-bd7f-599c8f9b6fe1.png)

上記のようにTransfer Accelerationを有効にした後は、提供されたエンドポイントを指定してアクセスすることで利用することができます。例えば前述のGolang SDKを利用する場合、指定するEndpointを変更するだけで利用可能です。

```
# 一部のみ記載

func main(){
    # Endpointを変更
    client, err := oss.New("http://oss-accelerate.aliyuncs.com", "<AccessKeyId>", "<AccessKeySecret>")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
```

Transfer Accelerationを利用することでどの程度速度が向上するかは、以下のリンク先でリージョン別の情報を確認することができます。

※参考リンク：

- [The Comparison of OSS Direct Data Transfer and Accelerated data Transfer in Different Regions](https://oss-accelerate-test.oss-accelerate.aliyuncs.com/acc/oss-transfer-acc-en.html)

###Cross-Origin Resource Sharing (CORS)
OSSにはCross-Origin Resource Sharing (CORS)を利用することができます。CORSは、あるWebアプリケーションから別のオリジンにあるリソースへのアクセス権限を付与する機能です。

※参考リンク：

- [Qiita - なんとなく CORS がわかる...はもう終わりにする。](https://qiita.com/att55/items/2154a8aad8bf1409db2b)
CORSは以下のようにWebコンソールから設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6538b5ca-64b4-aa15-97b6-dc4a2dec88d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a72620a0-3407-2256-5dad-164969b1f8ab.png)

CORSのルールを作成する際は、`Source` `AllowedMethods`は必須項目となり、ここで許可する送信元とメソッドを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9575999c-8a9f-6371-c0ff-c7a1b2b04128.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d0e50619-64d7-95ed-02d8-55c45ee1ae08.png)

また、先ほどの`aliyun oss`コマンドや、次回紹介する`ossutil`コマンドでもCORSの設定を行うことができます。

```
# aliyun oss corsコマンド
[root@test01 ~]# aliyun oss cors --help
Set, get or delete the cors configuration of the oss bucket

Usage:
  aliyun oss
    ossutil cors --method put oss://bucket  local_xml_file
    ossutil cors --method get oss://bucket  [local_xml_file]
    ossuitl cors --method delete oss://bucket


Flags:
  --mode              use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p        use `--profile <profileName>` to select profile
  --language          use `--language [en|zh]` to assign language
  --region            use `--region <regionId>` to assign region
  --config-path       use `--config-path` to specify the configuration file path
  --access-key-id     use `--access-key-id <AccessKeyId>` to assign AccessKeyId, required in AK/StsToken/RamRoleArn mode
  --access-key-secret use `--access-key-secret <AccessKeySecret>` to assign AccessKeySecret
  --sts-token         use `--sts-token <StsToken>` to assign StsToken
  --ram-role-name     use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --ram-role-arn      use `--ram-role-arn <RamRoleArn>` to assign RamRoleArn
  --role-session-name use `--role-session-name <RoleSessionName>` to assign RoleSessionName
  --private-key       use `--private-key <PrivateKey>` to assign RSA PrivateKey
  --key-pair-name     use `--key-pair-name <KeyPairName>` to assign KeyPairName
  --read-timeout      use `--read-timeout <seconds>` to set I/O timeout(seconds)
  --connect-timeout   use `--connect-timeout <seconds>` to set connect timeout(seconds)
  --retry-count       use `--retry-count <count>` to set retry count
  --expired-seconds   use `--expired-seconds <seconds>` to specify expiration time
  --config-file,-c    Path of ossutil configuration file, where to dump config in config command, or to load config in other commands that need credentials.
  --endpoint,-e       Base endpoint for oss endpoint(Notice that the value of the option will cover the value in config file). Take notice that it should be second-level domain(SLD).
  --proxy-host        url of network proxy server, which supports http/https/socks5, such as https://120.79.128.211:3128, socks5://120.79.128.211:1080
  --proxy-user        username of network proxy, default is empty
  --proxy-pwd         password of network proxy, default is empty
  --method            specifies the http method,value is PUT、GET、DELETE...
  --loglevel          log level,default is empty(no log file output),optional value is:info|debug,info will output information logs,debug will output detail logs(including http request and response logs)
  --mode              use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p        use `--profile <profileName>` to select profile
  --config-path       use `--config-path` to specify the configuration file path
  --ram-role-name     use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --help              print help

Use `cors --help` for more information.
[root@test01 ~]#


# CORS設定用XMLファイルの用意
[root@test01 ~]# cat cors.xml
<?xml version="1.0" encoding="UTF-8"?>
  <CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>www.aliyun.com</AllowedOrigin>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>10000</MaxAgeSeconds>
    </CORSRule>
</CORSConfiguration>


# CORSの設定
[root@test01 ~]# aliyun oss cors --method put oss://testbucket20200601 cors.xml

0.013443(s) elapsed


# 設定後確認
[root@test01 ~]# aliyun oss cors --method get oss://testbucket20200601
<?xml version="1.0" encoding="UTF-8"?>
  <CORSConfiguration>
      <CORSRule>
          <AllowedOrigin>www.aliyun.com</AllowedOrigin>
          <AllowedMethod>PUT</AllowedMethod>
          <MaxAgeSeconds>10000</MaxAgeSeconds>
      </CORSRule>
  </CORSConfiguration>


0.011996(s) elapsed
```
CORSルールの設定で用いるXMLファイルの記述例は[こちら](https://github.com/aliyun/aliyun-cli/blob/master/oss/lib/bucket_cors.go)のページなどに記載されています。


投入後は以下のようにWebコンソールからも確認できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/dd39c6ff-e3f7-fe99-1b2c-7b18b03bf382.png)

以降はCORSルールの削除手順になります。

```
# 設定削除
[root@test01 ~]# aliyun oss cors --method delete oss://testbucket20200601

0.016953(s) elapsed


# 削除後の確認
[root@test01 ~]# aliyun oss cors --method get oss://testbucket20200601
error:oss: service returned error: StatusCode=404, ErrorCode=NoSuchCORSConfiguration, ErrorMessage="The CORS Configuration does not exist.", RequestId=5EDEE068CA03DC3433251D79
ERROR: oss: service returned error: StatusCode=404, ErrorCode=NoSuchCORSConfiguration, ErrorMessage="The CORS Configuration does not exist.", RequestId=5EDEE068CA03DC3433251D79
```

※参考サイト：

- [Alibaba Cloud - cors](https://jp.alibabacloud.com/help/doc-detail/120063.htm?spm=a21mg.p38356.b99.90.2a0748f6ATmhRA)

- [GitHub - aliyun/aliyun-cli: bucket-cors.go](https://github.com/aliyun/aliyun-cli/blob/master/oss/lib/bucket_cors.go)

#静的Webサイトホスティング
OSSはバケットにhtmlファイルを格納・設定することで、静的Webサイトのページとして利用することができます。OSSでは、デフォルトページ・エラーページを設定することができます。

静的Webサイトを用意する際、まずはデフォルトページ・エラーページ用のhtmlファイルを用意します。今回はテスト用の以下の2つのhtmlファイルを利用します。

`index.html`

```
<html>
  <head>
      <title>Hello OSS! </title>
      <meta charset="utf-8">
  </head>
  <body>
      <p>Welcome to OSS Static Website Hosting.</p>
      <p>This is the homepage.</p>
  </body>
</html>
```

`error.html`

```
<html>
  <head>
      <title>Hello OSS! </title>
      <meta charset="utf-8">
  </head>
  <body>
      <p>This is an error homepage for OSS Static Website Hosting.</p>
  </body>
</html>
```

上記2つのファイルを作成しOSSにアップロードしたのち、Webコンソールから設定を行います。設定は「Basic Settings」→「Static Pages」にて各ファイル名を入力することで完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/bf540670-d9cd-fde2-854f-6ac2bcd62368.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9949075a-13d0-68a4-5639-ff3ac4f93bbf.png)

「Static Pages」では、デフォルトページとエラーページをhtmlファイル名を指定して設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5a0833ed-3585-d7bc-9a77-ff3f7d05de4b.png)

htmlファイルの設定後、ACLを変更し、OSSバケットへのアクセス権を変更して、Webブラウザからアクセスできるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/87043de5-4248-2362-885e-ce6f58d17c13.png)

ここでは`Public Read`を指定することで、外部からのReadアクセスを許可し、Webサイトにアクセスできるようになります。また、アクセス元を制限する機能もOSSは備えており、それについては後述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/44061460-f374-4e9a-d2f1-b866e474072f.png)

`Public Read`選択時に以下のようなメッセージが表示されるので、「Configure」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a220ba09-d336-b68e-32b4-a9cfb83ba5f1.png)

設定後は以下のように`Public Read`と表示されます。セキュリティの問題となる可能性がある設定のため、文字の色が変化しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/dc280416-f347-28d0-a076-b61c8c87f08b.png)

これでバケットにアクセスすることが可能となりました。WebブラウザからURLを入力すると、以下のようにデフォルトのページが表示されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/30bd74bc-a710-f451-f49e-18fa98c04b65.png)

またエラーページも以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5f2aaa66-9671-a0c9-f245-59bbb06d5218.png)

静的Webサイトの設定は`aliyun oss website`コマンドからも可能です。

```
# aliyun oss websiteコマンド
[root@test01 ~]# aliyun oss website --help
Set, get or delete bucket website configuration

Usage:
  aliyun oss
        ossutil website --method put oss://bucket local_xml_file [options]
    ossutil website --method get oss://bucket [local_xml_file] [options]
    ossuitl website --method delete oss://bucket [options]


Flags:
  --mode              use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p        use `--profile <profileName>` to select profile
  --language          use `--language [en|zh]` to assign language
  --region            use `--region <regionId>` to assign region
  --config-path       use `--config-path` to specify the configuration file path
  --access-key-id     use `--access-key-id <AccessKeyId>` to assign AccessKeyId, required in AK/StsToken/RamRoleArn mode
  --access-key-secret use `--access-key-secret <AccessKeySecret>` to assign AccessKeySecret
  --sts-token         use `--sts-token <StsToken>` to assign StsToken
  --ram-role-name     use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --ram-role-arn      use `--ram-role-arn <RamRoleArn>` to assign RamRoleArn
  --role-session-name use `--role-session-name <RoleSessionName>` to assign RoleSessionName
  --private-key       use `--private-key <PrivateKey>` to assign RSA PrivateKey
  --key-pair-name     use `--key-pair-name <KeyPairName>` to assign KeyPairName
  --read-timeout      use `--read-timeout <seconds>` to set I/O timeout(seconds)
  --connect-timeout   use `--connect-timeout <seconds>` to set connect timeout(seconds)
  --retry-count       use `--retry-count <count>` to set retry count
  --expired-seconds   use `--expired-seconds <seconds>` to specify expiration time
  --config-file,-c    Path of ossutil configuration file, where to dump config in config command, or to load config in other commands that need credentials.
  --endpoint,-e       Base endpoint for oss endpoint(Notice that the value of the option will cover the value in config file). Take notice that it should be second-level domain(SLD).
  --proxy-host        url of network proxy server, which supports http/https/socks5, such as https://120.79.128.211:3128, socks5://120.79.128.211:1080
  --proxy-user        username of network proxy, default is empty
  --proxy-pwd         password of network proxy, default is empty
  --loglevel          log level,default is empty(no log file output),optional value is:info|debug,info will output information logs,debug will output detail logs(including http request and response logs)
  --method            specifies the http method,value is PUT、GET、DELETE...
  --mode              use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p        use `--profile <profileName>` to select profile
  --config-path       use `--config-path` to specify the configuration file path
  --ram-role-name     use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --help              print help

Use `website --help` for more information.
[root@test01 ~]#


# Website設定用XMLファイルの用意
[root@test01 ~]# cat index.xml
<?xml version="1.0" encoding="UTF-8"?>
<WebsiteConfiguration>
    <IndexDocument>
        <Suffix>index.html</Suffix>
    </IndexDocument>
    <ErrorDocument>
        <Key>error.html</Key>
    </ErrorDocument>
</WebsiteConfiguration>


# 設定の反映
[root@test01 ~]# aliyun oss website --method put oss://testbucket20200601 index.xml

0.060839(s) elapsed


# 設定の確認
[root@test01 ~]# aliyun oss website --method get oss://testbucket20200601
<?xml version="1.0" encoding="UTF-8"?>
  <WebsiteConfiguration>
      <IndexDocument>
          <Suffix>index.html</Suffix>
      </IndexDocument>
      <ErrorDocument>
          <Key>error.html</Key>
      </ErrorDocument>
      <RoutingRules></RoutingRules>
  </WebsiteConfiguration>


0.013237(s) elapsed
```

※参考リンク：

- [Alibaba Cloud - 静的 Web サイトホスティング](https://jp.alibabacloud.com/help/doc-detail/31939.html)

- [Alibaba Cloud - 静的 Web サイトホスティングの設定](https://jp.alibabacloud.com/help/doc-detail/31872.htm?spm=a21mg.p38356.b99.65.11b618dfhufG78)

- [GitHub - aliyun/aliyun-cli: bucket-website.go](https://github.com/aliyun/aliyun-cli/blob/master/oss/lib/bucket_website.go)

####ライフサイクル管理
OSSではライフサイクル管理により、バケット内のオブジェクトを定期的に削除・移行することが可能になります。

例えばミーティングの議事録などを`text/text_20200603.txt`という形式でバケットに格納しており、一定時間経過したファイルは別のアーカイブ用のバケットに移動したい場合、text/に格納されているオブジェクトを対象に、30日以上経過したものはアーカイブ用のバケットへ移す、といった使い方も可能です。

ライフサイクルはWebコンソールから各ルールを設定することが可能です。

まずは「Basic Settings」→「Lifecycle」へと移動し、ライフサイクルのルールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ecacfdf1-02f9-33b4-9cb3-412d6cb6a071.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/792fc607-225d-bd05-4361-c83879a5fbac.png)


`Basic Settings`では、ライフサイクルのルールを適用するオブジェクトを指定します。`Clear Policy`では対象のオブジェクトに対する処理を選択し、別のバケットに移動する、あるいは削除を選択することができます。また`Delete Parts`は大容量ファイルをアップロードする際に利用するマルチパートアップロードイベントに対するライフサイクルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/28e40528-d58e-67c1-220c-725fc53b3a82.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/fb741022-a2ec-07c1-f61b-1402869d19a8.png)

ライフサイクル管理は`aliyun oss lifecycle`コマンドから設定することも可能です。

```
# aliyun oss lifecycleコマンド
[root@test01 ~]# aliyun oss lifecycle --help
Set, get or delete bucket lifecycle configuration

Usage:
  aliyun oss
        ossutil lifecycle --method put oss://bucket local_xml_file [options]
    ossutil lifecycle --method get oss://bucket [local_xml_file] [options]
    ossuitl lifecycle --method delete oss://bucket [options]


Flags:
  --mode              use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p        use `--profile <profileName>` to select profile
  --language          use `--language [en|zh]` to assign language
  --region            use `--region <regionId>` to assign region
  --config-path       use `--config-path` to specify the configuration file path
  --access-key-id     use `--access-key-id <AccessKeyId>` to assign AccessKeyId, required in AK/StsToken/RamRoleArn mode
  --access-key-secret use `--access-key-secret <AccessKeySecret>` to assign AccessKeySecret
  --sts-token         use `--sts-token <StsToken>` to assign StsToken
  --ram-role-name     use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --ram-role-arn      use `--ram-role-arn <RamRoleArn>` to assign RamRoleArn
  --role-session-name use `--role-session-name <RoleSessionName>` to assign RoleSessionName
  --private-key       use `--private-key <PrivateKey>` to assign RSA PrivateKey
  --key-pair-name     use `--key-pair-name <KeyPairName>` to assign KeyPairName
  --read-timeout      use `--read-timeout <seconds>` to set I/O timeout(seconds)
  --connect-timeout   use `--connect-timeout <seconds>` to set connect timeout(seconds)
  --retry-count       use `--retry-count <count>` to set retry count
  --expired-seconds   use `--expired-seconds <seconds>` to specify expiration time
  --config-file,-c    Path of ossutil configuration file, where to dump config in config command, or to load config in other commands that need credentials.
  --endpoint,-e       Base endpoint for oss endpoint(Notice that the value of the option will cover the value in config file). Take notice that it should be second-level domain(SLD).
  --proxy-host        url of network proxy server, which supports http/https/socks5, such as https://120.79.128.211:3128, socks5://120.79.128.211:1080
  --proxy-user        username of network proxy, default is empty
  --proxy-pwd         password of network proxy, default is empty
  --loglevel          log level,default is empty(no log file output),optional value is:info|debug,info will output information logs,debug will output detail logs(including http request and response logs)
  --method            specifies the http method,value is PUT、GET、DELETE...
  --mode              use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p        use `--profile <profileName>` to select profile
  --config-path       use `--config-path` to specify the configuration file path
  --ram-role-name     use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --help              print help

Use `lifecycle --help` for more information.


# ライフサイクル設定用XMLファイル
# ここでは"testbucket/"を対象に、最終更新から100日経過したファイルを削除するルールを有効化します
[root@test01 ~]#  cat lifecycle.xml
<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
  <Rule>
    <ID>10</ID>
    <Prefix>testbucket/</Prefix>
    <Status>Enabled</Status>
    <Expiration>
      <Days>100</Days>
    </Expiration>
  </Rule>
</LifecycleConfiguration>


# ライフサイクル設定
[root@test01 ~]# aliyun oss lifecycle --method put oss://testbucket20200601 lifecycle.xml

0.019208(s) elapsed


# 設定後の確認
[root@test01 ~]# aliyun oss lifecycle --method get oss://testbucket20200601
<?xml version="1.0" encoding="UTF-8"?>
  <LifecycleConfiguration>
      <Rule>
          <ID>10</ID>
          <Prefix>testbucket/</Prefix>
          <Status>Enabled</Status>
          <Expiration>
              <Days>100</Days>
          </Expiration>
      </Rule>
  </LifecycleConfiguration>


0.013668(s) elapsed
```
設定後のWebコンソールからの確認画面は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4b54e82a-d01c-9fad-3b52-a50b6fd60902.png)

最後にライフサイクルのルールを削除します。

```
# 設定削除
[root@test01 ~]# aliyun oss lifecycle --method delete oss://testbucket20200601

0.019524(s) elapsed



# 削除後の確認
[root@test01 ~]# aliyun oss lifecycle --method get oss://testbucket20200601
ERROR: oss: service returned error: StatusCode=404, ErrorCode=NoSuchLifecycle, ErrorMessage="No Row found in Lifecycle Table.", RequestId=5EDEE8B07188443332107F7C
```

※参考リンク：

- [Alibaba Cloud - ライフサイクル管理](https://jp.alibabacloud.com/help/doc-detail/31863.htm?spm=a21mg.p38356.b99.60.71b056c3blskOt)

- [GitHub - aliyun/aliyun-cli: bucket-lifecycle.go](https://github.com/aliyun/aliyun-cli/blob/master/oss/lib/bucket_lifecycle.go)

#その他
###Cross-region replication
OSSはCross-region replicationにより、あるリージョンのバケットを別リージョンのバケットと同期し、非同期でバケットのオブジェクトデータの複製ができます。これによってリージョン規模の災害に備えたDRの構築ができます。

Cross-region replicationは、Webコンソール、またはJava SDKから操作が可能です。Webコンソールでは、送信先となるリージョンとバケットを指定し、オブジェクトの同期のルールを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d101237d-41c3-d6e6-76c4-a2619b20beeb.png)

例えば`Operations`では`Add/Change` `Add/Delete/Change`から選択し、どのオペレーションをリモートのバケットに反映させるかを指定します。`Add/Change`を選択した場合、オブジェクトを削除してもレプリケーション先にはその操作が反映されません。

また`Replicate Historical Data`を有効にした場合、同期前にすでにソースバケットに保存されているデータも複製します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ab957730-62c6-6c9a-8e58-d1e0f5a5b76c.png)

※参考リンク：

- [Alibaba Cloud - Cross-region replication](https://www.alibabacloud.com/help/ja/doc-detail/31864.htm)


###versioning
OSSはバケット単位でバージョン管理機能が提供されています。これによって、同一名称のオブジェクトをバケットにアップロードした際に、既存のオブジェクトが上書きされるのでなく、同盟オブジェクトが別バージョンとして保存されるようになります。

なお、本記事の執筆時点では、バージョン管理機能は日本リージョンでは提供されていないため、ここではUS（シリコンバレー）を選択した例を載せています。

バケットを一から作成する場合、Webコンソールから有効にすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d5dc4fd5-31b0-ff18-04b3-8e07c5ddeb33.png)

既存のバケットでは、「Redundancy for Fault Tolerance」から有効にすることができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e2a7a53b-816c-0e3d-411d-0ff2a9e9a3a0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/aed01e34-f4ea-4000-de36-ec01c0ff8e51.png)

Versioningを有効化し、Saveをすることで設定が保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c22a1fd6-18ac-d1e6-bcb9-4435723b386a.png)


※参考リンク：

- [Alibaba Cloud - Versioning Overview](https://www.alibabacloud.com/help/ja/doc-detail/109695.htm)

- [SB Cloud - Alibaba Cloud オブジェクトストレージサービス（OSS）にバージョン管理機能が増えました!](https://www.sbcloud.co.jp/entry/2019/12/07/oss-versioning)

- [GitHub - aliyun/aliyun-cli: bucket-versioning.go](https://github.com/aliyun/aliyun-cli/blob/master/oss/lib/bucket_versioning.go)

###Retention policy
OSSではオブジェクトの削除や上書きがされないようWrite Once Read Many (WORM)を適用することができます。WORMを適用するにはRetention Policyという機能を利用します。

Retention Policyはオブジェクトを保護する期間を設定し、期間内にはバケット内のオブジェクトの上書き・削除ができなくなります。この機能は、ある特定の期間内は対象のデータを保持し続けなければならない場合に利用され、特に金融、保険、医療、証券などの業界に適した機能であると説明されています。

Retention Policyの設定はWebコンソールから行います。設定はバケット単位でポリシーは一つまで設定可能です。一度ポリシーを設定・有効化すると、そのポリシーを削除することができず、また設定した期間を短縮することもできません。またバージョン管理機能と合わせて利用することはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/66165df6-4878-0b1c-1d03-ce696df90375.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1a9ee07e-6f84-962a-6549-2930eb6435d8.png)

設定は「Retention Period」のみとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a46a00e4-6106-4ac9-5df8-84828023560b.png)

ポリシー作成後、該当のポリシーの「Lock」ボタンからそのポリシーを有効にすることでRetention Policyが適用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/98b2899c-a440-4567-fb81-2d75dc66666a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/18d47975-ee92-d1ba-0a5f-233ee984b9bf.png)

ポリシーを有効にすると、Statusが`LOCKED`に変更されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/cce46b0a-066d-6ffa-d7d7-e35e77668fbc.png)

※参考リンク：

- [Alibaba Cloud - Retention Policy](https://www.alibabacloud.com/help/ja/doc-detail/90564.htm)

- [Alibaba Cloud - Configure Retention Policy](https://www.alibabacloud.com/help/ja/doc-detail/90585.htm#task-lnq-csm-cfb)

###Domain Names
OSSではカスタムドメインをバケットごとに設定することで、ドメイン名でアクセスできるよう設定することができます。最も多く使われる例としては、前述の静的Webサイトホスティングを利用する際にカスタムドメインを指定する場合かと思います。

Domain Namesの指定は、Webコンソールから行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/826ceb48-0634-0cff-ff11-3f33999ecd30.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6a9551ce-7b5d-2355-7d4c-fbfc947c1e34.png)

設定画面では、Custom Domain Namesを指定するほか、Alibaba Cloudアカウントによって管理されるCNAMEレコードを自動的に追加することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/bacc5e48-13c3-29e7-c069-3fe42747639f.png)

※参考リンク：

- [Alibaba Cloud - OSS domain names](https://www.alibabacloud.com/help/ja/doc-detail/31834.htm)

- [Alibaba Cloud - Bind custom domain names](https://www.alibabacloud.com/help/ja/doc-detail/31902.htm)

###Back-to-Origin
Back-to-Originを設定することで、OSSのバケット内に目的のオブジェクトが存在しない場合の動作を定義することができます。Back-to-Originでは、参照先とするソースへのリンクを指定することができ、利用するバケット内にオブジェクトが存在しない場合、参照先にそのファイルがないかを確認します。目的のオブジェクトが参照先に存在した場合、ミラーリングによるオブジェクトの複製、あるいはリダイレクトにより、そのオブジェクトを利用することができます。

例えば参照先としてAWS S3のバケットを指定することで、OSSバケット内に該当のオブジェクトがない場合にS3を参照できるようになります。ミラーリングを利用することでS3のオブジェクトをOSSへコピーすることも可能になり、データ移行などに利用することも可能です。

Back-to-OriginはWebコンソールから設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/daaee68e-5b4b-58b9-4b60-225d179b4007.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d7358015-92bb-80f1-2e7d-6f4e5acc1ef4.png)


`Mirroring`の設定画面は以下の通りです。特定のHTTP Headerのパラメータを指定し、送信の許可・拒否を設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/936d825e-3113-096a-3615-5a4bea6ad34a.png)

`Redirection`の設定画面は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a30b580b-2a92-0d5c-4126-7dfa7f5fc40d.png)

※参考リンク：

- [Alibaba Cloud - Back-to-originルールの設定](https://jp.alibabacloud.com/help/doc-detail/31906.htm)

- [Alibaba Cloud - OssImport を使用したデータの移行](https://jp.alibabacloud.com/help/doc-detail/59922.htm)

###Image Processing
OSSは画像データを処理するAPIを提供しており、バケットに格納した画像データへアクセスする際に画像を加工して出力することができます。

例えばバケットに事前に画像データを格納しておきます。今回は[こちらのフリー素材](https://www.pakutaso.com/20170459118post-11334.html)を利用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5181ad3f-ecb2-50fc-8c96-d54cb7f600f8.png)

画像データを選択すると、以下の様にその画像をコンソールから確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c110880c-b983-123c-6e92-f96c4243b684.png)

この画像に対してWebブラウザからアクセスすると、以下のように表示されます（バケットのACLは`Public Read`に変更しています）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3f506ff1-1959-4114-266c-a194689fb338.png)

この時、例えば以下のようにURLを指定することで、出力される画像を加工したものを表示することもできます。ここでは[内接円のサイズを変更](https://jp.alibabacloud.com/help/doc-detail/44695.htm?spm=a21mg.p38356.b99.422.637528a1XjjIQO)し、画像を円形にくりぬくように加工するよう指定しました。

URL: <オブジェクトURL>?x-oss-process=image/circle,r_500
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e665cff8-b62e-ba50-cc98-93d096738863.png)

上記のような画像に対する加工のルールは、OSSのバケットごとに設定することが可能です。バケットに格納された画像データに対して、どのフォーマットの画像にどのような加工を加えるかを指定することができます。これにより、大量の画像データに対して共通の画像処理を行うことが可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/140e42cf-3037-5539-5e4b-87f312b7d2e5.png)

Image Processingのルールを作成する際は、画像のクオリティを操作してデータ容量を削減したり（JPG or WebP限定）、輝度やコントラストを指定することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/894be0d3-203a-9bc5-2fb5-3dffff95fa6a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f3c06cf9-85bd-62dc-babb-6aa6f1cf343c.png)

※参考リンク：

- [Alibaba Cloud - イメージ処理](https://jp.alibabacloud.com/help/doc-detail/44686.htm?spm=a21mg.p38356.b99.418.580a1079sSFOPT)

- [Meduim -What is Alibaba Cloud OSS Image Processing and how you can benefit from it with no extra cost and hassle?](https://medium.com/nubego/what-is-alibaba-cloud-oss-image-processing-and-how-you-can-benefit-from-it-with-no-extra-cost-and-32a5c977d09d)

###Hotlink Protection
OSSではHTTP Refererをホワイトリストとして設定することができます。これにより、指定のバケットに対するアクセスはホワイトリストで指定されたドメイン名のみが許可され、バケットのACLを`Public Read` `Public Read/Write`に指定しているバケットに対してアクセス制御を行うことができます。

Hotlink ProtectionはWebコンソールや`aliyun oss referer`などから設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3c258f9a-8f61-d750-4561-419267f8b707.png)

設定ではRefererが空のアクセスに対してアクセスを許可するかを指定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b68d0114-1d85-6b10-bb86-eafc2f5ea61f.png)

ここではテスト用URLをホワイトリストに登録し、Refererが空のアクセスは許可しないよう設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/97c3564b-7e0c-f437-c2df-58e8f277ac2a.png)

次に`curl`コマンドで上記バケットにアクセスしてみます。

```
# aliyun oss refererコマンド
[root@test01 ~]# aliyun oss referer --help
Set、get or delete bucket referer configuration

Usage:
  aliyun oss
        ossutil referer --method put oss://bucket referer [options]
    ossutil referer --method get oss://bucket [local_file]
    ossuitl referer --method delete oss://bucket


Flags:
  --mode                  use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p            use `--profile <profileName>` to select profile
  --language              use `--language [en|zh]` to assign language
  --region                use `--region <regionId>` to assign region
  --config-path           use `--config-path` to specify the configuration file path
  --access-key-id         use `--access-key-id <AccessKeyId>` to assign AccessKeyId, required in AK/StsToken/RamRoleArn mode
  --access-key-secret     use `--access-key-secret <AccessKeySecret>` to assign AccessKeySecret
  --sts-token             use `--sts-token <StsToken>` to assign StsToken
  --ram-role-name         use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --ram-role-arn          use `--ram-role-arn <RamRoleArn>` to assign RamRoleArn
  --role-session-name     use `--role-session-name <RoleSessionName>` to assign RoleSessionName
  --private-key           use `--private-key <PrivateKey>` to assign RSA PrivateKey
  --key-pair-name         use `--key-pair-name <KeyPairName>` to assign KeyPairName
  --read-timeout          use `--read-timeout <seconds>` to set I/O timeout(seconds)
  --connect-timeout       use `--connect-timeout <seconds>` to set connect timeout(seconds)
  --retry-count           use `--retry-count <count>` to set retry count
  --expired-seconds       use `--expired-seconds <seconds>` to specify expiration time
  --config-file,-c        Path of ossutil configuration file, where to dump config in config command, or to load config in other commands that need credentials.
  --endpoint,-e           Base endpoint for oss endpoint(Notice that the value of the option will cover the value in config file). Take notice that it should be second-level domain(SLD).
  --proxy-host            url of network proxy server, which supports http/https/socks5, such as https://120.79.128.211:3128, socks5://120.79.128.211:1080
  --proxy-user            username of network proxy, default is empty
  --proxy-pwd             password of network proxy, default is empty
  --loglevel              log level,default is empty(no log file output),optional value is:info|debug,info will output information logs,debug will output detail logs(including http request and response logs)
  --disable-empty-referer specifies that the referer field is not allowed to be empty,primarily used in referer command
  --method                specifies the http method,value is PUT、GET、DELETE...
  --mode                  use `--mode {AK|StsToken|RamRoleArn|EcsRamRole|RsaKeyPair|RamRoleArnWithRoleName}` to assign authenticate mode
  --profile,-p            use `--profile <profileName>` to select profile
  --config-path           use `--config-path` to specify the configuration file path
  --ram-role-name         use `--ram-role-name <RamRoleName>` to assign RamRoleName
  --help                  print help

Use `referer --help` for more information.


# Referer設定の確認
[root@test01 ~]# aliyun oss referer --method get oss://testbucket20200601
<?xml version="1.0" encoding="UTF-8"?>
  <RefererConfiguration>
      <AllowEmptyReferer>false</AllowEmptyReferer>
      <RefererList>
          <Referer>https://*test.com</Referer>
      </RefererList>
  </RefererConfiguration>


0.073019(s) elapsed



# Refererを指定しない場合
[root@test01 ~]# curl https://testbucket20200601.oss-ap-northeast-1.aliyuncs.com/
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>You are denied by bucket referer policy.</Message>
  <RequestId>5EE041C88612F23934204E62</RequestId>
  <HostId>testbucket20200601.oss-ap-northeast-1.aliyuncs.com</HostId>
  <BucketName>testbucket20200601</BucketName>
</Error>


# Refererを指定した場合
[root@test01 ~]# curl -e https://test.com/ https://testbucket20200601.oss-ap-northeast-1.aliyuncs.com/
<html>
  <head>
      <title>Hello OSS! </title>
      <meta charset="utf-8">
  </head>
  <body>
      <p>Welcome to OSS Static Website Hosting.</p>
      <p>This is the homepage.</p>
  </body>
</html>[root@test01 ~]#
```

※参考リンク：

- [Alibaba Cloud - Configure hotlink protection](https://www.alibabacloud.com/help/ja/doc-detail/31901.htm)

- [GitHub - aliyun/aliyun-cli: bucket_referer.go](https://github.com/aliyun/aliyun-cli/blob/master/oss/lib/bucket_referer.go)

###モニタリング
Alibaba Cloudには[CloudMonitor](https://jp.alibabacloud.com/product/cloud-monitor)という監視サービスがあり、Alibaba Cloudの各種サービスのモニタリングを行うことができます。CloudMonitorはOSSにも対応しており、OSSの管理画面からCloudMonitorのページへ遷移することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/bd3f5922-f0e6-4f94-dd7d-5626792ad44d.png)

OSSのトップ画面から「Manage」ボタンを選択すると、以下のようにCloudMonitorの画面へと遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/96e3acf2-5603-11c8-7dd7-bdb7993d8066.png)

※参考リンク：

- [Alibaba Cloud - モニタリングサービスの概要](https://jp.alibabacloud.com/help/doc-detail/31876.htm?spm=a21mg.p38356.b99.68.4eb779e35vh37B)


###AWS S3との対応
最後に、今回紹介しましたOSSの機能とS3との対応表を載せておきます。Alibaba CloudはAWSを参考にして設計された部分がとても多く、OSSに関してもS3と多くの類似点が存在します。S3を既に利用したことがある場合、OSSがそれぞれどの機能に対応しているかを把握することで、比較的スムーズにOSSを利用することができるかと思います。

| OSS | 対応するAWSツール | S3のリンク |
|:--|:--|:--|
| OSS | s3 | [AWS - Amazon S3](https://aws.amazon.com/jp/s3/) |
| `aliyun oss`コマンド | `aws s3`コマンド | [AWS - AWS CLI での高レベル (s3) コマンドの使用](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html) |
| OSS SDK | AWS SDK | [AWS - SDKとツール](https://aws.amazon.com/jp/getting-started/tools-sdks/)  |
| Transfer Acceleration | 同名 | [AWS - AmazonS3: Amazon S3 Transfer Acceleration](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/transfer-acceleration.html) |
| Cross-Origin Resource Sharing | 同名 | [AWS - AmazonS3: Cross-Origin Resource Sharing (CORS)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/cors.html) |
| 静的Webサイトホスティング | 同名 | [AWS - AmazonS3: Amazon S3 での静的ウェブサイトのホスティング](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteHosting.html) |
| ライフサイクル管理 | 同名 | [AWS - AmazonS3: オブジェクトのライフサイクル管理](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/object-lifecycle-mgmt.html) |
| Cross-region replication | 同名 | [AWS - AmazonS3: レプリケーション](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication.html) |
| versioning | 同名 | [AWS - AmazonS3: バージョニングの使用](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Versioning.html) |
| Retention policy | Object Lock | [AWS - AmazonS3: S3 オブジェクトロック の概要](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/object-lock-overview.html) |
| Domain Names | 同名 | [AWS - AmazonS3: Route 53 に登録されたカスタムドメインを使用した静的ウェブサイトの設定](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html) |
| Back-to-Origin | ※該当する機能不明 | [AWS - Amazon S3 バケット間で大量のデータを転送する最善の方法は何ですか ?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-large-transfer-between-buckets/) |
||| [AWS - Amazon S3 バケット間でオブジェクトをコピーする方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/move-objects-s3-bucket/) |
| Image Processing | Serverless Image Handler | [AWS - Serverless Image Handler](https://aws.amazon.com/jp/solutions/implementations/serverless-image-handler/) |
| Hotlink Protection | Bucket Policy | [AWS - AmazonS3: バケットポリシーの例](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-4) |
| モニタリング (CloudMonitor) | モニタリング (CloudWatch) | [AWS - AmazonS3: Monitoring Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/monitoring-overview.html) |

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*