Pulumi Azure TypeScript 函数内导出存储密钥报ts(1184)错误
错误产生原因
TypeScript 抛出 Modifiers cannot appear here.ts(1184) 错误的核心原因是**export 修饰符仅允许在ES模块的顶层作用域使用,不能出现在函数体内部**。你代码中export const storageAccountKeys语句写在了CreateStorageContainer函数的内部,函数内部属于局部作用域,声明的变量默认作用域仅限函数内部,本身不支持对外导出,因此编译器直接报错。
当前代码存在的编写问题
- 违反ES Module语法规则:
export的作用是将模块顶层的成员暴露给外部引用,函数内部的局部变量本身作用域就被限制在函数内,不存在导出的语法可能性。 - Pulumi栈输出逻辑理解错误:Pulumi采集部署输出值的规则是识别程序入口文件顶层作用域导出的成员,并非在任意文件任意位置写
export就能被识别为输出。你将所有资源创建逻辑封装在函数内部后,函数外部拿不到内部创建的存储账户引用,就算移除export让编译通过,也无法将密钥传递到外层作为栈输出。 - Output取值逻辑错误:
storageAccountKeys是Pulumi的异步Output类型,你写的const primaryStorageKey = storageAccountKeys.keys[0].value是同步直接访问属性的错误写法,会拿到undefined值,必须通过apply方法在回调中取出实际值。
多文件拆分架构下的正确实现方式
按照「入口文件仅保留调用逻辑、资源逻辑全拆分到独立ts文件」的要求,不需要在资源定义文件里做导出,只需要让资源创建函数将需要对外暴露的资源、输出值作为返回值返回,在入口文件接收返回值后做顶层导出即可。
修改后的blob.ts代码
// blob.ts import * as pulumi from "@pulumi/pulumi"; import * as resources from "@pulumi/azure-native/resources"; import * as storage from "@pulumi/azure-native/storage"; export default function CreateStorageContainer() { // 创建Azure资源组 const resourceGroup = new resources.ResourceGroup("somegroup", { location: "westeurope", resourceGroupName: "somegroup", }); // 创建存储账户 const storageAccount = new storage.StorageAccount("sgsomestorageaccount", { accountName: "sgsomestorageaccount", resourceGroupName: resourceGroup.name, sku: { name: storage.SkuName.Standard_LRS, }, kind: storage.Kind.StorageV2, }); // 创建Blob容器 const blobContainer = new storage.BlobContainer("someblobcontainer", { accountName: storageAccount.name, containerName: "someblobcontainer", resourceGroupName: resourceGroup.name, }); // 正确获取存储账户主密钥,处理Pulumi Output异步值 const primaryStorageKey = pulumi.all([resourceGroup.name, storageAccount.name]) .apply(([resourceGroupName, accountName]) => storage.listStorageAccountKeys({ resourceGroupName, accountName }) ) .apply(accountKeys => accountKeys.keys[0].value); // 对外返回需要暴露的资源与输出值 return { resourceGroup, storageAccount, blobContainer, primaryStorageKey } }
修改后的index.ts代码
// index.ts import CreateStorageContainer from "./blob"; // 调用资源创建逻辑,无其他业务代码 const storageRelatedResources = CreateStorageContainer(); // 入口顶层导出需要展示的栈输出,Pulumi可自动识别 export const storageAccountPrimaryKey = storageRelatedResources.primaryStorageKey;
这种实现完全符合架构要求:
- index.ts中仅保留函数调用、输出导出逻辑,没有任何Azure资源创建的业务代码
- 所有资源编排逻辑全部拆分维护在blob.ts中
- 不存在TS语法错误,存储密钥会被Pulumi正确识别为部署输出,部署完成后可直接查看。
内容的提问来源于stack exchange,提问作者zeenmc
相关产品推荐
相关产品推荐

