1クール続けるブログ

とりあえず1クール続けるソフトウェアエンジニアの備忘録

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}";