¿Puedo replicar el comportamiento de DependsOn en AWS CDK?

Aug 21 2020

Usando AWS CDK (python), estoy creando una VPC con subredes aisladas y varios puntos de enlace de interfaz.

También estoy lanzando un cuaderno de Sagemaker con un repositorio de Codecommit asociado

Creo el punto final de la interfaz para Codecommit y Git Codecommit, pero los puntos finales de la interfaz todavía se crean cuando mi computadora portátil Sagemaker comienza a implementarse, por lo tanto, la pila de Cloudformation falla con un error

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

Si comento mi notebook de Sagemaker, ejecuto cdk deploy myStack, se crea el punto de enlace, luego puedo descomentar mi notebook, se inicia sin ningún problema ya que los puntos de enlace de la interfaz de Codecommit ya existen.

¿Hay alguna forma en el CDK de agregar DependsOnun recurso que creo usando el CDK?

Código relevante a continuación

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

Respuestas

2 MauricioKlein Oct 14 2020 at 16:14

No estoy seguro de cómo es la sintaxis para Python, ya que uso Typescript para CDK, pero las construcciones de CDK se resuelven en los recursos de CloudFormation al final, por lo que es realmente posible.

Aquí hay un ejemplo 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)

Entonces, después de descubrir cómo acceder al nodo interno desde la construcción CDK, es bastante sencillo