是否可以将外部构建命令作为CDK堆栈序列的一部分来运行?意图 1)创建一个 rest API,2)将 rest URL 写入配置文件,3)构建并部署一个 React 应用。
import apigateway = require('@aws-cdk/aws-apigateway');
import cdk = require('@aws-cdk/core');
import fs = require('fs')
import s3deployment = require('@aws-cdk/aws-s3-deployment');
export class MyStack extends cdk.Stack {
const restApi = new apigateway.RestApi(this, ..);
fs.writeFile('src/app-config.json',
JSON.stringify({ "api": restApi.deploymentStage.urlForPath('/myResource') }))
// TODO locally run 'npm run build', create 'build' folder incl rest api config
const websiteBucket = new s3.Bucket(this, ..)
new s3deployment.BucketDeployment(this, .. {
sources: [s3deployment.Source.asset('build')],
destinationBucket: websiteBucket
})
}
遗憾的是,这是不可能的,因为必要的引用只有在部署之后才能获得,因此在你尝试写文件之后(该文件将含有 CDK代币).
我个人解决这个问题的方法是让cdk把apigateway的URL输出到一个文件中,然后再进行解析。之后 的deploy来上传,这样一个S3 bucket,做到这一点你需要。
cdk deploy -O ./cdk.out/deploy-output.json
./cdk.out/deploy-output.json
你会发现一个JSON对象,它带有每个产生输出的堆栈的密钥(例如,你的堆栈包含一个API网关)。当然,你在自定义脚本中还有最后的步骤,这意味着你必须将你的 cdk deploy
. 我建议用nodejs脚本来做,这样就可以利用aws-sdk轻松的把你的文件上传到S3。
接受cdk不支持这一点,我把逻辑分成了两个cdk脚本,通过cli访问API网关URL作为cdk输出,然后用bash脚本包装一切。
AWS CDK。
// API gateway
const api = new apigateway.RestApi(this, 'my-api', ..)
// output url
const myResourceURL = api.deploymentStage.urlForPath('/myResource');
new cdk.CfnOutput(this, 'MyRestURL', { value: myResourceURL });
Bash脚本
# deploy api gw
cdk deploy --app (..)
# read url via cli with --query
export rest_url=`aws cloudformation describe-stacks --stack-name (..) --query "Stacks[0].Outputs[?OutputKey=='MyRestURL'].OutputValue" --output text`
# configure React app
echo "{ \"api\" : { \"invokeUrl\" : \"$rest_url\" } }" > src/app-config.json
# build React app with url
npm run build
# run second cdk app to deploy React built output folder
cdk deploy --app (..)
有没有更好的方法?