3

我需要创建一个 VPC 端点和一个 ALB 来定位 CDK 中的 VPC 端点。

我发现 InterfaceVpcEndpoint 可以返回 vpcEndpointNetworkInterfaceIds 属性。因此,似乎缺少的部分是如何以 CDK 方式从这些 ENI ID 获取私有 IP 地址。

我发现 CDK 有一个自定义资源包,它的示例显示我可以使用 AwsCustomResource 调用 AWS API (EC2/DescribeNetworkInterfaces) 来获取 IP 地址。

我尝试编写如下自定义资源:

eni = AwsCustomResource(
        self, 'DescribeNetworkInterfaces',
        on_create=custom_resources.AwsSdkCall(
            service='ec2',
            action='describeNetworkInterfaces',
            parameters= {
                'NetworkInterfaceId.N': [eni_id]
            },
            physical_resource_id=str(time.time())
        )
    )
ip = eni.get_data('NetworkInterfaces.0.PrivateIpAddress')

并将 ip 传递给 elbv2.IPTarget。

但似乎我错过了一些东西,所以它抱怨它需要一个标量而不是引用?

(.env) ➜  base-stack (master) ✔ cdk synth base --no-staging > template.yaml
jsii.errors.JavaScriptError: 
  Error: Expected Scalar, got {"$jsii.byref":"@aws-cdk/core.Reference@10015"}
      at Object.deserialize (/Volumes/DATA/ci/aws/base-stack/.env/lib/python3.7/site-packages/jsii/_embedded/jsii/jsii-runtime.js:12047:23)
      at Kernel._toSandbox (/Volumes/DATA/ci/aws/base-stack/.env/lib/python3.7/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7031:61)
      at /Volumes/DATA/ci/aws/base-stack/.env/lib/python3.7/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7084:33
      at Array.map (<anonymous>)
      at Kernel._boxUnboxParameters (/Volumes/DATA/ci/aws/base-stack/.env/lib/python3.7/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7084:19)
      at Kernel
....

谢谢!

4

1 回答 1

2

AwsCustomResource.get_data-method 返回一个 Reference 对象,这会导致问题。要获取 CloudFormation 令牌 (!GetAtt "DescribeNetworkInterfaces"."NetworkInterfaces.0.PrivateIpAddress"),必须显式使用Reference.to_string方法。

这个:

ip = eni.get_data('NetworkInterfaces.0.PrivateIpAddress')

变成:

ip = eni.get_data('NetworkInterfaces.0.PrivateIpAddress').to_string()
于 2019-12-05T02:49:44.547 回答