Как импортировать группу безопасности из другого стека, используя #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 чтобы получить ссылку на группу безопасности в другом стеке.

Вы должны быть уверены, что сначала развернете стек, который определяет группу безопасности, так как в противном случае другой стек не сможет импортировать данные из этого стека.

Другие вопросы по тегам