Blueprints

Deploy Terraform resources defined in a GitHub repository using S3 remote backend

Source

yaml
id: git-terraform
namespace: company.team

tasks:
  - id: git
    type: io.kestra.plugin.core.flow.WorkingDirectory
    tasks:
      - id: clone_repository
        type: io.kestra.plugin.git.Clone
        url: https://github.com/anna-geller/kestra-ci-cd
        branch: main

      - id: terraform
        type: io.kestra.plugin.scripts.shell.Commands
        containerImage: hashicorp/terraform
        taskRunner:
          type: io.kestra.plugin.scripts.runner.docker.Docker
          entryPoint:
            - ""
        inputFiles:
          terraform.tfvars: |
            username            = "cicd"
            password            = "{{ secret('CI_CD_PASSWORD') }}"
            hostname            = "https://demo.kestra.io"
        beforeCommands:
          - terraform init
        commands:
          - terraform apply -auto-approve
        env:
          AWS_ACCESS_KEY_ID: "{{ secret('AWS_ACCESS_KEY_ID') }}"
          AWS_SECRET_ACCESS_KEY: "{{ secret('AWS_SECRET_ACCESS_KEY') }}"
          AWS_DEFAULT_REGION: "{{ secret('AWS_DEFAULT_REGION') }}"

About this blueprint

Trigger Docker DevOps Git

This flow will clone a Git repository and run Terraform commands to deploy the infrastructure resources defined in code. The repository already specifies a remote S3 backend, so the state will be stored in S3. Check the main.tf file for more details. You can run that flow on schedule to follow GitOps principles:

yaml
  - id: schedule
    type: io.kestra.plugin.core.trigger.Schedule
    cron: "*/15 * * * *"

Or you can add a GitHub webhook trigger to run this flow anytime a Pull Request is merged to your repository, effectively implementing CI/CD in Kestra:

yaml
  - id: github
    type: io.kestra.plugin.core.trigger.Webhook
    key: "{{ secret('WEBHOOK_KEY') }}"

Note that for a private GitHub repository, you should add a username and password. Also, if your terraform configuration is stored in a different directory within the Git repository, you can add the global -chdir flag to all terraform commands e.g.: terraform init -chdir=environment/production terraform apply -auto-approve -chdir=environment/production

Working Directory

Clone

Commands

Docker

New to Kestra?

Use blueprints to kickstart your first workflows.

Get started with Kestra