Dapatkah saya mereplikasi perilaku DependsOn di AWS CDK?

Aug 21 2020

Dengan menggunakan AWS CDK (python), saya membuat VPC dengan subnet terisolasi, dan sejumlah titik akhir Antarmuka.

Saya juga meluncurkan notebook Sagemaker dengan repo Codecommit terkait

Saya membuat titik akhir Antarmuka untuk Codecommit serta Git Codecommit, tetapi titik akhir antarmuka masih dibuat ketika notebook Sagemaker saya mulai digunakan, oleh karena itu tumpukan Cloudformation gagal dengan kesalahan

fatal: unable to access 'https://git-codecommit.us-east-1.amazonaws.com/v1/repos/SomeRepo/': Failed to connect to git-codecommit.us-east-1.amazonaws.com port 443: Connection timed out

Jika saya mengomentari buku catatan Sagemaker saya, jalankan cdk deploy myStack, titik akhir dibuat, lalu saya dapat menghapus komentar buku catatan saya, itu diluncurkan tanpa masalah karena titik akhir antarmuka Codecommit sudah ada.

Apakah ada cara di CDK untuk menambahkan DependsOnsumber daya yang saya buat menggunakan CDK?

Kode yang relevan di bawah ini

from aws_cdk import (
    core,
    aws_sagemaker as sagemaker,
    aws_iam as iam,
    aws_ec2 as ec2
)

class SagemakerStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, bucket, repo, **kwargs) -> None:  # repo is passed with the codecommit repo I created in a previous stack
        super().__init__(scope, id, **kwargs)

        self.sagemaker_vpc = ec2.Vpc(
            # Leaving out some details
            self, "SagemakerVPC",
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    subnet_type=ec2.SubnetType.ISOLATED,  # <-- Isolated, therefore need interface endpoints
                    name="IsolatedA",
                    cidr_mask=24
                )
            ]
        )

        self.sagemaker_vpc.add_interface_endpoint(
            "GitCodecommitInterface",
            service=ec2.InterfaceVpcEndpointAwsService.CODECOMMIT_GIT  # Needed to be created before I can create notebook
        )


        sagemaker_role = iam.Role()  # Hiding details
        sagemaker_repo = sagemaker.CfnCodeRepository()  # hiding details
        sagemaker_sg = ec2.SecurityGroup()  # Hiding details

        # Need for this to wait until GitCodecommitInterface has been created
        notebook = sagemaker.CfnNotebookInstance(
            self, "MyNotebook",
            instance_type="ml.t3.medium",
            role_arn=sagemaker_role.role_arn,
            default_code_repository=repo.repository_clone_url_http,
            subnet_id=self.sagemaker_vpc.isolated_subnets[0].subnet_id,
            direct_internet_access="Disabled",
            security_group_ids=[sagemaker_sg.security_group_id]
        )

Jawaban

2 MauricioKlein Oct 14 2020 at 16:14

Tidak yakin bagaimana sintaks untuk Python, karena saya menggunakan Typecript untuk CDK, tetapi konstruksi CDK diselesaikan di sumber daya CloudFormation pada akhirnya, jadi sebenarnya mungkin.

Berikut adalah contoh menggunakan Ketikan:

const x = new apigateway.LambdaRestApi(this, "apigw", {...})
const y = new lambda.Function(this, "lambda", {...})

// Y will be deployed before X
x.node.addDependency(y)

Jadi, setelah Anda mengetahui cara kami mengakses node dalam dari konstruksi CDK, itu cukup mudah