Создание образа с использованием terraform и развертывание в AWS ECR через CircleCI

Я сделал это все, кроме развертывания через CircleCI. когда я запускаю terraform apply, я могу использовать образ в ECR, тогда мой terraform создает кластер, определение задачи и службу. Все идет хорошо; однако, когда CircleCI пытается запустить команды докера, это не удается.

Я просто сдаюсь после целого дня, проведенного здесь.

Это часть кода, который я считаю компромиссным:

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "2.24.0"
    }
  }
}

provider "docker" {
  registry_auth {
    address  = data.aws_ecr_authorization_token.token.proxy_endpoint
    username = data.aws_ecr_authorization_token.token.user_name
    password = data.aws_ecr_authorization_token.token.password
  }
}

resource "aws_ecr_repository" "this" {
  name                 = "${var.service_name}-vpn"
  image_tag_mutability = "MUTABLE"

  image_scanning_configuration {
    scan_on_push = true
  }

  encryption_configuration {
    encryption_type = "AES256"
  }
}

resource "docker_registry_image" "this" {
  name = "${aws_ecr_repository.this.repository_url}:latest"

  build {
    context    = "./${var.service_name}-vpn"
    dockerfile = "Dockerfile"
  }
}```

**This is the output from CircleCI which doesn't happen on my computer; I have tried though, using the dind image. I still get the same error.**


> Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
- Reusing previous version of kreuzwerker/docker from the dependency lock file
- Reusing previous version of hashicorp/aws from the dependency lock file
- Installing kreuzwerker/docker v2.24.0...
- Installed kreuzwerker/docker v2.24.0 (self-signed, key ID BD080C4571C6104C)
- Installing hashicorp/aws v4.18.0...
- Installed hashicorp/aws v4.18.0 (signed by HashiCorp)

Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
/root/connections-terraform
connections-terraform
data.aws_ecr_authorization_token.token: Reading...
data.aws_secretsmanager_secret.this: Reading...
data.aws_iam_role.vpn_task: Reading...
data.aws_iam_role.ecs_task_execution_role: Reading...
data.aws_ecs_cluster.this: Reading...
data.aws_iam_role.vpn_task: Read complete after 0s [id=vpnTask]
data.aws_iam_role.ecs_task_execution_role: Read complete after 0s [id=ecsTaskExecutionRole]
data.aws_ecr_authorization_token.token: Read complete after 0s [id=*********]
data.aws_ecs_cluster.this: Read complete after 0s [id=arn:aws:ecs:*********:************:cluster/***-***]
2023-01-10T04:50:39.213Z [*****] provider.terraform-provider-docker_v2.24.0: Response contains error diagnostic: tf_provider_addr=provider tf_rpc=Configure @module=sdk.proto diagnostic_detail= diagnostic_severity=***** tf_proto_version=5.3 @caller=github.com/hashicorp/[email protected]/tfprotov5/internal/diag/diagnostics.go:55 diagnostic_summary = "Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?" tf_req_id=******bc-d33d-*****-347d-****a137c68d timestamp=2023-01-10T04:50:39.213Z
2023-01-10T04:50:39.213Z [*****] vertex "provider[\"registry.terraform.io/kreuzwerker/docker\"]" error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
data.aws_secretsmanager_secret.this: Read complete after 0s [id=arn:aws:secretsmanager:*********:************:secret:sandbox/vpn-832Y9J]
╷
│ Error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
│ 
│   with provider["registry.terraform.io/kreuzwerker/docker"],
│   on main.tf line 16, in provider "docker":
│   16: provider "docker" {
│ 
╵
Releasing state lock. This may take a few moments...
ERRO[0005] 1 error occurred:
    * exit status 1

**This is part of my .circleci/confi.yml file **

version: 2.1

defaults: &defaults
  docker:
    - image: docker:20.10.22-dind
      aws_auth:


Вам не нужно использовать провайдера kreuzwerker, вы можете просто использовать команды docker: Circleci.com/docs/building-docker-images . Кроме того, существуют сферы CircleCI: Circleci.com/developer/orbs/orb/circleci/aws-ecr.

Marko E 10.01.2023 08:21

@MarkoE В общем, я удалил docker как провайдера, а файл docker_registry_image. Вместо этого в config.yml: docker_version: &docker_version | orbs: aws-ecr: circleci/[email protected] aws-ecs: circleci/[email protected] | setup_remote_docker: | aws-ecr/build-and-push-image | aws-ecs/deploy-service-update

Fausto Gomez 10.01.2023 20:42

Хорошо, так ты говоришь мне, что это сработало? :)

Marko E 10.01.2023 21:00

@MarkoE Я мог бы перейти к следующему этапу в Circleci, но сейчас у меня проблемы с тем, что есть в моем Dockerfile COPY entrypoint.sh /entrypoint.sh ; однако я получаю это сообщение об ошибке> /entrypoint.sh not found: not found. Я обнаружил, что мне нужно каким-то образом скопировать файлы в файл remote_docker. Любые подсказки?

Fausto Gomez 10.01.2023 21:14

Есть ли в вашем коде сценарий точки входа? Если нет, вы можете удалить его из Dockerfile. Если да, вам нужно создать его в своем репозитории.

Marko E 10.01.2023 21:40

@MarkoE да, у меня есть. создание образа с копированием файлов работает нормально, когда я создаю образ и отправляю его в ECR с моего хоста. Проблема заключается в создании образа из CircleCI; вот где COPY выдал ошибку. Как я могу создать скрипт в моем репо?

Fausto Gomez 10.01.2023 23:49

@MarkoE Я только что опубликовал окончательный код. Спасибо за руководство!

Fausto Gomez 12.01.2023 18:19
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
7
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несмотря на то, что код моего вопроса работает нормально, он не работал через CircleCI. Итак, способ, которым я решил это, был следующим:

Я удалил из main.tf провайдера докеров и docker_registry_image, а aws_ecr_repository оставил.

resource "aws_ecr_repository" "this" {                                
  name = "${var.service_name}-vpn"                    
  image_tag_mutability = "MUTABLE"            
  image_scanning_configuration {                              
    scan_on_push = true                                                  
  }                                               
  encryption_configuration {                               
    encryption_type = "AES256"                                           
  }                                                                      
}

В файл .circleci/config.yml я добавил следующие инструкции:

docker_version: &docker_version
  version: 20.10.6 
orbs: 
  aws-ecr: circleci/[email protected] 
  aws-ecs: circleci/[email protected]

jobs:
  build-and-deploy-image:
    steps:
      - checkout
      - setup_remote_docker:
         <<: *docker_version
         docker_layer_caching: true

      - aws-ecr/build-and-push-image:
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          aws-cli-version: latest
          extra-build-args: "--compress"
          region: AWS_REGION
          build-path: ./services/vpn/vpn-image/
          dockerfile: Dockerfile
          path: ./services/vpn/vpn-image/
          repo: vpn
          tag: "latest,${CIRCLE_SHA1}"
          registry-id: AWS_ECR_REGISTRY_ID

workflows:
  build_ecr_ecs_task:
    jobs:
      - build-and-deploy-image:
          requires:
            - apply-terraform-sandbox
      - aws-ecs/deploy-service-update:
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          cluster: cluster-name
          container-image-name-updates: container=container-name,tag=latest
          family: service-name-vpn
            requires:
              - build-and-deploy-image

Другие вопросы по теме