CodeBuild를 사용하여 ECR로 push하여 프로덕션 작업을 줄이고 싶습니다.

14028 단어 CodeBuildECRTerraform

배경


  • 현재의 프로덕션 환경은 ECS를 사용하고 있다.
  • 릴리스마다 수동으로 Docker의 빌드로부터 ECR에 push를 실시해, 태스크를 작성해 배포를 실시하고 있다.
  • 수동 작업으로 인한 실수, 프로덕션 작업의 정신적 부하를 낮추고 싶다.
  • AWS SAA 공부 중 CodeBuild 서비스가 되는 것을 발견.
  • 우선 CodeBuild를 사용해 Docker의 이미지 생성으로부터 ECR에의 push를 원 커멘드로 실시하고 싶다.

  • 코드 해설


  • 아래 링크의 Docker 파일에서 생성된 Docker 이미지를 ECR로 관리합니다.
  • htps : // 기주 b. 코 m / 아카포 001 / 테라 후 rm - cr - cs / b / b / 마인 / 도 c r r

  • ECR
  • 여기는 단순히 ECR의 이름을 설정하고 있을 뿐이므로 해설은 생략합니다.

  • resource "aws_ecr_repository" "nginx" {
      name                 = "my-nginx"
      image_tag_mutability = "MUTABLE"
      image_scanning_configuration {
        scan_on_push = true
      }
    }
    
    output "ecr_url" {
      value = aws_ecr_repository.nginx.repository_url
    }
    
  • IAM 정책
  • CodeBuild에 대한 IAM 정책 설정
  • CodeBuild 관련 권한 외에도 ECR에 push 및 CloudWatch에 로깅 할 수있는 권한 부여
  • 실제 프로덕션 환경은 자재를 S3로 관리하고 있으므로 그 쪽의 권한도 추가하고 있다

  • data "aws_iam_policy_document" "assume_role_codebuild" {
      statement {
        actions = ["sts:AssumeRole"]
    
        principals {
          type        = "Service"
          identifiers = ["codebuild.amazonaws.com"]
        }
      }
    }
    
    resource "aws_iam_role" "codebuild_execution_role" {
      name               = "MyCodeBuildRole"
      assume_role_policy = data.aws_iam_policy_document.assume_role_codebuild.json
    }
    
    resource "aws_iam_role_policy_attachment" "amazon_ec2_container_registry_full_access" {
      role       = aws_iam_role.codebuild_execution_role.name
      policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess"
    }
    
    resource "aws_iam_role_policy_attachment" "amazon_ec2_container_registry_power_user" {
      role       = aws_iam_role.codebuild_execution_role.name
      policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser"
    }
    
    resource "aws_iam_policy" "codebuild_base_policy" {
      name = "CodeBuildBasePolicy-my_nginx"
      policy = jsonencode({
        Version: "2012-10-17",
        Statement: [
          {
            Effect: "Allow",
            Resource: [
              "arn:aws:logs:ap-northeast-1:${var.aws_account_id}:log-group:/aws/codebuild/my_nginx",
              "arn:aws:logs:ap-northeast-1:${var.aws_account_id}:log-group:/aws/codebuild/my_nginx:*"
            ],
            Action: [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ]
          },
          {
            Effect: "Allow",
            Resource: [
              "arn:aws:s3:::codepipeline-ap-northeast-1-*"
            ],
            Action: [
              "s3:PutObject",
              "s3:GetObject",
              "s3:GetObjectVersion",
              "s3:GetBucketAcl",
              "s3:GetBucketLocation"
            ]
          },
          {
            Effect: "Allow",
            Action: [
              "codebuild:CreateReportGroup",
              "codebuild:CreateReport",
              "codebuild:UpdateReport",
              "codebuild:BatchPutTestCases",
              "codebuild:BatchPutCodeCoverages"
            ],
            Resource: [
              "arn:aws:codebuild:ap-northeast-1:${var.aws_account_id}:report-group/my_nginx-*"
            ]
          }
        ]
      })
    }
    
    resource "aws_iam_role_policy_attachment" "codebuild_policy" {
      role       = aws_iam_role.codebuild_execution_role.name
    
      policy_arn = aws_iam_policy.codebuild_base_policy.arn
    }
    
  • CodeBuild

  • 빌드하는 환경의 설정: 이번은 Fargate의 ECS를 상정하고 있으므로 x86 아키텍쳐를 지정.

  • 빌드 하는 소스의 지정: 아래에서는 GitHub를 지정하고 있지만 S3등도 지정 가능.

  • 빌드 명령 설정 : htps : // 기주 b. 코 m/아카포 001/테라후 rm-에cr-cs/bぉb/마인/부이 ldsぺc. yml
    ※특히 지정이 없는 경우, source 섹션에서 지정한 파일의 장소로부터 buildspec.yml 를 자동으로 찾아 준다. (모든 파일을 지정할 수 있음)

  • resource "aws_codebuild_project" "my_nginx" {
      name = "my_nginx"
      service_role = aws_iam_role.codebuild_execution_role.arn
      artifacts {
        type = "NO_ARTIFACTS"
      }
      environment {
        compute_type = "BUILD_GENERAL1_SMALL"
        image = "aws/codebuild/amazonlinux2-x86_64-standard:2.0"
        type = "LINUX_CONTAINER"
        privileged_mode = true
    
        environment_variable {
          name = "AWS_ACCOUNT_ID"
          value = var.aws_account_id
          type = "PLAINTEXT"
        }
        environment_variable {
          name = "AWS_DEFAULT_REGION"
          value = "ap-northeast-1"
          type = "PLAINTEXT"
        }
        environment_variable {
          name = "IMAGE_REPO_NAME"
          value = "my-nginx"
          type = "PLAINTEXT"
        }
        environment_variable {
          name = "IMAGE_TAG"
          value = "latest"
          type = "PLAINTEXT"
        }
      }
      source {
        type = "GITHUB"
        location = "https://github.com/akapo001/terraform-ecr-ecs.git"
        git_clone_depth = 1
        git_submodules_config {
          fetch_submodules = true
        }
      }
      source_version = "main"
    }
    

    빌드


  • terraform.tfvars 파일에 비밀 정보를 기록한 후 terraform apply를 실행하십시오.
  • 아래의 화면에서 "빌드 시작"을 누르기만 하면 buildspec.yml 에 쓰여진 명령을 실행하고 결국 ECR에 이미지가 푸시된다.


  • 완료 화면


  • ECS 콘솔에서 푸시되고 있음을 확인할 수 있습니다.

  • 좋은 웹페이지 즐겨찾기