如何使用#AWS-CDK 从另一个堆栈导入安全组?
How to Import Security group from another stack using #AWS-CDK?
我想知道如何导入另一个堆栈中定义的安全组,然后在当前堆栈中使用。
到目前为止我已经试过了..
class relayStack extends cdk.Stack {
public sg_relay: ec2.SecurityGroupRefProps
constructor(parent: cdk.App, name: string, props: VPCProps) {
super(parent, name, props);
//#IMPORT VPC PROPS
const vpc = ec2.VpcNetwork.import(this, 'VPC-Hottest100', props.infra.vpc);
//#AUTOSCALING GROUP
const asg_relayServer = new ec2.AutoScalingGroup(this, 'ASG_Relay', {
vpc,
instanceType: new ec2.InstanceTypePair(ec2.InstanceClass.T2, ec2.InstanceSize.Small),
minSize: 1,
maxSize: 3,
desiredCapacity: 1,
machineImage: new ec2.GenericLinuxImage({
"ap-southeast-2": "ami-dc361ebf",
}),
keyName: 'icecast-poc',
allowAllOutbound: false,
vpcPlacement: {
usePublicSubnets: false
}
});
//#SECURITY Group
const sg_relay = new ec2.SecurityGroup(this, 'SG_RELAY', {
vpc,
description: "Relay stack security group",
groupName: 'relay-sg'
})
this.sg_relay = sg_relay
}
}
然后我想从另一个堆栈访问导出的安全组sg_relay
我试过关注
//#SECURITY GROUP
const sg_nginx = new ec2.SecurityGroup(this, "SG_NGINX", {
vpc,
description: "NGINX stack security group",
groupName: 'nginx-sg'
})
const sg_relayImp = new ec2.SecurityGroupRef(this, "SG_RELAY_IMP", {
securityGroupId: new ec2.SecurityGroupId('SG_RELAY')
})
然后使用如下
sg_nginx.addIngressRule(sg_relayImp, wowzaPort, 'asg_RelyToNgn_8000')
显然它不适合我。
我找不到堆栈之间安全组的任何导入函数,就像 vpc 有一个。
谁能帮我解决这个问题?
您可以在最初定义安全组的堆栈中使用 SecurityGroup.export
,这将创建一个堆栈 Output
,其中包含生成的导出名称,以及 return 您创建的数据需要传递给 SecurityGroupRef.import
以获取对其他堆栈中安全组的引用。
您需要确保首先部署定义安全组的堆栈,否则其他堆栈将无法从该堆栈的输出中导入。
假设有问题的Stacks都在你的CDK Application下,你可以使用Stack Outputs来共享资源。
文档在这里:https://docs.aws.amazon.com/cdk/api/latest/docs/core-readme.html#stack-outputs
我发现 this blog post 作为示例很有用(不是我写的)
它应该适用于您可能希望在堆栈之间引用的任何资源。
编辑:这就是我目前正在处理的内容。
// I have a resource which is a cloudfront dist id in StackA
new cdk.CfnOutput(this, 'cloudfront-dist-id-output', {
description: 'cloudfront-dist-id-output',
exportName: 'cloudfront-dist-id-output',
value: cloudFrontDistribution.distributionId
});
// Stack B needs the DistributionId (it's dynamic), so I pass it in as a parameter.
new StackB(app, 'StackB', Fn.importValue('cloudfront-dist-id-output'));
提前唯一 'known' 是您要输出的参数的名称。
这实际上与您在其他答案中提供的内容相同,但 CDK 会为您编写 Fn.importValue
。
警告:不适用于位于不同区域的堆栈中的资源。该限制由 CloudFormation 强加,也会出现在@Kane 的回答中。
您可以在应用中直接引用跨栈资源
下面是一段代码,
export class InfraCdkStack extends cdk.Stack {
// Create a readonly property to reference on an instance.
readonly vpc: ec2.IVpc;
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here.
// Assign your vpc to your previously created property.
// Creates a vpc in two AZs.
this.vpc = new ec2.Vpc(this, 'MyVPC');
}
}
// Create an interface to hold the vpc information.
interface ECSStackProps extends cdk.StackProps {
vpc: ec2.IVpc;
}
// Have your class constructor accept the interface.
export class ECSCdkStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props: ECSStackProps) {
super(scope, id, props);
}
const app = new cdk.App();
const infraStack = new InfraCdkStack(app, 'InfraCdkStack');
// Pass the infraStack.vpc property to the ECSCdkStack class.
const gameECSStack = new ECSCdkStack(app, 'ECSCdkStack', {
vpc: infraStack.vpc
});
有an example in official doc to demonstrate how sharing s3 bucket.
在堆栈 A 中创建这样的示例安全组。
const sampleSecurityGroup = new ec2.SecurityGroup(this, 'security-group', { vpc: vpc, allowAllOutbound: true, description: 'Security Group Sample', securityGroupName: "SAMPLE-SG" });
使用下面的 STACK A 导出 SG。
const myoutput = new cdk.CfnOutput(this, 'Security-group-id-output', { description: 'Security group in Stack A', exportName: 'security-id-output', value: sampleSecurityGroup.securityGroupId });
检查 UI 中的云形成服务,您应该会看到名为“security-id-output”的导出。
在堆栈 B 中使用
导入值
cdk.Fn.importValue("security-id-output");
我想知道如何导入另一个堆栈中定义的安全组,然后在当前堆栈中使用。
到目前为止我已经试过了..
class relayStack extends cdk.Stack {
public sg_relay: ec2.SecurityGroupRefProps
constructor(parent: cdk.App, name: string, props: VPCProps) {
super(parent, name, props);
//#IMPORT VPC PROPS
const vpc = ec2.VpcNetwork.import(this, 'VPC-Hottest100', props.infra.vpc);
//#AUTOSCALING GROUP
const asg_relayServer = new ec2.AutoScalingGroup(this, 'ASG_Relay', {
vpc,
instanceType: new ec2.InstanceTypePair(ec2.InstanceClass.T2, ec2.InstanceSize.Small),
minSize: 1,
maxSize: 3,
desiredCapacity: 1,
machineImage: new ec2.GenericLinuxImage({
"ap-southeast-2": "ami-dc361ebf",
}),
keyName: 'icecast-poc',
allowAllOutbound: false,
vpcPlacement: {
usePublicSubnets: false
}
});
//#SECURITY Group
const sg_relay = new ec2.SecurityGroup(this, 'SG_RELAY', {
vpc,
description: "Relay stack security group",
groupName: 'relay-sg'
})
this.sg_relay = sg_relay
}
}
然后我想从另一个堆栈访问导出的安全组sg_relay
我试过关注
//#SECURITY GROUP
const sg_nginx = new ec2.SecurityGroup(this, "SG_NGINX", {
vpc,
description: "NGINX stack security group",
groupName: 'nginx-sg'
})
const sg_relayImp = new ec2.SecurityGroupRef(this, "SG_RELAY_IMP", {
securityGroupId: new ec2.SecurityGroupId('SG_RELAY')
})
然后使用如下
sg_nginx.addIngressRule(sg_relayImp, wowzaPort, 'asg_RelyToNgn_8000')
显然它不适合我。
我找不到堆栈之间安全组的任何导入函数,就像 vpc 有一个。
谁能帮我解决这个问题?
您可以在最初定义安全组的堆栈中使用 SecurityGroup.export
,这将创建一个堆栈 Output
,其中包含生成的导出名称,以及 return 您创建的数据需要传递给 SecurityGroupRef.import
以获取对其他堆栈中安全组的引用。
您需要确保首先部署定义安全组的堆栈,否则其他堆栈将无法从该堆栈的输出中导入。
假设有问题的Stacks都在你的CDK Application下,你可以使用Stack Outputs来共享资源。
文档在这里:https://docs.aws.amazon.com/cdk/api/latest/docs/core-readme.html#stack-outputs
我发现 this blog post 作为示例很有用(不是我写的)
它应该适用于您可能希望在堆栈之间引用的任何资源。
编辑:这就是我目前正在处理的内容。
// I have a resource which is a cloudfront dist id in StackA
new cdk.CfnOutput(this, 'cloudfront-dist-id-output', {
description: 'cloudfront-dist-id-output',
exportName: 'cloudfront-dist-id-output',
value: cloudFrontDistribution.distributionId
});
// Stack B needs the DistributionId (it's dynamic), so I pass it in as a parameter.
new StackB(app, 'StackB', Fn.importValue('cloudfront-dist-id-output'));
提前唯一 'known' 是您要输出的参数的名称。
这实际上与您在其他答案中提供的内容相同,但 CDK 会为您编写 Fn.importValue
。
警告:不适用于位于不同区域的堆栈中的资源。该限制由 CloudFormation 强加,也会出现在@Kane 的回答中。
您可以在应用中直接引用跨栈资源
下面是一段代码,
export class InfraCdkStack extends cdk.Stack {
// Create a readonly property to reference on an instance.
readonly vpc: ec2.IVpc;
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here.
// Assign your vpc to your previously created property.
// Creates a vpc in two AZs.
this.vpc = new ec2.Vpc(this, 'MyVPC');
}
}
// Create an interface to hold the vpc information.
interface ECSStackProps extends cdk.StackProps {
vpc: ec2.IVpc;
}
// Have your class constructor accept the interface.
export class ECSCdkStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props: ECSStackProps) {
super(scope, id, props);
}
const app = new cdk.App();
const infraStack = new InfraCdkStack(app, 'InfraCdkStack');
// Pass the infraStack.vpc property to the ECSCdkStack class.
const gameECSStack = new ECSCdkStack(app, 'ECSCdkStack', {
vpc: infraStack.vpc
});
有an example in official doc to demonstrate how sharing s3 bucket.
在堆栈 A 中创建这样的示例安全组。
const sampleSecurityGroup = new ec2.SecurityGroup(this, 'security-group', { vpc: vpc, allowAllOutbound: true, description: 'Security Group Sample', securityGroupName: "SAMPLE-SG" });
使用下面的 STACK A 导出 SG。
const myoutput = new cdk.CfnOutput(this, 'Security-group-id-output', { description: 'Security group in Stack A', exportName: 'security-id-output', value: sampleSecurityGroup.securityGroupId });
检查 UI 中的云形成服务,您应该会看到名为“security-id-output”的导出。
在堆栈 B 中使用
导入值cdk.Fn.importValue("security-id-output");