如何解决当StringListParameter不起作用时,如何使用SSM获取从一个堆栈到另一个堆栈的子网ID列表?
根据this bug和this bug,由于CFT的某些问题,ssm.StringListParameter
在CDK中不起作用。
我需要能够从一个堆栈中导出任意长度的subnetIds列表,并使用SSM将其导入到另一个堆栈中,因为subnetIds的生存期与第二个堆栈中subnetIds使用者的生存期完全不同(尤其是在生产中,尽管不在沙盒中)。我无法对子网ID进行硬编码,因为创建沙箱时,ID会因沙箱而异。我想要SSM密钥中最新的版本。
但是,这些错误似乎无法解决,而且我找不到解决方法。
我尝试使用JSON进行序列化,但是代码周围传递的项目是后期绑定Token
,它被视为字符串,而反序列化的项目是string []
,因此不可能以获得此类代码进行编译。
这是我尝试过的一个例子。它无法编译:
export function getOtherStackOutputList(stack: cdk.Stack,mangledOtherStackName: string,key: string): string [] {
const globallyUniqueKey = `/${mangledOtherStackName}/${key}`;
const jsonResult = ssm.StringParameter.fromStringParameterName(stack,key + 'SSM',globallyUniqueKey).stringValue;
if (cdk.Token.isUnresolved(jsonResult)) {
return jsonResult;
} else {
const result = JSON.parse(jsonResult);
return result;
}
};
将由如下所示的代码使用:
const efsVpcIsolatedSubnetsIds = StackValueShare.getOtherStackOutputList(this,mangledStackName + efsDbStackSuffix,'efsTimeSeriesDatabaseVpcIsolatedSubnets');
解决方法
这对我有用:
import { Construct } from '@aws-cdk/core';
import { AwsCustomResource,AwsSdkCall } from '@aws-cdk/custom-resources';
import iam = require("@aws-cdk/aws-iam");
interface SSMParameterReaderProps {
parameterName: string;
region: string;
}
export class SSMParameterReader extends AwsCustomResource {
constructor(scope: Construct,name: string,props: SSMParameterReaderProps) {
const { parameterName,region } = props;
const ssmAwsSdkCall: AwsSdkCall = {
service: 'SSM',action: 'getParameter',parameters: {
Name: parameterName
},region,physicalResourceId: {id:Date.now().toString()} // Update physical id to always fetch the latest version
};
super(scope,name,{ onUpdate: ssmAwsSdkCall,policy:{
statements:[new iam.PolicyStatement({
resources : ['*'],actions : ['ssm:GetParameter'],effect:iam.Effect.ALLOW,}
)]
}});
}
public getParameterValue(): string {
return this.getResponseField('Parameter.Value').toString();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。