{"id":14957999,"url":"https://github.com/mewa/terrascript","last_synced_at":"2026-02-27T11:02:16.871Z","repository":{"id":59157530,"uuid":"128222647","full_name":"mewa/terrascript","owner":"mewa","description":" Terrascript is wrapper around Terraform which adds the ability to script repetitive tasks as inline ruby code.","archived":false,"fork":false,"pushed_at":"2018-11-14T16:22:56.000Z","size":12,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-27T19:56:54.226Z","etag":null,"topics":["inline-ruby","ruby","terraform","terraform-scripts"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mewa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-04-05T15:02:25.000Z","updated_at":"2018-11-14T16:22:54.000Z","dependencies_parsed_at":"2022-09-13T20:11:27.133Z","dependency_job_id":null,"html_url":"https://github.com/mewa/terrascript","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/mewa/terrascript","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mewa%2Fterrascript","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mewa%2Fterrascript/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mewa%2Fterrascript/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mewa%2Fterrascript/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mewa","download_url":"https://codeload.github.com/mewa/terrascript/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mewa%2Fterrascript/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29892063,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T09:48:51.284Z","status":"ssl_error","status_checked_at":"2026-02-27T09:48:43.992Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["inline-ruby","ruby","terraform","terraform-scripts"],"created_at":"2024-09-24T13:15:57.535Z","updated_at":"2026-02-27T11:02:16.828Z","avatar_url":"https://github.com/mewa.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/mewa/terrascript.svg?branch=master)](https://travis-ci.org/mewa/terrascript) [![Gem Version](https://badge.fury.io/rb/terrascript.svg)](https://badge.fury.io/rb/terrascript)\n\n# What is Terrascript\n\nTerrascript is wrapper around Terraform which adds the ability to script repetitive tasks as inline ruby code.\n\nTerrascript parses `.tfrb` files, executes ruby code and outputs `.tf` files.\n\nSimply invoke `tfsc` with your usual Terraform arguments and enjoy the automation.\n\n# Usage\n\nThe overall structure is as shown below:\n```ruby\n@inline\n# ruby code\nreturn\n# plain text\n@end\n```\n\n`@inline` directive marks the beginning of inline ruby code.\n\nCode is evaluated until a `return` statement is found.\n\nText between `return` and `@end` statements is passed as an argument to the code.\nBy default it's accessible inside the inline code under `block` variable, but you can override the name by specifying your own name in `@inline` directive.\n\nFor example `@inline arg` declaration will pass text in `arg` variable.\n\nAnything the inline ruby code prints (`puts`) is written to the destination `.tf` file.\n\n# Examples\n\n```hcl\n@inline\n[\"one\", \"two\"].each do |fn|\n  puts block.gsub(\"\u003cfn\u003e\", fn)\nend\nreturn\n# \u003cfn\u003e alias\nmodule \"\u003cfn\u003e_alias\" {\n  source = \"mewa/lambda-alias/aws\"\n  version = \"1.0.0\"\n\n  alias = \"${local.environment}\"\n  function_arn = \"${aws_lambda_function.\u003cfn\u003e.arn}\"\n  function_name = \"${aws_lambda_function.\u003cfn\u003e.function_name}\"\n  function_version = \"${aws_lambda_function.\u003cfn\u003e.version}\"\n  invoke_arn = \"${aws_lambda_function.\u003cfn\u003e.invoke_arn}\"\n}\n\n# \u003cfn\u003e permission\nresource \"aws_lambda_permission\" \"\u003cfn\u003e_lambda_permission\" {\n  statement_id  = \"AllowAPIGatewayInvoke\"\n  principal     = \"apigateway.amazonaws.com\"\n  action        = \"lambda:InvokeFunction\"\n  function_name = \"${aws_lambda_function.\u003cfn\u003e.function_name}\"\n  qualifier = \"${module.\u003cfn\u003e_alias.alias}\"\n\n  source_arn = \"${aws_api_gateway_deployment.stage.execution_arn}/*/*\"\n}\n@end\n```\nWill be rendered as\n```hcl\n# one alias\nmodule \"one_alias\" {\n  source = \"mewa/lambda-alias/aws\"\n  version = \"1.0.0\"\n\n  alias = \"${local.environment}\"\n  function_arn = \"${aws_lambda_function.one.arn}\"\n  function_name = \"${aws_lambda_function.one.function_name}\"\n  function_version = \"${aws_lambda_function.one.version}\"\n  invoke_arn = \"${aws_lambda_function.one.invoke_arn}\"\n}\n\n# one permission\nresource \"aws_lambda_permission\" \"one_lambda_permission\" {\n  statement_id  = \"AllowAPIGatewayInvoke\"\n  principal     = \"apigateway.amazonaws.com\"\n  action        = \"lambda:InvokeFunction\"\n  function_name = \"${aws_lambda_function.one.function_name}\"\n  qualifier = \"${module.one_alias.alias}\"\n\n  source_arn = \"${aws_api_gateway_deployment.stage.execution_arn}/*/*\"\n}\n# two alias\nmodule \"two_alias\" {\n  source = \"mewa/lambda-alias/aws\"\n  version = \"1.0.0\"\n\n  alias = \"${local.environment}\"\n  function_arn = \"${aws_lambda_function.two.arn}\"\n  function_name = \"${aws_lambda_function.two.function_name}\"\n  function_version = \"${aws_lambda_function.two.version}\"\n  invoke_arn = \"${aws_lambda_function.two.invoke_arn}\"\n}\n\n# two permission\nresource \"aws_lambda_permission\" \"two_lambda_permission\" {\n  statement_id  = \"AllowAPIGatewayInvoke\"\n  principal     = \"apigateway.amazonaws.com\"\n  action        = \"lambda:InvokeFunction\"\n  function_name = \"${aws_lambda_function.two.function_name}\"\n  qualifier = \"${module.two_alias.alias}\"\n\n  source_arn = \"${aws_api_gateway_deployment.stage.execution_arn}/*/*\"\n}\n```\n\n# Future improvements\n\nThis project was written for my internal needs and serves its purpose.\n\nHowever if it gains traction I could look into implementing a cleaner solution\nthat abstracts the code for some common tasks and leaves open door for extension (plugins, probably).\n\nThe code presented here as an example could then look like this:\n\n```hcl\n@replace \"\u003cfn\u003e\" with [\"one\", \"two\"]\n# \u003cfn\u003e alias\nmodule \"\u003cfn\u003e_alias\" {\n    some_attribute = \"${some_resource.\u003cfn\u003e.something}\"\n}\n@end\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmewa%2Fterrascript","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmewa%2Fterrascript","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmewa%2Fterrascript/lists"}