我正在使用 Google 的 Secret Manager 来访问我的云功能中的机密。到目前为止,对于我的所有函数(即 https 和 pubsub 函数)来说,这一切都工作得很好。 现在我编写了一个由 firestore 文档更改触发的函数:
exports.onDocumentUpdated = functions
.runWith({ secrets: ["MY_SECRET"] })
.firestore
.document('documents/{documentId}')
.onUpdate(async (change: func.Change<QueryDocumentSnapshot>, context)
在这种情况下,process.env.MY_SECRET 未定义。当我在 Cloud Console 中查找函数的机密时,我发现它可以访问我在另一个函数中使用的完全不同的机密。在此处添加 MY_SECRET 时,云功能可以正常工作,但只有在我通过 cli 重新部署之前,MY_SECRET 才会再次被删除。
我检查了其他秘密的权限,它们都显示完全相同的角色/主体。从字面上看,它们都是一样的,唯一的区别是这个函数是一个 firestore 触发函数。我错过了什么?
编辑: 又测试了以下两个功能:
exports.testSecret1 = functions
.runWith({ secrets: ["TEST_SECRET"] })
.https.onCall(async (data, context) => {
func.logger.info(`${process.env.TEST_SECRET}`);
})
exports.testSecret2 = functions
.runWith({ secrets: ["TEST_SECRET"] })
.firestore
.document('documents/{documentId}')
.onUpdate(async (change: func.Change<QueryDocumentSnapshot>, context) => {
func.logger.info(`${process.env.TEST_SECRET}`);
})
testSecret1
可以访问 TEST_SECRET
testSecret2
无法访问 TEST_SECRET
,打印 undefined
运行以下命令以授予访问您的秘密的权限
TEST_SECRET
firebase functions:secrets:access TEST_SECRET
如果您新创建机密,请使用以下命令
firebase functions:secrets:set SECRET_NAME
在部署之前,请确保您的函数代码允许函数使用
runWith
参数访问密钥。
查看此文档以获取更多信息。
还要确保您使用的是最新版本的
firebase-tools
我无法使用您问题中的语法找到任何解决方案。但是,如果您更改代码以使用下面的语法样式,则可以在 Firestore 触发器中使用机密,如下所示
exports.myUpdate = onDocumentCreated({
document: "/collection/{docID}",
secrets: [SECRET_KEY]
},
async (event) => {
const secretKey = SECRET_KEY.value()
// code
}
);