Support Terraform State for Matching config between resources e.g. compare config between Active Site & DR Site
Only support bun runtime, for Node.js Runtime, please open the PR for fixing
#!/usr/bin/env node
shebang onscripts/insert-shebang.ts
file which can able to load TypeScript file
npm install @thaitype/infra-state-matcher
- Export Terraform State into serialized JSON format on your terraform root module directory
terraform show -json > prod.state.json
- Copy the JSON file to the directory where you want to run the matcher
cp prod.state.json .state/prod.state.json
- Run build command to generate the matcher type helper,
ism build
- Write a configuration file for matching resources between two Terraform states, see example in
examples/simple.match.ts
- Import Type Helper from the generated file
import type { State } from '../.gen/SimpleStateMatcher/types.js';
- Write your own class and inherit
ResourceAnnotation
class for declaring resources metadata for matching in test cases
class SimpleResourceAnnotation extends ResourceAnnotation { public label(resources: GenericResourceAnnotation[]): GenericResourceAnnotation[] { // Write your logic here return resources; } }
- Write your own class and inherit
StateMatcher
class for matching resources between two Terraform states
class SimpleStateMatcher extends StateMatcher { public match(): void { const matcher = new ConfigMatcher({ defaultPair: { actual: { site: 'dr' }, expected: { site: 'active' }, }, }); // Starting matching the resource `azurerm_app_service` with the service `web` and scope `contractor` const contractorWeb = matcher.createResourceMatcher<State['azurerm_app_service.common_auth_gateway']>({ resource_type: 'azurerm_app_service', service: 'web', scope: 'contractor', }); contractorWeb.expectKey('values.app_settings.APPLICATIONINSIGHTS_CONNECTION_STRING').matchConstant('value'); } }
- Config how the matcher should run in the main function
export default new MatchRunner({ annotation: SimpleResourceAnnotation, stateMather: SimpleStateMatcher, options: { stateFile: ".state/prod.state.json", }, });
- Run start command to start the matching process,
ism
bun install
bun run build
bun run check
bun run check:watch
Using release-it
to publish the package, using npm commandline with OTP (One Time Password) for 2FA (Two Factor Authentication)
bun run release