Giter VIP home page Giter VIP logo

actions's Introduction

Infracost GitHub Actions

This project provide a GitHub Action and examples for Infracost, so you can see cloud cost estimates for Terraform in pull requests ๐Ÿ’ฐ

Example screenshot

Quick start

The following steps assume a simple Terraform directory is being used, we recommend you use a more relevant example if required.

  1. Retrieve your Infracost API key by running infracost configure get api_key. We recommend using your same API key in all environments. If you don't have one, download Infracost and run infracost register to get a free API key.

  2. Create a repo secret called INFRACOST_API_KEY with your API key.

  3. Create a new file in .github/workflows/infracost.yml in your repo with the following content.

   # The GitHub Actions docs (https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#on)
   # describe other options for 'on', 'pull_request' is a good default.
   on: [pull_request]
   env:
      # If you use private modules you'll need this env variable to use 
      # the same ssh-agent socket value across all jobs & steps. 
      SSH_AUTH_SOCK: /tmp/ssh_agent.sock
   jobs:
     infracost:
       name: Infracost
       runs-on: ubuntu-latest

       env:
         TF_ROOT: examples/terraform-project/code
         # If you're using Terraform Cloud/Enterprise and have variables stored on there
         # you can specify the following to automatically retrieve the variables:
         #   INFRACOST_TERRAFORM_CLOUD_TOKEN: ${{ secrets.TFC_TOKEN }}
         #   INFRACOST_TERRAFORM_CLOUD_HOST: app.terraform.io # Change this if you're using Terraform Enterprise

         steps:
           # If you use private modules, add an environment variable or secret
           # called GIT_SSH_KEY with your private key, so Infracost can access
           # private repositories (similar to how Terraform/Terragrunt does).
           # - name: add GIT_SSH_KEY
           #   run: |
           #     ssh-agent -a $SSH_AUTH_SOCK
           #     mkdir -p ~/.ssh
           #     echo "${{ secrets.GIT_SSH_KEY }}" | tr -d '\r' | ssh-add -
           #     ssh-keyscan github.com >> ~/.ssh/known_hosts
            
           - name: Setup Infracost
             uses: infracost/actions/setup@v2
             # See https://github.com/infracost/actions/tree/master/setup for other inputs
             # If you can't use this action, see Docker images in https://infracost.io/cicd
             with:
               api-key: ${{ secrets.INFRACOST_API_KEY }}

           # Checkout the base branch of the pull request (e.g. main/master).
           - name: Checkout base branch
             uses: actions/checkout@v2
             with:
               ref: '${{ github.event.pull_request.base.ref }}'

           # Generate Infracost JSON file as the baseline.
           - name: Generate Infracost cost estimate baseline
             run: |
               infracost breakdown --path=${TF_ROOT} \
                                   --format=json \
                                   --out-file=/tmp/infracost-base.json

           # Checkout the current PR branch so we can create a diff.
           - name: Checkout PR branch
             uses: actions/checkout@v2

           # Generate an Infracost diff and save it to a JSON file.
           - name: Generate Infracost diff
             run: |
               infracost diff --path=${TF_ROOT} \
                              --format=json \
                              --compare-to=/tmp/infracost-base.json \
                              --out-file=/tmp/infracost.json

           # Posts a comment to the PR using the 'update' behavior.
           # This creates a single comment and updates it. The "quietest" option.
           # The other valid behaviors are:
           #   delete-and-new - Delete previous comments and create a new one.
           #   hide-and-new - Minimize previous comments and create a new one.
           #   new - Create a new cost estimate comment on every push.
           # See https://www.infracost.io/docs/features/cli_commands/#comment-on-pull-requests for other options.
           - name: Post Infracost comment
             run: |
                 infracost comment github --path=/tmp/infracost.json \
                                          --repo=$GITHUB_REPOSITORY \
                                          --github-token=${{github.token}} \
                                          --pull-request=${{github.event.pull_request.number}} \
                                          --behavior=update
  1. ๐ŸŽ‰ That's it! Send a new pull request to change something in Terraform that costs money. You should see a pull request comment that gets updated, e.g. the ๐Ÿ“‰ and ๐Ÿ“ˆ emojis will update as changes are pushed!

    If there are issues, check the GitHub Actions logs and this page.

  2. Follow the docs if you'd also like to show cost for of usage-based resources such as AWS Lambda or S3. The usage for these resources are fetched from CloudWatch/cloud APIs and used to calculate an estimate.

Troubleshooting

Permissions issue

If you receive an error when running the infracost comment command in your pipeline, it's probably related to ${{ github.token }}. This is the default GitHub token available to actions and is used to post comments. The default token permissions work fine but pull-requests: write is required if you need to customize these. If you are using SAML single sign-on, you must first authorize the token.

Examples

The examples directory demonstrates how these actions can be used for different projects. They all work by using the default Infracost CLI option that parses HCL, thus a Terraform plan JSON is not needed.

For advanced use cases where the estimate needs to be generated from Terraform plan JSON files, see the plan JSON examples here.

Cost policies

Infracost policies enable centralized teams, who are often helping others with cloud costs, to provide advice before resources are launched, setup guardrails, and prevent human error. Follow our docs to use Infracost's native support for Open Policy Agent (OPA) policies. This enables you to see passing/failing policies in Infracost pull request comments (shown below) without having to install anything else.

If you use HashiCorp Sentinel, follow our example to output the policy pass/fail results into CI/CD logs.

Contributing

Issues and pull requests are welcome! For development details, see the contributing guide. For major changes, including interface changes, please open an issue first to discuss what you would like to change. Join our community Slack channel, we are a friendly bunch and happy to help you get started :)

License

Apache License 2.0

actions's People

Contributors

alikhajeh1 avatar aliscott avatar dependabot[bot] avatar dinoshauer avatar fcjr avatar hugorut avatar tim775 avatar tutuviz avatar vdmgolub avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.