小ネタ: ファイルを１つだけパブリックに公開したかったので、勢いでIBM Cloud Object Storageを使ってみた話


# TL;DR(要は)
- ある事情があり、ネット上にファイルを１つだけ公開して誰でも参照できるようにしたかった
- ICOSに目をつけ、あれこれ調べて/やったら、できた！:grin:
- けどよく考えると、そんなん、Githubでやれば超簡単だった..:weary:

という、**無駄な努力の記録**です（ハアー。。:broken_heart:）
(でも、せっかく調べたのと、先々ICOS上で必要になるかもしれないので、忘れないように記事にしました)

# (2019/8) ICOSでもバケット単位で簡単に公開設定できるようになりました

当記事執筆時点(2018/12)ではできなかったのですが、その後、ICOSをバケット単位で簡単にPublic公開できるようになりました。方法はは[@testnin2](https://qiita.com/testnin2)さんの下記の記事をご参照ください。
[ICOSのデータを認証なしに外部公開する方法(IAM利用）](https://qiita.com/testnin2/items/6379e5bc5ea165212e15)

以下は2018/12月時点でそのまま残します。
---

# きっかけ
**ある特定のファイルを１つだけネット上に公開して、HTTPで参照可能にしたかった**んですが、１ファイルのために自分でWebサーバー立てるのもアホらしい。で何か無いかなーと思って、「**おー！ICOSがあるじゃないか！**」と思いつきました。

# ICOSでのパブリックなファイル共用の方法
早速ドキュメントをググる。ICOSのドキュメント「[Allowing public access](https://console.bluemix.net/docs/services/cloud-object-storage/iam/public-access.html#allowing-public-access)」によると以下の２つの方法がある模様.

|#| Credential | 公開期間 |方法 | 
|:---|:---:|:---|:---|
|1| IAM | ずっと[^1] | ACLにx-amz-acl: public-readを設定する |
|2| HMAC | 一定期間[^2] | awscliでpresigned URLを生成 |

[^1]: 属性を改めて非公開に再設定するまで
[^2]: デフォでは3600s

できそうなので、前もって公開したいファイルをバケットにアップロードしました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/dec3c7cd-9c24-16b4-6a13-6e6e0758692c.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/61fd9d4a-5045-9176-660e-1bf2fc9984d6.png)

|項目 | 指定値 |
|:---:|:---|
|回復性とロケーション|Regional / jp-tok |
|エンドポイント(public)|s3.jp-tok.objectstorage.softlayer.net|
|バケット名|cognos|
|ファイル名|CSV_jp.csv|

**http://{エンドポイント(public)}/{バケット名}/{ファイル名}**の形式で誰でもアクセスできるようにしたいのでURLは以下になります。
`http://s3.jp-tok.objectstorage.softlayer.net/cognos/CSV_jp.csv`
当然ですがこのままアクセスしてもAccessDenied(403)になります。

その前提で以下、両方の手順をご紹介します

# まずはIAMでやってみた
### Bearer {Token}って何?
「[Allowing public access](https://console.bluemix.net/docs/services/cloud-object-storage/iam/public-access.html#allowing-public-access)」によればcurlで下記コマンド一発でオーケー、とのこと。URLもあるし簡単じゃん、と思ってふと疑問が。「この**Bearer {Token}**」って何? ICOSをCurlで操作する例のすべてで**Bearer {Token}**が出てくるけど、IAMだからAPIKEYとかじゃないの？と:question::question::question::question:状態に。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c2b5a828-370a-edf0-a2ef-cc5dc4a928f6.png)

### Bearer {Token}はPlatform API Keyから生成するものだった
ドキュメント[Bucket operations](https://console.bluemix.net/docs/services/cloud-object-storage/api-reference/api-reference-buckets.html#iam)からIAMのリンクをだどって[Getting Started](https://console.bluemix.net/docs/services/cloud-object-storage/getting-started-cli.html#gather-key-information)に生成の方法が書いてありました。

:warning: : サービス資格情報のほうのapikeyではなくて、プラットフォームAPIキーを使う必要がある点にご注意ください

【1】まずは(なければ) 以下の要領でプラットフォームAPIキーを作成します。**後から参照できない**のでかならずメモか、ファイルでダウンロードしておきましょう。

![ICOS_Platform_APIKey.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/8b6d4abf-9a9a-53e2-0caf-56ce4f1077bf.gif)

【2】コマンドからCLIでログイン


`bx login --apikey <上記APIキー>`

```bash
C:\Users\IBM_ADMIN>bx login --apikey 1Olv6ni3yxxxxxxxxU7dyraMK1gByNMBTe2GwhTV8VYba
API エンドポイント: https://api.eu-gb.bluemix.net
認証中です...
OK

<途中省略>
```

【3】Bearerトークンを入手

`bx iam oauth-tokens`

入手したBearerトークンは、かなり長いです。

```bash
C:\Users\IBM_ADMIN>bx iam oauth-tokens
IAM トークン:  Bearer eyJraWQiOiIy(長いので省略)mwxfkHXO26Gb67XKjcgf1vAmWTGri2VdfFVFDJjY63FQmg
```

【4】Bearerトークンを指定してcurl実行

Curlで指定する場合はAuthorization:**Bearerで始まる後ろ全部**を指定します。
エラーが返らなければ成功です

```bash
C:\Users\IBM_ADMIN>curl -X "PUT" "https://s3.jp-tok.objectstorage.softlayer.net/cognos/CSV_jp.csv?acl"  \
-H "x-amz-acl: public-read" \
-H "Authorization: Bearer eyJraWQiOiIy(長いので省略)mwxfkHXO26Gb67XKjcgf1vAmWTGri2VdfFVFDJjY63FQmg" \
-H "Content-Type: text/plain; charset=utf-8"
```

【5】アクセスしてみる
 
上記設定が終わってブラウザーでアクセスすると確かに認証なしでダウンロードできるようになりましたのでGETでアクセスできています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/cc1f606f-1027-1546-6321-ef1e9641f4bb.png)

# 次はHMACでやってみた
HMACは要はAWSのS3互換の形式です。HMACでは時間限定つきでファイルを公開することができます。

【1】{HMAC:true}でHMAC用のサービス資格情報を生成する

:warning: 2018/12/13現在、ブラウザーの言語が日本語設定だと生成が失敗するようです。言語設定を英語にしてから操作してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8eafe060-b462-8e4b-e135-17786e6c3116.png)

Service Credentialsで「New Credential」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/da7381fd-a2f0-e2cd-529a-443396d49ae2.png)

パネルの「Name」にお好みの名前、「Add Inline Configulation」に**{"HMAC":true}**を記入して「Add」ボタン→HMACのエントリができます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d3c5f520-ef55-8cc9-f44f-fcb4ad634b38.png)

【2】 (未導入なら) awscliをインストール

(必要ならPython導入後) `pip install awscli`でawscliをインストールし、`aws --version`で確認

```bash
C:\Users\IBM_ADMIN>aws --version
aws-cli/1.16.73 Python/3.6.4 Windows/7 botocore/1.12.63
```
`aws configure`で構成を作成(.aws/configと.aws/credentialsができる)
- AWS Access Key ID はサービス資格情報の**access_key_id**を指定
- AWS Secret Access Keyはサービス資格情報の**secret_access_key**を指定


```bash
C:\Users\IBM_ADMIN>aws configure
AWS Access Key ID [None]: 9127295711xxxxxxxx86f2ede7e41ce0
AWS Secret Access Key [None]: 50e5dc8a998721xxxxxxxx718bd2cf559ab93e78fe8fdcea
Default region name [None]: jp-tok
Default output format [None]: json
```
【3】awsコマンドでpresigned URLを生成

ドキュメント「[Create a presigned URL](https://console.bluemix.net/docs/services/cloud-object-storage/hmac/presigned-urls.html#create-a-presigned-url)」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e632f8bc-4df6-0106-8085-7b6d9ac8afb4.png)

同じバケットのCSV_en.csvは現在アクセスできません。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5e0c7c62-8474-86cb-92f3-58fc1d957466.png)
presigned URLを生成します
`aws --endpoint-url=https://s3.jp-tok.objectstorage.softlayer.net s3 presign s3://cognos/CSV_en.csv`

```bash
C:\Users\IBM_ADMIN>aws --endpoint-url=https://s3.jp-tok.objectstorage.softlayer.net s3 presign s3://cognos/CSV_en.csv
https://s3.jp-tok.objectstorage.softlayer.net/cognos/CSV_en.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=91272957110b41a98f86f2ede7e41ce0%2F20181213%2Fjp-tok%2Fs3%2Faws4_request&X-Amz-Date=20181213T060302Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0762491c6c9c30b862eb99f5a1e4ade1ef8ddcafa5c994ab8a2b73acf3c23e89
```
`https://s3.jp-tok.objectstorage.softlayer.net/cognos/CSV_en.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=91272957110b41a98f86f2ede7e41ce0%2F20181213%2Fjp-tok%2Fs3%2Faws4_request&X-Amz-Date=20181213T060302Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0762491c6c9c30b862eb99f5a1e4ade1ef8ddcafa5c994ab8a2b73acf3c23e89`が3600秒有効なPresigned URLです

【4】このURLで、ブラウザーからファイルにアクセスできました！
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/23865a6d-3299-8d33-232f-4e365eda9a39.png)
:triangular_flag_on_post: 長いので短縮URLとかを使ったほうがいいのかも。

# さらに
参考ですが[NGINXをフロントに立ててICOSを静的なWebサーバー的に使う方法の記事](https://www.ibm.com/blogs/bluemix/2017/03/static-websites-cloud-object-storage-cos/)もありました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a8558f47-a904-82e9-dd58-09a5dc5f1a67.png)

# フー！両方できた！
ということで満足してたんですが、、、

# もしかして:octocat: Githubでいいんじゃね？と
思いやってみたら、簡単にできました。単にファイルアップしてView Rawで表示されるURLを使えばよかったのでした。。

**https://raw.githubusercontent.com/{ユーザー}/{リポジトリ名}/master/{ファイル名}**
`https://raw.githubusercontent.com/ishida330/repo1/master/CSV_jp.csv`

![github_002.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/daf29486-6235-ab93-5540-ebcf14e63013.gif)

ですよね。。:octocat: 偉大だなあ。。あまりに無駄な知識をつけてしまったので、さらに無駄を強化すべく、記事にしました。ここまでお付き合いいただき、ありがとうございました。:end: