Как импортировать группу безопасности из другого стека, используя #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.
Может ли кто-нибудь помочь мне с этой ситуацией?
4 ответа
Вы можете напрямую ссылаться на ресурсы кросс-стека в приложении.
Ниже приведен фрагмент кода,
export class InfraCdkStack extends cdk.Stack {
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
// create a vpc in two AZs
this.vpc = new ec2.Vpc(this, 'MyVPC');
}
}
interface ECSStackProps extends cdk.StackProps {
vpc: ec2.IVpc;
}
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');
const gameECSStack = new ECSCdkStack(app, 'ECSCdkStack', {
vpc: infraStack.vpc
});
Предполагая, что рассматриваемые стеки находятся в вашем приложении CDK, вы можете использовать выходы стека для совместного использования ресурсов.
Документы здесь: https://docs.aws.amazon.com/cdk/api/latest/docs/core-readme.html
Я нашел этот пост в блоге полезным в качестве примера (не написано мной)
Он должен работать для любого ресурса, на который вы можете ссылаться между стеками.
РЕДАКТИРОВАТЬ: Это то, с чем я работаю в данный момент.
// 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'));
Единственная заранее известная вещь - это имя параметра, который вы выводите.
Фактически это то же самое, что вы указали в другом ответе, но CDK записывает Fn.importValue
для тебя.
Предупреждение: не работает с ресурсами в стеках, которые находятся в разных регионах. Ограничение накладывается CloudFormation и также произойдет в ответе @Kane.
Создайте пример группы безопасности в СТЕКЕ A.
const sampleSecurityGroup = new ec2.SecurityGroup(this, 'security-group', { vpc: vpc, allowAllOutbound: true, description: 'Security Group Sample', securityGroupName: "SAMPLE-SG" });
Экспортируйте SG, используя приведенный ниже текст в STACK A.
const myoutput = new cdk.CfnOutput(this, 'Security-group-id-output', { description: 'Security group in Stack A', exportName: 'security-id-output', value: sampleSecurityGroup.securityGroupId });
Проверьте службу формирования облака в пользовательском интерфейсе, вы должны увидеть экспорт с именем «security-id-output».
В STACK B импортируйте значение, используя
cdk.Fn.importValue("security-id-output");
Вы могли бы использовать SecurityGroup.export
в стеке, который изначально определяет группу безопасности, и это создаст стек Output
сгенерированным именем экспорта и верните данные, которые вам нужно передать SecurityGroupRef.import
чтобы получить ссылку на группу безопасности в другом стеке.
Вы должны быть уверены, что сначала развернете стек, который определяет группу безопасности, так как в противном случае другой стек не сможет импортировать данные из этого стека.