resource "aws_ecr_repository" "ecr_repo" { name = "${var.service.name}-repo" } resource "aws_ecr_repository_policy" "ecr_repo_policy" { count = var.pipeline.inputs.environment_account_ids != "" ? 1 : 0 repository = aws_ecr_repository.ecr_repo.name policy = data.aws_iam_policy_document.ecr_repo_policy_document.json } data "aws_iam_policy_document" "ecr_repo_policy_document" { statement { effect = "Allow" principals { type = "AWS" identifiers = [for id in split(",", var.pipeline.inputs.environment_account_ids) : "arn:aws:iam::${id}:root"] } actions = [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ] } } resource "aws_codebuild_project" "build_project" { name = "${var.service.name}-build-project" service_role = aws_iam_role.publish_role.arn artifacts { type = "CODEPIPELINE" } environment { compute_type = "BUILD_GENERAL1_SMALL" image = "aws/codebuild/amazonlinux2-x86_64-standard:3.0" type = "LINUX_CONTAINER" image_pull_credentials_type = "CODEBUILD" privileged_mode = true environment_variable { name = "repo_name" value = aws_ecr_repository.ecr_repo.name } environment_variable { name = "service_name" value = var.service.name } } source { buildspec = < yq_linux_amd64.sha", "wget https://github.com/mikefarah/yq/releases/download/3.4.0/yq_linux_amd64", "sha256sum -c yq_linux_amd64.sha", "mv yq_linux_amd64 /usr/bin/yq", "chmod +x /usr/bin/yq" ] }, "pre_build": { "commands": [ "cd $CODEBUILD_SRC_DIR/${var.pipeline.inputs.service_dir}", "$(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)", "${var.pipeline.inputs.unit_test_command}" ] }, "build": { "commands": [ "IMAGE_REPO_NAME=$repo_name", "IMAGE_TAG=$CODEBUILD_BUILD_NUMBER", "IMAGE_ID=${local.account_id}.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG", "docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG -f ${var.pipeline.inputs.dockerfile} .", "docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $IMAGE_ID;", "docker push $IMAGE_ID" ] }, "post_build": { "commands": [ "aws proton --region $AWS_DEFAULT_REGION get-service --name $service_name | jq -r .service.spec > service.yaml", "yq w service.yaml 'instances[*].spec.image' \"$IMAGE_ID\" > rendered_service.yaml" ] } }, "artifacts": { "files": [ "${var.pipeline.inputs.service_dir}/rendered_service.yaml" ] } } EOF type = "CODEPIPELINE" } encryption_key = aws_kms_key.pipeline_artifacts_bucket_key.arn } resource "aws_codebuild_project" "deploy_project" { for_each = { for instance in var.service_instances : instance.name => instance } name = "deploy-${var.service.name}-${index(var.service_instances, each.value)}" service_role = aws_iam_role.deployment_role.arn artifacts { type = "CODEPIPELINE" } environment { compute_type = "BUILD_GENERAL1_SMALL" image = "aws/codebuild/amazonlinux2-x86_64-standard:3.0" type = "LINUX_CONTAINER" privileged_mode = false image_pull_credentials_type = "CODEBUILD" environment_variable { name = "service_instance_name" value = each.value.name } environment_variable { name = "service_name" value = var.service.name } } source { type = "CODEPIPELINE" buildspec = <