Posso replicare il comportamento DependsOn in AWS CDK?

Aug 21 2020

Utilizzando AWS CDK (python), sto creando un VPC con sottoreti isolate e una serie di endpoint di interfaccia.

Sto anche lanciando un notebook Sagemaker con un repository Codecommit associato

Creo l'endpoint di interfaccia per Codecommit e Git Codecommit, ma gli endpoint di interfaccia vengono ancora creati quando il mio notebook Sagemaker inizia a essere distribuito, pertanto lo stack Cloudformation non riesce con un errore

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

Se commento il mio notebook Sagemaker, run cdk deploy myStack, l'endpoint viene creato, quindi posso rimuovere il commento dal mio notebook, si avvia senza alcun problema poiché gli endpoint dell'interfaccia Codecommit esistono già.

C'è un modo nel CDK per aggiungere a DependsOnuna risorsa che creo usando il CDK?

Codice pertinente di seguito

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]
        )

Risposte

2 MauricioKlein Oct 14 2020 at 16:14

Non sono sicuro di come sia la sintassi per Python, dal momento che utilizzo Typescript per CDK, ma alla fine i costrutti CDK si risolvono nelle risorse CloudFormation, quindi è effettivamente possibile.

Ecco un esempio usando Typescript:

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

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

Quindi, dopo aver capito come accedere al nodo interno dal costrutto CDK, è piuttosto semplice