Как получить PrivateIPAddress конечной точки VPC в CDK?

Мне нужно создать конечную точку VPC и ALB для нацеливания на конечную точку VPC в CDK.

Я обнаружил, что InterfaceVpcEndpoint может возвращать атрибут vpcEndpointNetworkInterfaceIds. Таким образом, похоже, что отсутствует часть, как получить частный IP-адрес из этих идентификаторов ENI с помощью CDK.

Я обнаружил, что CDK имеет пакет настраиваемых ресурсов, его пример показывает, что я могу использовать AwsCustomResource для вызова API AWS (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
....

Спасибо!


person Jonny    schedule 30.07.2019    source источник


Ответы (1)


Метод AwsCustomResource.get_data возвращает объект 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()
person Laurens Knoll    schedule 05.12.2019