CloudStorageにアップロードしたファイルにアクセスするURLが欲しい
File#getSignedUrl
を使います。
https://cloud.google.com/nodejs/docs/reference/storage/2.5.x/File#getSignedUrl
でも設定足りてないとエラーになるよ、というお話。
話それるけど
@google-cloud/storage
のAPIリファレンスはここに誘導されるけどなぜか開けない…
https://googleapis.dev/nodejs/storage/latest
話それるけど2
アップロードはこんな感じでできます
const admin = require('firebase-admin');
admin.initializeApp();
const bucket = admin.storage().bucket();
(中略)
await bucket.upload(file, {
destination: 'dir/image.png',
gzip: true,
metadata: {
cacheControl: 'public, max-age=31536000',
contentType: 'image/png',
},
});
getSignedUrl
デフォルトだとCloudStorage上のファイルはprivateなので読めない。(403エラー)
getSignedUrl
で読めるURLを取得する。
失効時間指定もできる。
getSignedUrlしてみる
// 10分間だけ有効
const url = await bucket.file('dir/image.png').getSignedUrl({
action: 'read',
expires: moment().utc().add(10, 'minutes').format(),
});
エラーになることがある その1
Error: A Forbidden error was returned while attempting to retrieve an access token for the Compute Engine built-in service account.
This may be because the Compute Engine instance does not have the correct permission scopes specified.
Identity and Access Management (IAM) API has not been used in project 566029xxxxxx before or it is disabled.
Enable it by visiting
https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=566029xxxxxx
then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
エラーメッセージに記載されたURLにアクセスし、指示の通りにIAM API
を有効化しましょう。
エラーになることがある その2
Error: A Forbidden error was returned while attempting to retrieve an access token for the Compute Engine built-in service account.
This may be because the Compute Engine instance does not have the correct permission scopes specified.
Permission iam.serviceAccounts.signBlob is required to perform this operation on service account
projects/XXsome-projectXX/serviceAccounts/XXsome-projectXX@appspot.gserviceaccount.com.
ちょっと何言ってるかわかりません…
ググったらこういうことらしいです。
<プロジェクト名>@appspot.gserviceaccount.com
(App Engine default service account)にサービスアカウントトークン作成者
roleをつける
※iam.serviceAccounts.signBlob
の権限をもつroleを新たに作ったほうがいいのかもしれませんが、サービスアカウントトークン作成者
だけがこの権限を持っていたのでこれを付けることにしました。
以上で解決しました
コードの修正は必要ありませんでした。
めでたしめでたし。