Google CloudRun にデプロイされた Google Express アプリを入手しました。すべてのユーザーに関連する共有データを使用し、それをグローバルパラメーターにロードしたいと思います。私のコードは、Google シークレット マネージャーを使用して、データをグローバル パラメーターに取得するためのデータベース接続情報を取得しています。アプリがコールドの場合、最初のユーザーにエラー メッセージが表示されますが、データをグローバル パラメーターにロードする非同期関数が開始され、最終的に次の呼び出しが正しく処理されます。Google シークレット マネージャーに接続しようとすると、次のエラーに気付きました。
Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
at Object.callErrorFromStatus (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
at Object.onReceiveStatus (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/client.js:175:52)
at Object.onReceiveStatus (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:341:141)
at Object.onReceiveStatus (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:304:181)
at Http2CallStream.outputStatus (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/call-stream.js:116:74)
at Http2CallStream.maybeOutputStatus (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/call-stream.js:155:22)
at Http2CallStream.endCall (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/call-stream.js:141:18)
at Http2CallStream.cancelWithStatus (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/call-stream.js:457:14)
at Timeout.<anonymous> (/usr/src/app/node_modules/@google-cloud/secret-manager/node_modules/@grpc/grpc-js/build/src/deadline-filter.js:59:28)
at listOnTimeout (internal/timers.js:554:17) {
私のコードは次のようなものです:
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');
const smClient = new SecretManagerServiceClient();
const express = require('express');
const bodyParser = require('body-parser')
let jsonParser = bodyParser.json()
const pkg = require('./package');
// ============== Express App ========
const app = express();
// Serve the files in /assets at the URI /assets
app.use('/assets', express.static('assets'));
//Params
global.Param1 = null;
global.Param2 = null;
let PgPwd = null;
app.post('/Test', jsonParser, async (req, res) => {
try
{
loadParams();
common.errors_client.report("Params were not loaded");
throw new Error("Params were not loaded");
}
catch (err) {
return res.status(400);
}
}
async function loadParams() {
try {
const promise1 = loadDataFromPostgresqlToParam1();
const promise2 = loadDataFromPostgresqlToParam2();
await Promise.all([promise1, promise2]);
}
catch (err) {
throw new Error(err);
}
}
async function loadDataFromPostgresqlToParam1() {
try {
//=============== PostgresSQL ==================
let pg_client = await getPgClient();
await pg_client.connect()
const resPg = await pg_client.query('select * from tabel1');
await pg_client.end()
let Param1 = JSON.parse(JSON.stringify(resPg));
}
}
async function loadDataFromPostgresqlToParam2() {
try {
//=============== PostgresSQL ==================
let pg_client = await getPgClient();
await pg_client.connect()
const resPg = await pg_client.query('select * from tabel2');
await pg_client.end()
let Param2 = JSON.parse(JSON.stringify(resPg));
}
}
async function getPgClient() {
var ret_client;
if (PgPwd == null) {
await getSecret().then((localPwd) => {
PgPwd = localPwd; // assign to global variable
})
};
ret_client = new Client({
user: process.env.pgUser,
host: process.env.pgHost,
database: process.env.pgDataBase,
password: PgPwd,
port: process.env.pgPort
});
return ret_client;
}
async function getSecret() {
const [version] = await smClient.accessSecretVersion({
name: process.env.pgpwdlocation
});
const pwd = version.payload.data.toString();
return pwd;
}
その理由が何であるかはわかりません。エラーは一貫していません。