CurlでGCSにファイルをアップロードする
gsutilがどうしても使えないけどGCS使いたい
例えば、KubernetesのPostStartとかPrestopでGCSからダウンロード/アップロードするとか。
Dockerfile内でGCS使わなくてはいけなくなった。でもそれだけのためにRUN
して後でお片づけするのも時間ちょっと増えるし嫌みたいな時とか。
curlでの処理
アクセストークンを取得
jqが使えれば、もっとちゃんとしたのが書けるのですが今回は無い想定で書いてます。もっと良い方法があれば是非教えていただきたく。 以下を参照。
Creating and Enabling Service Accounts for Instances | Compute Engine Documentation | Google Cloud
TOKEN=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?alt=text" -H "Metadata-Flavor: Google" | grep access_token |awk '{ print $2 }')
POSTリクエストでファイルアップロードする
TEXT="文字列" curl -X POST --data "${TEXT}" \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: text/plain" \ "https://www.googleapis.com/upload/storage/v1/b/${bucket}/o?uploadType=media&name=${OBJECT_NAME}"
k8sのdeploymentのpostStartに記述してみる
アップロードするパスは後で見やすくなるように適宜スラッシュ入れて区切るべしってやつですね。アップロードが多くなるようなら日にちで一旦スラッシュ入れたりとかになるんでしょうか。 postStart / preStopで複数行の記述をする方法に関しては以下を参考にしました。
kubernetes - multiple command in postStart hook of a container - Stack Overflow
preStop: exec: command: - "sh" - "-c" - > ACCESS_TOKEN=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?alt=text" -H "Metadata-Flavor: Google" | grep access_token |awk '{ print $2 }'); TEXT="文字列"; OBJECT_NAME=Bucket/$(date +"%Y%m%d%H%M%S")_$(hostname); curl -X POST --data "${TEXT}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: text/plain" \ "https://www.googleapis.com/upload/storage/v1/b/${bucket}/o?uploadType=media&name=${OBJECT_NAME}";