【发布时间】:2020-11-03 13:20:14
【问题描述】:
我发现了一些关于使用 AwsCustomResource 从 AWS CDK 构造中进行 AWS 开发工具包调用的问题和答案,但没有关于响应可能很大的用例,并且 cfn 超过了大约 4KB 的限制回复。
我的目标是能够从我的 CDK 堆栈中获取小型 codeartifact 存储资产。最初我从我的 CDK 构造中调用 AWS 开发工具包开始,但后来意识到我会遇到竞争条件,因为 CDK 构造并不意味着运行异步代码。
然后我考虑使用 AwsCustomResource 为 CodeArtifact 执行 getPackageVersionAsset SDK 调用,但现在我的问题是响应对于 CFN 响应来说太大了。
这是我所拥有的,但它不适用于大于几 KB 的响应。
const namespace = new AwsCustomResource(this, 'custom-resource', {
onUpdate: {
physicalResourceId: PhysicalResourceId.of('codeartifact-stored-artifact-namespace'),
service: 'CodeArtifact',
action: 'getPackageVersionAsset',
parameters: {
repository: codeartifactCoordinates.repository,
domain: codeartifactCoordinates.domain,
domainOwner: codeartifactCoordinates.domainOwner,
format: codeartifactCoordinates.format,
namespace: codeartifactCoordinates.groupId,
package: codeartifactCoordinates.artifactId,
packageVersion: codeartifactCoordinates.version,
asset: `${codeartifactCoordinates.artifactId}-${codeartifactCoordinates.version}-${codeartifactCoordinates.classifier}.zip`
}
},
policy: AwsCustomResourcePolicy.fromSdkCalls({resources: AwsCustomResourcePolicy.ANY_RESOURCE})
});
const result = namespace.getResponseField('Data');
作为比较,这是我在 Construct 中使用客户端调用 sdk 时开始使用的 AWS 开发工具包代码:
const outputFile = `artifact-${crypto.randomBytes(16).toString("hex")}.yml`;
const file = require('fs').createWriteStream(outputFile);
const params : AWS.CodeArtifact.GetPackageVersionAssetRequest = {
domain: codeartifactCoordinates.domain,
domainOwner: codeartifactCoordinates.domainOwner,
repository: codeartifactCoordinates.repository,
format: codeartifactCoordinates.format,
namespace: codeartifactCoordinates.groupId,
package: codeartifactCoordinates.artifactId,
packageVersion: codeartifactCoordinates.version,
asset: `${codeartifactCoordinates.artifactId}-${codeartifactCoordinates.version}-${codeartifactCoordinates.classifier}.yml`
};
return new Promise((resolve, reject) => {
codeartifact
.getPackageVersionAsset(params)
.createReadStream()
.on('end', () => {
const data = fs.readFileSync(outputFile, "utf-8");
const yamlNs = YAML.parse(data);
return resolve(yamlNs);
})
.on('error', (error) => {
return reject(error);
})
.pipe(file)
});
有没有更好的模式呢?或者,有没有一种方法可以在我的 Construct 中执行 AWS 开发工具包调用,让我可以等待资产响应调用完成并避免竞争条件?
【问题讨论】:
标签: aws-cdk