【问题标题】:CDK to enable DNS resolution for VPCPeeringCDK 为 VPCPeering 启用 DNS 解析
【发布时间】:2021-03-20 15:24:04
【问题描述】:

我有 VPC 对等互连以将一个 aws 帐户中的 lambda 连接到另一个 aws 帐户中的 RDS 实例。这可以正常工作,但需要 VPC 对等互连启用 DNS 解析选项。

默认情况下,DNS 解析设置为: 从接受者 VPC 到私有 IP 的 DNS 解析:已禁用。

这可以通过 AWS 控制台和 CLI 完成。我无法使用 AWS CDK 实现相同的目标。
https://docs.aws.amazon.com/vpc/latest/peering/modify-peering-connections.html

CfnVPCPeeringConnection 似乎没有这个选项。 https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ec2.CfnVPCPeeringConnection.html

还有其他方法可以通过 CDK 实现吗?

  const cfnVPCPeeringConnection :CfnVPCPeeringConnection  =
    new CfnVPCPeeringConnection(
        stack,
        "vpcPeeringId",
        {
            peerVpcId : "<vpcId of acceptor account>",
            vpcId :  "<reference of the Id>",
            peerOwnerId : "<aws acc number>",
            peerRegion : "<region>",
            peerRoleArn :"<arn created in the acceptor account>"",
        }
    );
    
    //update route tables
    rdsConnectorVpc.isolatedSubnets.forEach(({ routeTable: { routeTableId } }, index) => {
        new CfnRoute(this.parentStack, 'PrivateSubnetPeeringConnectionRoute' + index, {
            destinationCidrBlock: '<CIDR>',
            routeTableId,
            vpcPeeringConnectionId: cfnVPCPeeringConnection.ref,
        })
    });

【问题讨论】:

    标签: amazon-web-services amazon-vpc aws-cdk


    【解决方案1】:

    您可以使用 AWS CDK 中的 CustomResource 构造来实现它:

    import * as cdk from "@aws-cdk/core";
    import ec2 = require("@aws-cdk/aws-ec2");
    import iam = require("@aws-cdk/aws-iam");
    import { AwsCustomResource, AwsCustomResourcePolicy, AwsSdkCall, PhysicalResourceId } from "@aws-cdk/custom-resources";
    import { RetentionDays } from "@aws-cdk/aws-logs";
    
    export interface AllowVPCPeeringDNSResolutionProps {
        vpcPeering: ec2.CfnVPCPeeringConnection,
    }
    
    export class AllowVPCPeeringDNSResolution extends cdk.Construct {
    
        constructor(scope: cdk.Construct, id: string, props: AllowVPCPeeringDNSResolutionProps) {
            super(scope, id);
    
            const onCreate:AwsSdkCall = {
                service: "EC2",
                action: "modifyVpcPeeringConnectionOptions",
                parameters: {
                    VpcPeeringConnectionId: props.vpcPeering.ref, 
                    AccepterPeeringConnectionOptions: {
                        AllowDnsResolutionFromRemoteVpc: true,
                    },
                    RequesterPeeringConnectionOptions: {
                        AllowDnsResolutionFromRemoteVpc: true
                    }
                },
                physicalResourceId: PhysicalResourceId.of(`allowVPCPeeringDNSResolution:${props.vpcPeering.ref}`)
            };
            const onUpdate = onCreate;
            const onDelete:AwsSdkCall = {
                service: "EC2",
                action: "modifyVpcPeeringConnectionOptions",
                parameters: {
                    VpcPeeringConnectionId: props.vpcPeering.ref, 
                    AccepterPeeringConnectionOptions: {
                        AllowDnsResolutionFromRemoteVpc: false,
                    },
                    RequesterPeeringConnectionOptions: {
                        AllowDnsResolutionFromRemoteVpc: false
                    }
                },
            };
    
            const customResource = new AwsCustomResource(this, "allow-peering-dns-resolution", {
                policy: AwsCustomResourcePolicy.fromStatements([
                    new iam.PolicyStatement({
                        effect: iam.Effect.ALLOW,
                        resources: ["*"],
                        actions: [
                            "ec2:ModifyVpcPeeringConnectionOptions",
                        ]
                    }),
                ]),
                logRetention: RetentionDays.ONE_DAY,
                onCreate,
                onUpdate,
                onDelete,
            });
    
            customResource.node.addDependency(props.vpcPeering);
    
        }
    }
    

    并像这样使用它:

    [...]
    
    const peerConnection = new ec2.CfnVPCPeeringConnection(this, "peerConnection", {
        vpcId: destinationVPC.vpcId,
        peerVpcId: lambdaVPCToDestinationVPC.vpcId,
    });
    
    new AllowVPCPeeringDNSResolution(this, "peerConnectionDNSResolution", {
        vpcPeering: peerConnection,
    });
    
    [...]
    
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2010-09-18
    • 2018-09-13
    • 2017-05-21
    相关资源
    最近更新 更多