我也有同样的问题。我花了几天的时间在这上面,我认为couldFormatoin的AWS::CodeDeploy::DeploymentGroup有问题
我在s3://my-backet-for-lambda-deployment/appspec.yaml 中有这个 yaml 文件:
appspec.yaml
version: 0.0
Resources:
- my-lambda-app-MyLambdaApp-157EXYJT40C0U:
Type: AWS::Lambda::Function
Properties:
Name: arn:aws:lambda:us-east-1:292285124316:function:my-lambda-app-MyLambdaApp-157EXYJT40C0U
Alias: production
CurrentVersion: 8
TargetVersion: 9
appspec.yaml 是正确的,因为我可以使用控制台手动指定它在 S3 中的位置,并且一切正常。所以我完全确定appspec.yaml 没有错在这里。
问题
我用下面AWS::CodeDeploy::DeploymentGroup
MyDeploymentGroup:
Type: AWS::CodeDeploy::DeploymentGroup
Properties:
ApplicationName: !Ref MyCodeDeployApp
Deployment:
IgnoreApplicationStopFailures: false
Revision:
RevisionType: S3
S3Location:
Bucket: my-backet-for-lambda-deployment
Key: appspec.yaml
BundleType: YAML
DeploymentConfigName: CodeDeployDefault.LambdaAllAtOnce
DeploymentStyle:
DeploymentOption: WITH_TRAFFIC_CONTROL
DeploymentType: BLUE_GREEN
ServiceRoleArn: !ImportValue MyCodeDeployRoleArn
上述资源的堆栈创建失败,无法指定属性部署。
解决方法
我找不到任何纯粹基于 CloudFormatoin 的解决方案。所以我所做的是创建DeploymentGroup而不定义Deployment,然后使用CLI或boto3开始部署。
Resources:
MyCodeDeployApp:
Type: AWS::CodeDeploy::Application
Properties:
ComputePlatform: Lambda
# DeploymentGroup without Deployment property
MyDeploymentGroup:
Type: AWS::CodeDeploy::DeploymentGroup
Properties:
ApplicationName: !Ref MyCodeDeployApp
DeploymentConfigName: CodeDeployDefault.LambdaAllAtOnce
DeploymentStyle:
DeploymentOption: WITH_TRAFFIC_CONTROL
DeploymentType: BLUE_GREEN
ServiceRoleArn: !ImportValue MyCodeDeployRoleArn
Outputs:
CodeDeployAppName:
Value: !Ref MyCodeDeployApp
DeploymentGroupName:
Value: !Ref MyDeploymentGroup
创建堆栈后,我可以使用 bash 开始部署:
aws deploy create-deployment \
--application-name ${deployment_app_name} \
--deployment-group-name ${deployment_group_name} \
--s3-location bucket=my-backet-for-lambda-deployment,bundleType=YAML,key=appspec.yaml
附言
MyCodeDeployRoleArn 角色也是正确的,所以也不是它的错:
Resources:
MyCodeDeployServiceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal: {Service: [codedeploy.amazonaws.com]}
Action: ['sts:AssumeRole']
Description: Role for deploying lambda
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSCodeDeployRoleForLambda
Policies:
- PolicyName: MyS3GetObjectPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- s3:Get*
- s3:List*
Resource: '*'
Outputs:
CodeDeployRoleArn:
Value: !GetAtt MyCodeDeployServiceRole.Arn
Export:
Name: MyCodeDeployRoleArn