Oracle Cloud Infrastructure(OCI)のObject Storageにファイルをアップロードする (bashスクリプト)

# やりたいこと
bashスクリプトで、(ociコマンドを使わずに)Oracle Cloud InfrastructureのObject Storageにファイルをアップロードする

# 参考にしたドキュメント
[Oracle Cloud Infrastructure Documentation - Request Signatures](https://docs.cloud.oracle.com/iaas/Content/API/Concepts/signingrequests.htm#Bash)
[Oracle Cloud: upload large files through the Object Store REST API] (https://db-blog.web.cern.ch/blog/franck-pachot/2018-09-oracle-cloud-upload-large-files-through-object-store-rest-api)
[コーソルさんのブログ (OCIオブジェクトストレージの論理構造とURL)](http://cosol.jp/techdb/2018/12/oci-object-storage-logical-architecture-url.html)

# 事前の作業
* OCIのユーザ作成
* バケット作成
* 鍵ペアの作成
* APIキーの追加

## OCIのユーザ作成手順
手順は割愛

## バケット作成手順
手順は割愛

## 鍵ペアの作成手順
鍵ペアの作成は、以下のドキュメントを参考に。

[Oracle Cloud Infrastructure Documentation - Required Keys and OCIDs - How to Generate an API Signing Key](https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm)

## APIキーの追加手順
1.「OCIのユーザ作成」で作成したユーザ(オブジェクトストレージ接続用のユーザ)を使用してOCIコンソールにログイン
2. 画面右上の人マーク→ユーザID(メールアドレス)を押下。
3.「公開キーの追加」ボタンを押下
![api-key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/3d38974d-8793-0a54-bde7-17a157762736.png)
4. ポップアップ画面に、~/.oci/oci_api_key_public.pemの中身を張り付けて「追加」ボタンを押下

# IDの確認
スクリプト内部に指定する、各種IDを確認します。


* テナントID
* ユーザID
* Keyフィンガープリント

##テナントIDの確認手順
画面右上の人マーク→「テナンシ:<テナント名>」を押下後、以下の画面からOCIDの「コピー」リンクを押下します
![api-key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/68fc52b0-af49-f19a-c46b-de0f5f2f14b3.png)

##ユーザIDの確認手順
画面右上の人マーク→ユーザID(メールアドレス)を押下後、以下の画面からOCIDの「コピー」リンクを押下します
![api-key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/2f7ccf2d-daaa-f6b3-b74b-aa2081119164.png)

##Keyフィンガープリントの確認手順
上記「鍵ペアの作成手順」で作成した秘密鍵に対して以下のコマンドを実行します。
「APIキー」画面からも確認可能です。
$ <b>openssl rsa -pubout -outform DER -in ~/.oci/oci_api_key.pem | openssl md5 -c</b>

# スクリプトの作成
1.以下のスクリプトをコピーして貼り付けます
$ <b>vi oci-curl.func</b>
[Oracle Cloud Infrastructure Documentation - Request Signatures - View the Bash sample in full screen for easier reading](https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/signing_sample_bash.txt)

2.スクリプト内の以下の変数を書き換えます

```
function oci-curl {
	# TODO: update these values to your own
		local tenancyId="ocid1.tenancy.oc1..aaaaaaaaba3pv6wkcr4jqae5f15p2b2m2yt2j6rx32uzr4h25vqstifsfdsq";
		local authUserId="ocid1.user.oc1..aaaaaaaat5nvwcna5j6aqzjcaty5eqbb6qt2jvpkanghtgdaqedqw3rynjq";
		local keyFingerprint="20:3b:97:13:55:1c:5b:0d:d3:37:d8:50:4e:c5:3a:34";
		local privateKeyPath="/Users/someuser/.oci/oci_api_key.pem";
```

  * tenancyIdは、「IDの確認」で確認したテナントIDの値に置き換える
  * authUserIdは、「IDの確認」で確認したユーザIDの値に置き換える
  * keyFingerprintは、「IDの確認」で確認したKeyフィンガープリントの値に置き換える
  * privateKeyPathは、「鍵ペアの作成手順」で作成した秘密鍵のパスに置き換える

3.oci-curl関数の引数に指定する変数を設定 (任意)
 引数にべたがきしてもいいのですが、指定する値の説明のため、ここでは変数化しています。
 $ <b>OCI_HOSTURL=objectstorage.ap-tokyo-1.oraclecloud.com</b>
   ※オブジェクトストレージのリソースURLは、objectstorage.<リージョン名>.oraclecloud.com
 $ <b>OCI_TENANTNAME=<テナント名></b>
 $ <b>OCI_BUCKETNAME=<バケット名></b>
 $ <b>UPLOAD_FILE_PATH=<アップロードするファイルのローカルパス></b>
 $ <b>OCI_OBJECTFILE_NAME=<オブジェクトストレージ上のファイル名></b>

4.ファイルのアップロード
 $ <b>. oci-curl.func</b>
 $ <b>oci-curl \${OCI_HOSTURL} PUT \${UPLOAD_FILE_PATH} "/n/\${OCI_TENANTNAME}/b/\${OCI_BUCKETNAME}/o/\${OCI_OBJECTFILE_NAME}"</b>
※Proxyサーバを経由する場合は、事前に以下環境変数も設定します
 $ <b>export https_proxy=<プロキシサーバのIP>:<ポート></b>

→ ファイルがUploadできていることを確認します