Я использую terraform для предоставления необходимых ресурсов.
У меня есть terraform codepipeline resource
, и Production
stage
читает файл imagedefinitions.json
, чтобы узнать, какие образы развертывать:
resource "aws_codepipeline" "pipeline" {
stage {
name = "Build"
action {
name = "Build"
category = "Build"
owner = "AWS"
provider = "CodeBuild"
version = "1"
input_artifacts = ["source"]
output_artifacts = ["imagedefinitions"]
configuration {
ProjectName = "${var.project_prefix}-codebuild"
}
}
}
stage {
name = "Production"
action {
name = "Deploy"
category = "Deploy"
owner = "AWS"
provider = "ECS"
input_artifacts = ["imagedefinitions"]
version = "1"
configuration {
ClusterName = "${var.ecs_cluster_name}"
ServiceName = "${var.ecs_service_name}"
FileName = "imagedefinitions.json"
}
}
}
Файл imagedefinitions.json
создается на этапе сборки из buildspec.yml
:
build:
commands:
- echo Build started on 'date'
- echo Building the Docker image...
- docker build -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- echo Build completed on 'date'
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
- echo Writing image definitions file...
- printf '[{"name":"docker-image-name","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
Я не уверен, какое имя изображения должно быть в этой строке:
- printf '[{"name":"docker-image-name","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
Ошибка, которую я получаю, повторяет значение "name" из этой строки:
"Invalid action configuration The AWS ECS container docker-image-name does not exist"
Какое имя у меня здесь должно быть?
Вы создали репозиторий ERC и загрузили в него изображение? Это может помочь, я видел это, что похоже на часть того, чего вы пытаетесь достичь: https://github.com/aws-samples/amazon-ecs-catsndogs-workshop/blob/master/Lab-6-Artifacts/dogs/buildspec.yml
Похоже, вы используете учебник Непрерывное развертывание с помощью AWS CodePipeline. Из Предпосылки у вас должно быть определение задачи и служба, которая использует определение задачи.
Когда выполняется шаг Развертывание ECS в CodePipeline, он ищет определение задачи для указанной вами службы, создает новое определение задачи, в котором обновляет контейнер с тем же name
, что и в вашем файле imagedefinition.json
.
Итак, исходя из вашего примера, я ожидал бы, что определение задачи, связанное со службой ECS, которую обновляет ваш конвейер, будет иметь контейнер с именем docker-image-name
.
Отлично, спасибо!
Это была моя проблема. Я назвал свой контейнер «app» в TaskDefinition, но когда я создавал определение изображения, json-файл из CodeBuild, он использовал имя контейнера «api», поскольку я копировал этот код из другого проекта. Спасибо друг
Благодарность! Я читал руководство, в котором использовалась часть этого кода, но не объяснялось его. Было намного лучше читать оригинал. У меня был другой
name
вtask_definition.json
, чем тотname
, который я записывал в файлimagedefinitions.json
.