IBM Cloud Object Storage (ICOS) のバケットでディレクトリリスティングする


#やりたいこと

ディレクトリリスティングとは、URLで指定するとディレクトリに含まれるファイル一覧を表示する Web サーバーの機能です。
例えばでファイルをダウンロードする Web サイトでは、このようにファイル一覧が表示されます。
この機能を IBM Cloud Object Storage (ICOS) だけで実現します。

![Kobito.0Ae7GE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/03bef7e1-9ea8-f6ea-962a-4f90739eb8fc.png "Kobito.0Ae7GE.png")

# IBM Cloud コマンドでログイン
`ibmcloud` コマンドを使っていきます。

```
ibmcloud login
```

# IBM Cloud Object Storage (ICOS) インスタンス作成
IBM Cloud Object Storage (ICOS) が存在しない場合は、作成します。

>https://cloud.ibm.com/docs/services/cloud-object-storage/basics?topic=cloud-object-storage-gs-dev#gs-dev-provision

```
# リソースグループを指定
export RESOURCE_GROUP=khayama
ibmcloud target -g $RESOURCE_GROUP

# サービスインスタンスを作成
export INSTANCE_NAME=khayama-cos
export PLAN=lite # or standard
ibmcloud resource service-instance-create $INSTANCE_NAME cloud-object-storage $PLAN global
```

```
...

Creating service instance khayama-cos in resource group khayama of account TEST as khayama-user...
OK
Service instance khayama-cos was created.
                 
Name:         khayama-cos   
ID:           crn:v1:bluemix:public:cloud-object-storage:global:a/039dbe6794084c7cb514a276dd2345da:ea7a91a5-30be-4ed0-a94c-d10115b03210::   
GUID:         ea7a91a5-30be-4ed0-a94c-d10115b03210   
Location:     global   
State:        active   
Type:         service_instance   
Sub Type:        
Created at:   2019-10-14T09:15:05Z   
Updated at:   2019-10-14T09:15:05Z   
```

# IBM Cloud Object Storage (ICOS) CLI プラグインのインストール・設定

IBM Cloud Object Storage (ICOS) のバケット作成に必要なプラグインをインストールして設定ます。

>https://cloud.ibm.com/docs/cloud-object-storage-cli-plugin?topic=cloud-object-storage-cli-ic-cos-cli#ic-installation

```
ibmcloud plugin install cloud-object-storage
```

#

```
export CRN=`ibmcloud resource service-instance khayama-cos | grep crn | awk '{print $2}'`
ibmcloud cos config crn --crn $CRN
```

# IBM Cloud Object Storage (ICOS) バケット作成
バケットを作成します。

>https://cloud.ibm.com/docs/cloud-object-storage-cli-plugin?topic=cloud-object-storage-cli-ic-cos-cli#ic-create-bucket

```
export BUCKET_NAME=khayama-ibmcloud
ibmcloud cos create-bucket --bucket $BUCKET_NAME --region jp-tok --class SMART
ibmcloud cos list-buckets
```
# IBM Cloud Object Storage (ICOS) バケットの Public Access を有効化 (CLI)
バケット単位で公開するコマンドを実行します。
`ibmcloud` コマンドのバージョン `1.3.0` 以上で実行してください。

```
export INSTANCE_ID=$(ibmcloud resource service-instance khayama-cos --output json | jq -r '.[].guid')

ibmcloud iam access-group-policy-create パブリック・アクセス --roles "Content Reader" \
--service-name cloud-object-storage \
--service-instance $INSTANCE_ID \
--resource-type bucket \
--resource $BUCKET_NAME
```

## 【参考】 IBM Cloud Object Storage (ICOS) バケットの Public Access を有効化 (curl)

バケット単位で公開するコマンドを実行します。

>https://cloud.ibm.com/apidocs/iam-policy-management#create-a-policy

```
export ACCESS_TOKEN=`ibmcloud iam oauth-tokens | head -n 1 | awk '{print $5}'`
export ACCOUNT_ID=`ibmcloud account show | grep ID | awk '{print $3}'`
export INSTANCE_ID=`ibmcloud resource service-instance khayama-cos | grep GUID | awk '{print $2}'`

curl -X POST \
'https://iam.cloud.ibm.com/v1/policies' \
-H "Authorization: $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
  "type": "access",
  "subjects": [
    {
      "attributes": [
        {
          "name": "access_group_id",
          "value": "AccessGroupId-PublicAccess"
        }
      ]
    }
  ],
  "roles":[
    {
      "role_id": "crn:v1:bluemix:public:cloud-object-storage::::serviceRole:ContentReader"
    }
  ],
  "resources":[
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "'$ACCOUNT_ID'"
        },
        {
          "name": "serviceName",
          "value": "cloud-object-storage"
        },
        {
          "name": "serviceInstance",
          "value": "'$INSTANCE_ID'"
        },
        {
          "name": "resourceType",
          "value": "bucket"
        },
        {
          "name": "resource",
          "value": "'$BUCKET_NAME'"
        }
      ]
    }
  ]
}'
```

# ディレクトリリスティングに必要な `index.html` をダウンロード
GitHub からクローンします。

>[nolanlawson/pretty-s3-index-html](https://github.com/nolanlawson/pretty-s3-index-html)

```
git clone https://github.com/nolanlawson/pretty-s3-index-html.git
cd pretty-s3-index-html
```

# コンテンツタイプを指定してアップロード


```
export ENDPOINT=s3.jp-tok.cloud-object-storage.appdomain.cloud

curl -X PUT "https://$BUCKET_NAME.$ENDPOINT/index.html" -H "x-amz-acl: public-read" -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: text/html" -T index.html
```

# ディレクトリリスティングを確認
Web にアクセスすると確認できます。

```
open "https://$BUCKET_NAME.$ENDPOINT/index.html"
```

![Kobito.sgIl6i.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/29ee9f3f-68ca-09fa-f386-4d14c4fbb479.png "Kobito.sgIl6i.png")

# さいごに
このようにクラウドではサーバーレスで簡単にディレクトリリスティングを実現できました。
ファイルをダウンロードする Web サイトは簡単に作れることがわかりましたね。