我用以下命令开始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