我使用LocalStack和CDK在我的机器上进行本地测试。我正在使用cli工具cdklocal
(由localstack提供)将我的cdk堆栈转换为localstack。
我试图创建一个s3桶作为一个静态网站和部署内容到它。下面是我的cdk堆栈:
const bucket = new s3.Bucket(this, 'bucket', {
websiteIndexDocument: 'index.html',
publicReadAccess: true,
removalPolicy: RemovalPolicy.DESTROY,
});
new s3deploy.BucketDeployment(this, 'website', {
sources: [s3deploy.Source.asset('./app/build')],
destinationBucket: bucket
});
它应该创建一个bucket,然后将./app/build
的内容部署到该bucket。当我使用cdk deploy
部署到我的AWS帐户时,这工作得很好。但是,当我使用cdklocal deploy
部署到localstack时,创建了桶,但./app/build
的内容不在桶中。
如何使用localstack托管使用cdk的静态网站?
我也有这个问题。深入研究s3deploy的方式。BucketDeployment工作,似乎AWS中的CloudFormation必须用某种事件触发部署lambda,而在localstack中这一步不会发生。
查看部署lambda周围的日志,事件看起来有这样的形状:
{
"RequestType": "Create",
"ServiceToken": "arn:aws:lambda:eu-west-1: 000000000000:function:localEnvironmentStack-CustomCDKBucketDeploymen-123abc456",
"StackId": "arn:aws:cloudformation:eu-west-1: 000000000000:stack/localEnvironmentStack/123456-abcdef-123456",
"RequestId": "123456-abcdef-123456",
"LogicalResourceId": "localClientDeploymentCustomResourceABCD1234",
"ResourceType": "Custom: :CDKBucketDeployment",
"ResourceProperties": {
"ServiceToken": "arn:aws:lambda:eu-west-1: 000000000000:function:localEnvironmentStack-CustomCDKBucketDeploymen-6789defgh",
"Prune": "true",
"SystemMetadata": {
"acl": "public-read"
},
"SourceBucketNames": [
"cdk-abcdefgh-assets-000000000000-eu-west-1"
],
"DestinationBucketName": "my-local-bucket",
"DestinationBucketKeyPrefix": "local/",
"SourceObjectKeys": [
"123456789abcdefghijklmnopqrstuvwxyz.zip"
]
},
"ResponseURL": "http://somecloudfrontURL.com"
}
我发现,通过使用awslocal.
下载部署的模板,awslocal cloudformation get-template --stack-name localEnvironmentStack --region eu-west-1
然后将我的一些堆栈属性映射到事件字段中,然后将其发送到本地堆栈,将我的工件部署到s3。您可以像这样在本地stacklambda中运行事件:
awslocal lambda invoke
--function-name localEnvironmentStack-CustomCDKBucketDeploymen-123abc456
--cli-binary-format raw-in-base64-out
--invocation-type Event
--payload '{"RequestType":"Create","ServiceToken":"arn:aws:lambda:eu-west-1: 000000000000:function:localEnvironmentStack-CustomCDKBucketDeploymen-123abc456","StackId":"arn:aws:cloudformation:eu-west-1: 000000000000:stack/localEnvironmentStack/123456-abcdef-123456","RequestId":"123456-abcdef-123456","LogicalResourceId":"localClientDeploymentCustomResourceABCD1234","ResourceType":"Custom: :CDKBucketDeployment","ResourceProperties":{"ServiceToken":"arn:aws:lambda:eu-west-1: 000000000000:function:localEnvironmentStack-CustomCDKBucketDeploymen-6789defgh","Prune":"true","SystemMetadata":{"acl":"public-read"},"SourceBucketNames":["cdk-abcdefgh-assets-000000000000-eu-west-1"],"DestinationBucketName":"my-local-bucket","DestinationBucketKeyPrefix":"local/","SourceObjectKeys":["123456789abcdefghijklmnopqrstuvwxyz.zip"]},"ResponseURL":"http://somecloudfrontURL.com"}'
response.json
我接下来的步骤是自动化这个,以便在cdklocal部署到localstack之后,我可以模拟部署期间CloudFormation必须触发的部署事件。我还会在localstack的问题中提出这个问题。