やりたいこと
ディレクトリリスティングとは、URLで指定するとディレクトリに含まれるファイル一覧を表示する Web サーバーの機能です。
例えばでファイルをダウンロードする Web サイトでは、このようにファイル一覧が表示されます。
この機能を IBM Cloud Object Storage (ICOS) だけで実現します。
IBM Cloud コマンドでログイン
ibmcloud
コマンドを使っていきます。
ibmcloud login
IBM Cloud Object Storage (ICOS) インスタンス作成
IBM Cloud Object Storage (ICOS) が存在しない場合は、作成します。
# リソースグループを指定
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) のバケット作成に必要なプラグインをインストールして設定ます。
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) バケット作成
バケットを作成します。
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 からクローンします。
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"
さいごに
このようにクラウドではサーバーレスで簡単にディレクトリリスティングを実現できました。
ファイルをダウンロードする Web サイトは簡単に作れることがわかりましたね。