Edited at

curlコマンドでIBM Cloud Object Storage(ICOS)にファイルをアップロードして公開する

curlコマンドでIBM Cloud Object Storage(ICOS)にファイルをアップロードしてインターネットに向けて公開する方法です。

基本的には下記docsの通りではありますが、ICOSのEndpointが新しくなってる?とか、Bearerのtokenってどうやって取得すればいいの?とか、ちょっと調べる必要があったので、備忘録として書いておきます。

https://cloud.ibm.com/docs/services/cloud-object-storage/iam?topic=cloud-object-storage-iam-public-access

bucketの公開設定は上記docsや、下記の手順で行います。

https://qiita.com/testnin2/items/6379e5bc5ea165212e15


ICOSのエンドポイント

ICOSのエンドポイント情報はこちらにあります。

https://cloud.ibm.com/docs/services/cloud-object-storage?topic=cloud-object-storage-endpoints#endpoints

TOKは s3.jp-tok.cloud-object-storage.appdomain.cloud ですね。

従来の s3.jp-tok.objectstorage.softlayer.net もありますが、新しいほうを使うのが無難でしょう。


Bearerのtokenを取得

下記URLの手順でbearer tokenを入手します。

https://cloud.ibm.com/docs/iam?topic=iam-iamtoken_from_apikey

上記で使うapikeyをまだ持っていない場合は、下記画面で作成します。

Manage > Access(IAM) で、左側メニューから、IBM Cloud API Keysを選択。

https://cloud.ibm.com/iam#/apikeys

image.png

Bearer tokenを取得するコマンド

curl -k -X POST --header "Content-Type: application/x-www-form-urlencoded" --header "Accept: application/json" --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey" --data-urlencode "apikey=[上記で作成したapikey]" "https://iam.cloud.ibm.com/identity/token"

その出力。access_tokenの文字列をbearer tokenとして使います。略していますが、結構長いです。

{"access_token":"eyJraWQiOi・・・・・・略・・・・・・wcggXEqI6-0QqCg","refresh_token":"ReXaaamPhX・・・・・・略・・・・・・・rsXVSxGiS8A","ims_user_id":74xxxxx,"token_type":"Bearer","expires_in":3600,"expiration":1557396995,"scope":"ibm openid"}

APIエンドポイントとして https://cloud.ibm.com を指定してibmcloudにログインします。

$ ibmcloud login -a https://cloud.ibm.com

ログイン処理の中で地域を聞かれたら、bucketのあるjp-tokを選択します。

地域を選択します (または Enter キーを押してスキップします):

1. au-syd
2. jp-tok
3. eu-de
4. eu-gb
5. us-south
6. us-east
数値を入力してください> 2
ターゲットの地域 jp-tok

上記で入手したaccess_tokenを使って、下記URLにあるcurlコマンドを組み立てます。

https://cloud.ibm.com/docs/services/cloud-object-storage/iam?topic=cloud-object-storage-iam-public-access

-Tオプションを使っている点が上記URLと違いますが、このオプションで、ローカルにあるアップロードしたいファイル名を指定します。成功すると、特にメッセージなくプロンプトが返ってきます。

$ curl -X PUT https://[自分のbucket名].s3.jp-tok.cloud-object-storage.appdomain.cloud/index.html -H "x-amz-acl: public-read" -H "Authorization: Bearer eyJraWQiOi・・・・・・略・・・・・・wcggXEqI6-0QqCg" -H "Content-Type: text/html" -T index.html

$

画像をアップするときはContent-Typeを image/png とかにすればOKです。

$ curl -X PUT https://[自分のbucket名].s3.jp-tok.cloud-object-storage.appdomain.cloud/cloud.png -H "x-amz-acl: public-read" -H "Authorization: Bearer eyJraWQiOi・・・・・・略・・・・・・wcggXEqI6-0QqCg" -H "Content-Type: image/png" -T cloud.png

$

ブラウザから、アップロードしたファイルが確認できました。

image.png

以上