Terraform: how you override a version using nixpgks way

You can achieve this via an overlay. Here is an example how to override terraform 0.12 and a provider, as well as creating a package that includes a set of plugins:

let
  terraformOverlay = final: prev: {
    terraformFull = final.terraform_0_12.withPlugins (p: [ p.aws p.null ]);

    terraform_0_12 = prev.terraform_0_12.overrideAttrs (old: rec {
      name = "terraform-${version}";
      version = "0.12.28";
      src = prev.fetchFromGitHub {
        owner = "hashicorp";
        repo = "terraform";
        rev = "v${version}";
        sha256 = "05ymr6vc0sqh1sia0qawhz0mag8jdrq157mbj9bkdpsnlyv209p3";
      };
    });

    terraform-providers = prev.terraform-providers // {
      aws = prev.terraform-providers.aws.overrideAttrs (old: rec {
        name = "${old.repo}-${version}";
        version = "3.20.0";
        src = prev.fetchFromGitHub {
          owner = "hashicorp";
          repo = "terraform-provider-aws";
          rev = "v${version}";
          sha256 = "18zccjkdxzcprhpv3cn3b9fbp0h81pkj0dsygfz2islclljc3x17";
        };
        postBuild = "mv go/bin/${old.repo}{,_v${version}}";
      };
    };
  };
in import <nixpkgs> { overlays = [ terraformOverlay ]; }