我有一个简单的AWS CodePipeline,只需几个步骤。
实际上,我已经尝试了几个小时才能使此F *** CodeDeploy正常工作。 这是不可能的。我不敢相信-.-
因此,我们可以看一下AWS CodeDeploy步骤。错误一定在那里。 我尝试了CodeBuild的不同方案。 输出带有artifacts.zip和appspecs.yml等。
CodeDeploy说:
Action execution failed
BundleType must be either YAML or JSON
由CodePipeline触发时。
我从CodePipeline-S3-Bucket下载文件,该文件是CodeDeploy的输入。 它包含所有需要的文件。
我不知道如何告诉管道使用此appspec.yml。
有趣的是,如果我手动部署它,它可以工作。 因此CodeDeploy无法找到我认为的appspec.yml。
在这里您可以看到。
但是,如果我考虑一下,这没有任何意义。 因为在此应用程序规范编辑器中,我无法指定要部署的ZIP存档的路径。
有人知道如何最后一步吗?
我不敢相信它是如此困难:-D 我能够非常轻松地设置CodeCommit。 使用buildspec.yml,CodeBuild也非常容易。 现在,由于忽略了appspec.yml或类似的内容,我无法部署...
答案 0 :(得分:1)
@Patrick,您好,这听起来有些事。
正如@Putnik提到的那样,应该在图片中选择YAML,但是我认为图片不适合部署问题。
Lambda部署仅需要一个'appspec
文件。因此,除非客户的appspec
位于另一个存储库(S3)中,否则通过控制台进行操作不需要客户添加邮政编码。张贴的图片看起来像您的手动部署测试使用的原始字符串appspec
键入到appspec
文件编辑器中。 (如果要使用.zip
,请将“修订位置”更改为S3选项。)
它无法将.yml
识别为.yaml
。我将对此进行调查。目前,一种解决方法是将文件的扩展名更改为.yaml
。
答案 1 :(得分:0)
答案 2 :(得分:0)
我有同样的问题。我花了几天的时间在此上,我认为CouldFormatoin的AWS::CodeDeploy::DeploymentGroup
我在s3://my-backet-for-lambda-deployment/appspec.yaml
中有这个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
P.S。
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