├── .gitignore ├── README.md ├── bin └── terraform-state-merge └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log 2 | node_modules 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # terraform-state-merge 2 | Merge any number of Terraform state files into one. 3 | 4 | ## Installation 5 | ```sh 6 | npm -g install terraform-state-merge 7 | ``` 8 | 9 | ## Usage 10 | ``` 11 | terraform-state-merge [ [...]] 12 | ``` 13 | 14 | `terraform-state-merge` always assumes the latest state has the most accurate 15 | information. 16 | -------------------------------------------------------------------------------- /bin/terraform-state-merge: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict' 3 | 4 | const fs = require('fs') 5 | const deepDiff = require('deep-diff') 6 | 7 | const files = process.argv.slice(2).map(f => fs.readFileSync(f)) 8 | // Sort them. We can assume that if Terraform changed some resources in between 9 | // our serials, the latest serial is the most up to date one. 10 | const jsons = files.map(JSON.parse).sort((a, b) => a.serial - b.serial) 11 | const modules = jsons.map(j => j.modules) 12 | 13 | var merged = {} 14 | 15 | function stash(modules) { 16 | modules.forEach((m) => { 17 | const path = m.path.join('.') 18 | merged[path] = m 19 | }) 20 | } 21 | 22 | modules.forEach(stash) 23 | 24 | merged = Object.keys(merged).map((k) => merged[k]) 25 | console.log(JSON.stringify({ 26 | version: jsons[jsons.length - 1].version, 27 | terraform_version: jsons[jsons.length - 1].terraform_version, 28 | serial: jsons[jsons.length - 1].serial + 1, 29 | modules: merged 30 | }, null, 4)) 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "terraform-state-merge", 3 | "version": "0.1.1", 4 | "description": "Merge any number of Terraform state files into one", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Maciej Małecki ", 10 | "license": "ISC", 11 | "bin": { 12 | "terraform-state-merge": "./bin/terraform-state-merge" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/mmalecki/terraform-state-merge.git" 17 | }, 18 | "dependencies": { 19 | "deep-diff": "^0.3.4" 20 | } 21 | } 22 | --------------------------------------------------------------------------------