es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando el empaquetador AWS CDK con atributos de URL resueltos.

Estoy usando el paquete CDK para crear mis archivos estáticos (HTML, JavaScript) y subirlos a un cubo S3 que es parte de mi implementación. Sin embargo, mis archivos de origen necesitan conocer la URL final en la que se implementarán, ya que esto afectará a las URL internas. Por lo tanto, intento pasar una variable de entorno derivada de la URL de API Gateway.

const api = new apigateway.RestApi(this, ‘restApi’);
const staticRoute = api.root.addResource(‘static’);
new s3deploy.BucketDeployment(this, ‘DeployWebsite’, {
sources: [s3deploy.Source.asset(“./path/to/source/files”, {
bundling: {
image: cdk.DockerImage.fromRegistry(“node:latest”),
command: [
‘bash’, ‘-c’, cd /asset-input \
&& npm install \
&& npm run build \
&& mv build/* /asset-output
,
],
environment: {
‘PUBLIC_URL’: api.urlForPath(staticRoute.path)
}
},
})],
destinationBucket: this.websiteBucket,
});

Sin embargo, en la práctica, este código no funciona, porque simplemente interpola los tokens de CloudFormation en la variable “PUBLIC_URL”, y obtengo algo como ‘https://${Token[TOKEN.380]}.execute-api.us-east-1.${Token[AWS.URLSuffix.10]}/${Token[TOKEN.399]}/static/’, que obviamente no funcionará. ¿Cómo puedo resolver estos tokens a cadenas reales en tiempo de compilación, que es cuando se compila mi contenido estático?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver los tokens de CloudFormation y obtener los componentes de cadena reales en tiempo de compilación, puede utilizar la función Fn.sub que le permite sustituir variables dentro de cadenas utilizando mapeos de CloudFormation. Puede modificar el código de la siguiente manera:

    const api = new apigateway.RestApi(this, 'restApi');
    const staticRoute = api.root.addResource('static');
    
    new s3deploy.BucketDeployment(this, 'DeployWebsite', {
        sources: [s3deploy.Source.asset("./path/to/source/files", {
            bundling: {
                image: cdk.DockerImage.fromRegistry("node:latest"),
                command: [
                    'bash', '-c', `
                        cd /asset-input
                        && npm install
                        && npm run build
                        && mv build/* /asset-output
                    `,
                ],
                environment: {
                    'PUBLIC_URL': cdk.Fn.sub('https://${api}.execute-api.${region}.amazonaws.com/${stage}${staticRoute.path}', {
                        api: api.restApiId,
                        region: cdk.Stack.of(this).region,
                        stage: api.deploymentStage.stageName,
                    }),
                },
            },
        })],
        destinationBucket: this.websiteBucket,
    });
    

    En este código actualizado, la función Fn.sub se llama dentro del atributo environment del objeto bundling, pasando una cadena con algunos marcadores de posición que serán reemplazados por los valores correctos en tiempo de compilación. Los marcadores de posición ${api}, ${region} y ${stage} se reemplazan por las propiedades restApiId, region y stageName de la instancia de API Gateway, respectivamente.

    Al hacer esto, la variable de entorno PUBLIC_URL ahora debería contener la URL correcta para su API Gateway, que puede ser utilizada por sus archivos de origen para hacer referencia a las URL internas correctamente.

Comments are closed.