ECS Fargate service

Steps

In this example, we are going to deploy the source code in the directory Kattehotell.Api/ to your AWS account:

GitHub repository containing your source code
.
└── Kattehotell.Api/
    ├── ...
    └── Dockerfile

We want this ECS Fargate to be deployed as part of the application Kattehotell.

Step 1: Prepare an ECR repository

  1. Navigate to repository SharedKontoInfrastruktur
  2. Navigate to ./Shared/<application-name>/eu-west-1/ecr/main.tf
  3. Update locals with new entries:
    ./Shared/kattehotell/eu-west-1/ecr/main.tf
    locals {
      kattehotell_repos = toset([
        ...
        "api",
      ])
    
      account_access = [
        local.accounts["BYM-DP-Kattehotell-Test"].id, 
        local.accounts["BYM-DP-Kattehotell-Prod"].id 
      ]
    }
    
    module "kattehotell_ecr" {
      for_each         = local.kattehotell_repos                                    
      source           = "git@github.com:BYM-IKT/terraform-aws-ecr.git?ref=v3"     
      application_name = "kattehotell"                                    
      service          = each.value
      account_access   = local.account_access 
    }
    
    output "kattehotell_ecr_repo" {
      value = module.kattehotell_ecr
    }
    
  4. Create a Pull Request to Terraform apply this change. Terraform will provision a new ECR repository with the name ${application_name}-${service}. In our example, the resulting ECR repository will be named kattehotell-api.

Step 2: Build and push Docker Image

Before you can proceed the ECR repository cannot be empty.

  1. Create a GitHub Actions workflow file .github/workflows/deploy-to-test.yml:

    .
    ├── .github/
    │   └── workflows/
    │       └── deploy-to-test.yml
    └── Kattehotell.Api/
        ├── ...
        └── Dockerfile
    
    with the following content:
    ./.github/workflows/deploy-to-test.yml
    name: Deploy ECS Fargate to TEST
    
    on:
      push:
        branches: [master]
      workflow_dispatch:
    
    jobs:
      build_push_image_to_shared:
        name: Build image and publish to ECR
        runs-on: ubuntu-latest
        permissions:
          id-token: write
          contents: read
        steps:
          - name: "Kattehotell.Api"
            uses: BYM-IKT/github-actions/build-and-push-image-to-ecr@master
            with:
              dockerfile-path: Kattehotell.Api/Dockerfile
              aws-account-id:  "<<AWS_ACCOUNT_ID>>"        
              ecr-name:        kattehotell-api
              image-tags:      latest
    
      deploy_images_to_ecs_service_test:
        needs: [build_push_image_to_shared]
        name: "Deploy to TEST"
        uses: BYM-IKT/github-actions/.github/workflows/deploy-image-to-ecs.yml@v0
        with:
          environment:           testing
          aws-account-id-target: "<<AWS_ACCOUNT_ID>>"
          ecr-name:              kattehotell-api
          image-tag-target:      latest
          image-tag-new:         test
          ecs-cluster-name:      kattehotell
          ecs-service-name:      api
    
    where <<AWS_ACCOUNT_ID>> is replaced with the Id of your AWS Account.

  2. Run the pipeline, which will build and push your Docker image to your ECR repository.

Why did deploy_images_to_ecs_service_test crash?

This pipeline will crash when running deploy_images_to_ecs_service_test as the ECS Fargate service does not exist yet. We will fix this in the forthcoming steps.

Step 3: Create an ECS Fargate service

Provision your ECS Fargate service referencing the ECR repository's URI as follows:

main.tf
module "application" {
  source      = "git@github.com:BYM-IKT/terraform-byks-module.git"
  environment = "test"
  ...
  ecs_services = {
    api = {
      ...
      ecr_uri   = data.terraform_remote_state.shared_ecr.outputs["api"]
      image_tag = "test"
    }
  }
}

Create a Pull Request to Terraform apply this change.

Terraform will provision a new ECS Fargate service named ${environment}-${application_name}-${service}. In our example, the resulting name of the ECS Fargate service will be api which resides in kattehotell cluster.

Step 4: Retry application pipeline

The whole pipeline created in Step 2 should work now. Try rerunning it.