部署失败,CLI出现AppSpec格式错误,同一文件在控制台中工作



我用以下命令开始CodeDeploy部署:

aws deploy create-deployment --cli-input-json file://create-deployment.json

我的create-deployment.json文件如下所示:

{
"applicationName": "myapp",
"deploymentGroupName": "myapp-test",
"revision": {
"revisionType": "AppSpecContent",
"appSpecContent": {
"content": "appspec.json"
}
}
}

我收到部署ID响应。部署成功启动,但立即失败并出现错误

The deployment failed because the AppSpec file that specifies the deployment configuration is missing or has an invalid configuration. The input AppSpec file is a not well-formed yaml. The template cannot be parsed.

我的appspec文件显然是JSON,而不是YAML。我已经成功地从控制台启动了一个具有相同appspec.json文件的部署,在那里您可以明确地告诉AWS appspec是一个json文件。create-deployment的文档表明JSON文件应该是可接受的。如果您使用的是AppSpecContent而不是S3 Bucket,则没有明确声明appspec文件格式的选项。CodeDeploy似乎无法真正弄清楚它收到的是JSON appspec文件而不是YAML。

我也尝试使用一个YAML文件,但它也失败了,并显示了相同的错误消息。我成功地从控制台开始部署相同的appspec文件(JSON和YAML(。

content需要一个原始JSON或YAML字符串,但您传递的是一个文件名(appspec.json(。这就是部署抛出无法解析模板的错误的原因。无论您使用JSON还是YAML文件作为输入,问题都与预期的原始字符串相同,而不是文件名。这也是为什么与控制台相比,您会看到不同的行为,在控制台中,它会在幕后自动转换为原始字符串。

为了解决您的问题,create-deployment.json的内容应该类似于以下内容:

{
"applicationName": "myapp",
"deploymentGroupName": "myapp-test",
"revision": {
"revisionType": "AppSpecContent",
"appSpecContent": {
"content": "{"Resources":[{"my-function":{"Properties":{"Alias":"my-alias","CurrentVersion":"1","Name":"my-name","TargetVersion":"1"},"Type":"AWS::Lambda::Function"}}],"version":"0.0"}"
}
}
}

在yaml语法中,您可以使用:

aws deploy create-deployment --cli-input-yaml file://create-deployment.yaml

其中create-deployment.yaml将具有以下结构(例如ecs服务(:

applicationName: 'myapp'
deploymentGroupName: 'myapp-test'
revision:
revisionType: AppSpecContent
appSpecContent:
content: |
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "[YOUR_TASK_DEFINITION_ARN]"
LoadBalancerInfo:
ContainerName: "ecs-service-container"
ContainerPort: 8080

或者您喜欢的部署组的其他服务,例如:EC2

最新更新