Skip to content

Lambda Function

Minimal Example

main.tf
module "application" {
  source           = "git@github.com:BYM-IKT/terraform-byks-module.git"
  team             = var.team
  account_id       = var.account_id
  environment      = var.environment
  region           = var.region
  application_name = var.application_name

  lambda_functions = {
    my-function = {
      ecr_uri   = local.ecr["my-function"]
      image_tag = var.environment

      environment_variables = {
        MY_ENV_VAR = "hello world!"
      }
    }
  }

  providers = {
    aws.route53   = aws.route53
    aws.us-east-1 = aws.us-east-1
    aws.ses       = aws.ses
  }
}

Tutorial

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

GitHub repository containing your source code
.
└── Lambda.CreateBooking/
    ├── ...
    └── Dockerfile

We want this Lambda function to be deployed under 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([
        ...
        "create-booking",
      ])
    
      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-create-booking.

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
    └── Lambda.CreateBooking/
        ├── ...
        └── Dockerfile
    
    with the following content:
    ./.github/workflows/deploy-to-test.yml
    name: Deploy Lambda Function 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: "Lambda.CreateBooking"
            uses: BYM-IKT/github-actions/build-and-push-image-to-ecr@master
            with:
              dockerfile-path: Lambda.CreateBooking/Dockerfile
              aws-account-id:  "<<AWS_ACCOUNT_ID>>"        
              ecr-name:        kattehotell-create-booking
              image-tags:      latest
    
      deploy_image_to_lambda_function_test:
        needs: [build_push_image_to_shared]
        name: "Deploy to TEST"
        uses: BYM-IKT/github-actions/.github/workflows/deploy-image-to-lambda.yml@v0
        with:
          environment:              testing
          aws-account-id-target:    <<AWS_ACCOUNT_ID>>
          ecr-name:                 kattehotell-create-booking
          image-tag-target:         latest
          image-tag-new:            test
          lambda-name:              test-kattehotell-create-booking
    
    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_image_to_lambda_function_test crash?

This pipeline will crash when running deploy_image_to_lambda_function_test as the Lambda function does not exist yet. We will fix this in the forthcoming steps.

Step 3: Create Lambda Function

Provision your Lambda Function referencing the ECR repository's URI as follows:

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

Create a Pull Request to Terraform apply this change.

Terraform will provision a new Lambda function named ${environment}-${application_name}-${service}. In our example, the resulting name of the Lambda function will be test-kattehotell-create-booking.

Step 4: Retry application pipeline

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