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?
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:En este código actualizado, la función
Fn.sub
se llama dentro del atributoenvironment
del objetobundling
, 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 propiedadesrestApiId
,region
ystageName
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.