我需要创建一个 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
....
谢谢!