AWS CDK:在CDK序列中运行外部构建命令?

问题描述 投票:0回答:1

是否可以将外部构建命令作为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
  }) 
}
reactjs amazon-web-services amazon-cloudformation create-react-app aws-cdk
1个回答
1
投票

遗憾的是,这是不可能的,因为必要的引用只有在部署之后才能获得,因此在你尝试写文件之后(该文件将含有 CDK代币).

我个人解决这个问题的方法是让cdk把apigateway的URL输出到一个文件中,然后再进行解析。之后 的deploy来上传,这样一个S3 bucket,做到这一点你需要。

  • 部署与输出文件选项,例如。cdk deploy -O ./cdk.out/deploy-output.json
  • 例如: ./cdk.out/deploy-output.json 你会发现一个JSON对象,它带有每个产生输出的堆栈的密钥(例如,你的堆栈包含一个API网关)。
  • 手动解析JSON,以获得你的apigateway网址
  • 创建你的配置文件并将其上传到S3(你可以通过aws-sdk来完成)。

当然,你在自定义脚本中还有最后的步骤,这意味着你必须将你的 cdk deploy. 我建议用nodejs脚本来做,这样就可以利用aws-sdk轻松的把你的文件上传到S3。


0
投票

接受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 (..)  

有没有更好的方法?

© www.soinside.com 2019 - 2024. All rights reserved.