From c092028d0e69c995c23a796ce6f56692b31d432f Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:11:23 -0700 Subject: [PATCH 01/10] address iac getting started feedback --- _docs-sources/iac/getting-started/accessing-the-code.md | 6 +++--- _docs-sources/iac/getting-started/setting-up.md | 4 +++- docs/iac/getting-started/accessing-the-code.md | 8 ++++---- docs/iac/getting-started/setting-up.md | 6 ++++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/_docs-sources/iac/getting-started/accessing-the-code.md b/_docs-sources/iac/getting-started/accessing-the-code.md index a8fbdc23c5..eecdb8862f 100644 --- a/_docs-sources/iac/getting-started/accessing-the-code.md +++ b/_docs-sources/iac/getting-started/accessing-the-code.md @@ -1,9 +1,9 @@ # Accessing the code -Gruntwork provides all code included in your subscription to the Infrastructure as Code (IaC) library through GitHub. To gain access to the IaC Library, you must first [create an account in the Developer Portal](../../developer-portal/create-account.md). Once you have an account, you must [link your Github ID](../../developer-portal/link-github-id) to your Developer Portal account to gain access to the IaC Library. +Gruntwork provides all code included in your subscription to the Infrastructure as Code (IaC) library through GitHub. To gain access to the IaC Library, you must first [create an account in the Developer Portal](../../developer-portal/create-account.md). Once you have an account, you must [link your GitHub ID](../../developer-portal/link-github-id) to your Developer Portal account to gain access to the IaC Library. ## Accessing Modules and Services in the IaC library -Once you have gained access to the Gruntwork IaC library, you can view the source code for our modules and services in [Github](https://github.com/orgs/gruntwork-io/repositories). For a full list of modules and services, check the [Library Reference](../../iac/reference/index.md). +Once you have gained access to the Gruntwork IaC library, you can view the source code for our modules and services in [GitHub](https://github.com/orgs/gruntwork-io/repositories). For a full list of modules and services, check the [Library Reference](../../iac/reference/index.md). -In Github, each IaC repository is prefixed with `terraform-aws-` then a high level description of the modules it contains. For example, Amazon SNS, SQS, MSK, and Kinesis are located in the `terraform-aws-messaging` repository. In each repository, the modules are located in the `modules` directory. Example usage and tests are provided for each module in the `examples` and `tests` directories, respectively. +In GitHub, each IaC repository is prefixed with `terraform-aws-` then a high level description of the modules it contains. For example, Amazon SNS, SQS, MSK, and Kinesis are located in the `terraform-aws-messaging` repository. In each repository, the modules are located in the `modules` directory. Example usage and tests are provided for each module in the `examples` and `tests` directories, respectively. diff --git a/_docs-sources/iac/getting-started/setting-up.md b/_docs-sources/iac/getting-started/setting-up.md index 6cf61a7c5b..4f22ca88ed 100644 --- a/_docs-sources/iac/getting-started/setting-up.md +++ b/_docs-sources/iac/getting-started/setting-up.md @@ -20,9 +20,11 @@ If you want to skip immediately to learning, you can learn how to [deploy your f ## Terragrunt -Terragrunt is a tool developed by Gruntwork that provides extra tools for keeping your Terraform configurations DRY, working with multiple Terraform modules, and managing remote state. Terragrunt allows you to execute multiple Terraform commands at once, centrally manage your Terraform state configuration, and set repeatable CLI arguments. Since Terraform is a dependency of Terragrunt, you can continue to write modules for Terraform in the Terraform configuration language, then reference and re-use the modules in different environments or applications. +[Terragrunt](https://terragrunt.gruntwork.io) is a tool developed by Gruntwork that provides extra tools for keeping your Terraform configurations DRY, working with multiple Terraform modules, and managing remote state. Terragrunt allows you to execute multiple Terraform commands at once, centrally manage your Terraform state configuration, and set repeatable CLI arguments. Since Terraform is a dependency of Terragrunt, you can continue to write modules for Terraform in the Terraform configuration language, then reference and re-use the modules in different environments or applications. +:::info Terragrunt is not a required tool to use the IaC library, but it does provide many convenience features on top of Terraform. If you are using the Gruntwork [Reference Architecture](../../refarch/whats-this/what-is-a-reference-architecture), Terragrunt is a requirement. +::: ### Installation Terragrunt is supported on Mac (x86 and Apple Silicon), Windows, and Linux. To install Terragrunt, follow the guide on how to [install Terragrunt](https://terragrunt.gruntwork.io/docs/getting-started/install/) on the Terragrunt website. diff --git a/docs/iac/getting-started/accessing-the-code.md b/docs/iac/getting-started/accessing-the-code.md index 380859cc4b..1ba5be8b6f 100644 --- a/docs/iac/getting-started/accessing-the-code.md +++ b/docs/iac/getting-started/accessing-the-code.md @@ -1,17 +1,17 @@ # Accessing the code -Gruntwork provides all code included in your subscription to the Infrastructure as Code (IaC) library through GitHub. To gain access to the IaC Library, you must first [create an account in the Developer Portal](../../developer-portal/create-account.md). Once you have an account, you must [link your Github ID](../../developer-portal/link-github-id) to your Developer Portal account to gain access to the IaC Library. +Gruntwork provides all code included in your subscription to the Infrastructure as Code (IaC) library through GitHub. To gain access to the IaC Library, you must first [create an account in the Developer Portal](../../developer-portal/create-account.md). Once you have an account, you must [link your GitHub ID](../../developer-portal/link-github-id) to your Developer Portal account to gain access to the IaC Library. ## Accessing Modules and Services in the IaC library -Once you have gained access to the Gruntwork IaC library, you can view the source code for our modules and services in [Github](https://github.com/orgs/gruntwork-io/repositories). For a full list of modules and services, check the [Library Reference](../../iac/reference/index.md). +Once you have gained access to the Gruntwork IaC library, you can view the source code for our modules and services in [GitHub](https://github.com/orgs/gruntwork-io/repositories). For a full list of modules and services, check the [Library Reference](../../iac/reference/index.md). -In Github, each IaC repository is prefixed with `terraform-aws-` then a high level description of the modules it contains. For example, Amazon SNS, SQS, MSK, and Kinesis are located in the `terraform-aws-messaging` repository. In each repository, the modules are located in the `modules` directory. Example usage and tests are provided for each module in the `examples` and `tests` directories, respectively. +In GitHub, each IaC repository is prefixed with `terraform-aws-` then a high level description of the modules it contains. For example, Amazon SNS, SQS, MSK, and Kinesis are located in the `terraform-aws-messaging` repository. In each repository, the modules are located in the `modules` directory. Example usage and tests are provided for each module in the `examples` and `tests` directories, respectively. diff --git a/docs/iac/getting-started/setting-up.md b/docs/iac/getting-started/setting-up.md index 1ea95a38e2..4df2aec007 100644 --- a/docs/iac/getting-started/setting-up.md +++ b/docs/iac/getting-started/setting-up.md @@ -20,9 +20,11 @@ If you want to skip immediately to learning, you can learn how to [deploy your f ## Terragrunt -Terragrunt is a tool developed by Gruntwork that provides extra tools for keeping your Terraform configurations DRY, working with multiple Terraform modules, and managing remote state. Terragrunt allows you to execute multiple Terraform commands at once, centrally manage your Terraform state configuration, and set repeatable CLI arguments. Since Terraform is a dependency of Terragrunt, you can continue to write modules for Terraform in the Terraform configuration language, then reference and re-use the modules in different environments or applications. +[Terragrunt](https://terragrunt.gruntwork.io) is a tool developed by Gruntwork that provides extra tools for keeping your Terraform configurations DRY, working with multiple Terraform modules, and managing remote state. Terragrunt allows you to execute multiple Terraform commands at once, centrally manage your Terraform state configuration, and set repeatable CLI arguments. Since Terraform is a dependency of Terragrunt, you can continue to write modules for Terraform in the Terraform configuration language, then reference and re-use the modules in different environments or applications. +:::info Terragrunt is not a required tool to use the IaC library, but it does provide many convenience features on top of Terraform. If you are using the Gruntwork [Reference Architecture](../../refarch/whats-this/what-is-a-reference-architecture), Terragrunt is a requirement. +::: ### Installation Terragrunt is supported on Mac (x86 and Apple Silicon), Windows, and Linux. To install Terragrunt, follow the guide on how to [install Terragrunt](https://terragrunt.gruntwork.io/docs/getting-started/install/) on the Terragrunt website. @@ -42,6 +44,6 @@ If you’re ready to get started with creating and deploying a module, jump to [ From 02409e780d8f47a0e2e48508d84a16ac84a378bd Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:14:52 -0700 Subject: [PATCH 02/10] fix --- _docs-sources/iac/getting-started/deploying-a-module.md | 2 -- docs/iac/getting-started/deploying-a-module.md | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/_docs-sources/iac/getting-started/deploying-a-module.md b/_docs-sources/iac/getting-started/deploying-a-module.md index ab97257b23..350cfb3e33 100644 --- a/_docs-sources/iac/getting-started/deploying-a-module.md +++ b/_docs-sources/iac/getting-started/deploying-a-module.md @@ -2,8 +2,6 @@ [Modules](../overview/modules.md) allow you to define an interface to create one or many resources in the cloud or on-premise, similar to how in object oriented programming you can define a class that may have different attribute values across many instances. -Modules help keep your Terraform code DRY (Don’t Repeat Yourself), and speed up development time when creating new resources. - This tutorial will teach you how to develop a Terraform module that deploys an AWS Lambda function. We will create the required file structure, define an AWS Lambda function and AWS IAM role as code, then plan and apply the resource in an AWS account. Then, we’ll verify the deployment by invoking the Lambda using the AWS CLI. Finally, we'll clean up the resources we create to avoid unexpected costs. ## Prerequisites diff --git a/docs/iac/getting-started/deploying-a-module.md b/docs/iac/getting-started/deploying-a-module.md index f8fdb27ef1..006039b958 100644 --- a/docs/iac/getting-started/deploying-a-module.md +++ b/docs/iac/getting-started/deploying-a-module.md @@ -2,8 +2,6 @@ [Modules](../overview/modules.md) allow you to define an interface to create one or many resources in the cloud or on-premise, similar to how in object oriented programming you can define a class that may have different attribute values across many instances. -Modules help keep your Terraform code DRY (Don’t Repeat Yourself), and speed up development time when creating new resources. - This tutorial will teach you how to develop a Terraform module that deploys an AWS Lambda function. We will create the required file structure, define an AWS Lambda function and AWS IAM role as code, then plan and apply the resource in an AWS account. Then, we’ll verify the deployment by invoking the Lambda using the AWS CLI. Finally, we'll clean up the resources we create to avoid unexpected costs. ## Prerequisites @@ -260,6 +258,6 @@ In [Using a module](../usage/using-a-module.md), you’ll learn how to create t From 9b96f38267c74bc6b45f0f14ae67cdd46f8cc9d9 Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:17:23 -0700 Subject: [PATCH 03/10] fix code highlighting for iac getting started --- .../iac/getting-started/deploying-a-module.md | 22 ++++++++--------- .../iac/getting-started/deploying-a-module.md | 24 +++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/_docs-sources/iac/getting-started/deploying-a-module.md b/_docs-sources/iac/getting-started/deploying-a-module.md index 350cfb3e33..1cd5de9bd2 100644 --- a/_docs-sources/iac/getting-started/deploying-a-module.md +++ b/_docs-sources/iac/getting-started/deploying-a-module.md @@ -20,7 +20,7 @@ This module could be referenced many times to create any number of AWS Lambda fu ### Create a basic file structure First, create the directories and files that will contain the Terraform configuration. -```sh +```bash mkdir -p terraform-aws-gw-lambda-tutorial/modules/lambda touch terraform-aws-gw-lambda-tutorial/modules/lambda/main.tf touch terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf @@ -78,7 +78,7 @@ Now that you’ve defined the resources you want to create, you need to list out Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf`. -```tf +```hcl variable "lambda_name" { type = string description = "Name that will be used for the AWS Lambda function" @@ -117,7 +117,7 @@ variable "timeout" { Terraform allows you to specify values that the module will output. Outputs are convenient ways to pass values between modules when composing a service comprised of many modules. Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf`. -```tf +```hcl output "function_name" { value = aws_lambda_function.lambda.function_name } @@ -132,7 +132,7 @@ Now that you have defined a module that creates an AWS Lambda function and IAM r Now that you have the module defined, you need to create files which will reference the module. Typically, you would create a module in one repository, then reference it in a different repository. For this tutorial, we’ll just create the reference in the top level directory for the sake of simplicity. Create a file called `main.tf`, which will contain a reference to the module, and a file called `main.py`, which will contain the Lambda function code. -```sh +```bash touch terraform-aws-gw-lambda-tutorial/main.tf touch terraform-aws-gw-lambda-tutorial/main.py ``` @@ -151,7 +151,7 @@ def lambda_handler(event, context): Next, create a reference to the module you just created in `/modules/lambda/main.tf`. This code uses the `module` block from Terraform, which references the `/modules/lambda` directory using the `source` attribute. You can then specify values for the required variables specified in `/modules/lambdas/variables.tf`. Finally, we specify an output using the value of the `module.lambda.function_name` output created in `/modules/lambdas/outputs.tf` -``` +```hcl terraform { required_providers { aws = { @@ -186,7 +186,7 @@ Running `terraform plan` is helpful when developing modules, to confirm that the From the `terraform-aws-gw-lambda-tutorial` directory, run a plan to see what resources will be created. -```sh +```bash terraform plan ``` @@ -199,7 +199,7 @@ Terraform creates resources when using the `apply` action in a directory contain From the `terraform-aws-gw-lambda-tutorial` directory, run `terraform apply`. Terraform will pause to show you the resources it will create and prompt you to confirm resource creation. -```sh +```bash terraform apply ``` @@ -210,14 +210,14 @@ Review the output to confirm it will only create an AWS Lambda function and IAM Next, invoke the AWS Lambda function to verify it was created and is successfully executing the application code. Use `terraform output` to retrieve the name of the AWS Lambda function you provisioned. This uses the outputs we added to the module in [create a module](./deploying-a-module.md#create-a-module) to retrieve the name of the Lambda function. Then, invoke the Lambda function directly using the AWS CLI, writing the response of the Lambda to a file called `lambda_output`. -```sh +```bash #!/bin/bash export FUNCTION_NAME=$(terraform output -raw function_name) aws lambda invoke --function-name $FUNCTION_NAME --output json lambda_output ``` The lambda `invoke` command should return a JSON blob in response with the StatusCode of 200 and the ExecutedVersion of `$LATEST`. -```sh +```bash { "StatusCode": 200, "ExecutedVersion": "$LATEST" @@ -231,7 +231,7 @@ Inspect the contents of the `lambda_output` file, you should see a string statin When you’ve completed the tutorial, clean up the resources you created to avoid incurring unexpected costs. First, execute the `terraform plan -destroy` command to show the AWS resources that will be destroyed. -```sh +```bash terraform plan -destroy ``` @@ -239,7 +239,7 @@ Review the output, it should show two resources to be destroyed — an AWS Lambd Next, execute the `destroy` command. -```sh +```bash terraform destroy ``` diff --git a/docs/iac/getting-started/deploying-a-module.md b/docs/iac/getting-started/deploying-a-module.md index 006039b958..01fc918268 100644 --- a/docs/iac/getting-started/deploying-a-module.md +++ b/docs/iac/getting-started/deploying-a-module.md @@ -20,7 +20,7 @@ This module could be referenced many times to create any number of AWS Lambda fu ### Create a basic file structure First, create the directories and files that will contain the Terraform configuration. -```sh +```bash mkdir -p terraform-aws-gw-lambda-tutorial/modules/lambda touch terraform-aws-gw-lambda-tutorial/modules/lambda/main.tf touch terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf @@ -78,7 +78,7 @@ Now that you’ve defined the resources you want to create, you need to list out Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf`. -```tf +```hcl variable "lambda_name" { type = string description = "Name that will be used for the AWS Lambda function" @@ -117,7 +117,7 @@ variable "timeout" { Terraform allows you to specify values that the module will output. Outputs are convenient ways to pass values between modules when composing a service comprised of many modules. Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf`. -```tf +```hcl output "function_name" { value = aws_lambda_function.lambda.function_name } @@ -132,7 +132,7 @@ Now that you have defined a module that creates an AWS Lambda function and IAM r Now that you have the module defined, you need to create files which will reference the module. Typically, you would create a module in one repository, then reference it in a different repository. For this tutorial, we’ll just create the reference in the top level directory for the sake of simplicity. Create a file called `main.tf`, which will contain a reference to the module, and a file called `main.py`, which will contain the Lambda function code. -```sh +```bash touch terraform-aws-gw-lambda-tutorial/main.tf touch terraform-aws-gw-lambda-tutorial/main.py ``` @@ -151,7 +151,7 @@ def lambda_handler(event, context): Next, create a reference to the module you just created in `/modules/lambda/main.tf`. This code uses the `module` block from Terraform, which references the `/modules/lambda` directory using the `source` attribute. You can then specify values for the required variables specified in `/modules/lambdas/variables.tf`. Finally, we specify an output using the value of the `module.lambda.function_name` output created in `/modules/lambdas/outputs.tf` -``` +```hcl terraform { required_providers { aws = { @@ -186,7 +186,7 @@ Running `terraform plan` is helpful when developing modules, to confirm that the From the `terraform-aws-gw-lambda-tutorial` directory, run a plan to see what resources will be created. -```sh +```bash terraform plan ``` @@ -199,7 +199,7 @@ Terraform creates resources when using the `apply` action in a directory contain From the `terraform-aws-gw-lambda-tutorial` directory, run `terraform apply`. Terraform will pause to show you the resources it will create and prompt you to confirm resource creation. -```sh +```bash terraform apply ``` @@ -210,14 +210,14 @@ Review the output to confirm it will only create an AWS Lambda function and IAM Next, invoke the AWS Lambda function to verify it was created and is successfully executing the application code. Use `terraform output` to retrieve the name of the AWS Lambda function you provisioned. This uses the outputs we added to the module in [create a module](./deploying-a-module.md#create-a-module) to retrieve the name of the Lambda function. Then, invoke the Lambda function directly using the AWS CLI, writing the response of the Lambda to a file called `lambda_output`. -```sh +```bash #!/bin/bash export FUNCTION_NAME=$(terraform output -raw function_name) aws lambda invoke --function-name $FUNCTION_NAME --output json lambda_output ``` The lambda `invoke` command should return a JSON blob in response with the StatusCode of 200 and the ExecutedVersion of `$LATEST`. -```sh +```bash { "StatusCode": 200, "ExecutedVersion": "$LATEST" @@ -231,7 +231,7 @@ Inspect the contents of the `lambda_output` file, you should see a string statin When you’ve completed the tutorial, clean up the resources you created to avoid incurring unexpected costs. First, execute the `terraform plan -destroy` command to show the AWS resources that will be destroyed. -```sh +```bash terraform plan -destroy ``` @@ -239,7 +239,7 @@ Review the output, it should show two resources to be destroyed — an AWS Lambd Next, execute the `destroy` command. -```sh +```bash terraform destroy ``` @@ -258,6 +258,6 @@ In [Using a module](../usage/using-a-module.md), you’ll learn how to create t From 8349dd4398d65a0bd883a37952a81b670e65c764 Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:18:56 -0700 Subject: [PATCH 04/10] fix syntax highlighting for python --- _docs-sources/iac/getting-started/deploying-a-module.md | 3 ++- docs/iac/getting-started/deploying-a-module.md | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/_docs-sources/iac/getting-started/deploying-a-module.md b/_docs-sources/iac/getting-started/deploying-a-module.md index 1cd5de9bd2..b978ac75b6 100644 --- a/_docs-sources/iac/getting-started/deploying-a-module.md +++ b/_docs-sources/iac/getting-started/deploying-a-module.md @@ -142,7 +142,8 @@ touch terraform-aws-gw-lambda-tutorial/main.py Next, we’ll write a simple Python function that returns a string that will be used as the entrypoint of the AWS Lambda function. Terraform will create a zip file containing this file that will be uploaded to the Lambda function. Copy the following to `terraform-aws-gw-lambda-tutorial/main.py`. -``` + +```py def lambda_handler(event, context): return "Hello from Gruntwork!" ``` diff --git a/docs/iac/getting-started/deploying-a-module.md b/docs/iac/getting-started/deploying-a-module.md index 01fc918268..3dcb4cf83c 100644 --- a/docs/iac/getting-started/deploying-a-module.md +++ b/docs/iac/getting-started/deploying-a-module.md @@ -142,7 +142,8 @@ touch terraform-aws-gw-lambda-tutorial/main.py Next, we’ll write a simple Python function that returns a string that will be used as the entrypoint of the AWS Lambda function. Terraform will create a zip file containing this file that will be uploaded to the Lambda function. Copy the following to `terraform-aws-gw-lambda-tutorial/main.py`. -``` + +```py def lambda_handler(event, context): return "Hello from Gruntwork!" ``` @@ -258,6 +259,6 @@ In [Using a module](../usage/using-a-module.md), you’ll learn how to create t From 048e76af1d4cc1d04de394bf1eb26bf9b98b518b Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:20:30 -0700 Subject: [PATCH 05/10] fix dash --- _docs-sources/iac/getting-started/deploying-a-module.md | 2 +- docs/iac/getting-started/deploying-a-module.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_docs-sources/iac/getting-started/deploying-a-module.md b/_docs-sources/iac/getting-started/deploying-a-module.md index b978ac75b6..0505a684b6 100644 --- a/_docs-sources/iac/getting-started/deploying-a-module.md +++ b/_docs-sources/iac/getting-started/deploying-a-module.md @@ -191,7 +191,7 @@ From the `terraform-aws-gw-lambda-tutorial` directory, run a plan to see what re terraform plan ``` -Review the output of `terraform plan`, it should contain two resources - an AWS Lambda function and an AWS IAM role. +Review the output of `terraform plan`, it should contain two resources — an AWS Lambda function and an AWS IAM role. ### Run Terraform apply diff --git a/docs/iac/getting-started/deploying-a-module.md b/docs/iac/getting-started/deploying-a-module.md index 3dcb4cf83c..46e6919216 100644 --- a/docs/iac/getting-started/deploying-a-module.md +++ b/docs/iac/getting-started/deploying-a-module.md @@ -191,7 +191,7 @@ From the `terraform-aws-gw-lambda-tutorial` directory, run a plan to see what re terraform plan ``` -Review the output of `terraform plan`, it should contain two resources - an AWS Lambda function and an AWS IAM role. +Review the output of `terraform plan`, it should contain two resources — an AWS Lambda function and an AWS IAM role. ### Run Terraform apply @@ -259,6 +259,6 @@ In [Using a module](../usage/using-a-module.md), you’ll learn how to create t From 5f9ebbd30f24719928eb7f2ce7801ddf135785aa Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:27:04 -0700 Subject: [PATCH 06/10] add file names --- .../iac/getting-started/deploying-a-module.md | 12 ++++++------ docs/iac/getting-started/deploying-a-module.md | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/_docs-sources/iac/getting-started/deploying-a-module.md b/_docs-sources/iac/getting-started/deploying-a-module.md index 0505a684b6..5b062ff442 100644 --- a/_docs-sources/iac/getting-started/deploying-a-module.md +++ b/_docs-sources/iac/getting-started/deploying-a-module.md @@ -32,7 +32,7 @@ touch terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf First, define the resources that should be created by the module. This is where you define resource level blocks provided by Terraform. For this module, we need an AWS Lambda function and an IAM role that will be used by the Lambda function. Paste the following snippet in `terraform-aws-gw-lambda/modules/lambda/main.tf`. -```hcl +```hcl title="terraform-aws-gw-lambda/modules/lambda/main.tf" resource "aws_iam_role" "lambda_role" { name = "${var.lambda_name}-role" @@ -78,7 +78,7 @@ Now that you’ve defined the resources you want to create, you need to list out Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf`. -```hcl +```hcl title="terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf" variable "lambda_name" { type = string description = "Name that will be used for the AWS Lambda function" @@ -117,7 +117,7 @@ variable "timeout" { Terraform allows you to specify values that the module will output. Outputs are convenient ways to pass values between modules when composing a service comprised of many modules. Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf`. -```hcl +```hcl title="terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf" output "function_name" { value = aws_lambda_function.lambda.function_name } @@ -143,7 +143,7 @@ Next, we’ll write a simple Python function that returns a string that will be Copy the following to `terraform-aws-gw-lambda-tutorial/main.py`. -```py +```py title="terraform-aws-gw-lambda-tutorial/main.py" def lambda_handler(event, context): return "Hello from Gruntwork!" ``` @@ -152,7 +152,7 @@ def lambda_handler(event, context): Next, create a reference to the module you just created in `/modules/lambda/main.tf`. This code uses the `module` block from Terraform, which references the `/modules/lambda` directory using the `source` attribute. You can then specify values for the required variables specified in `/modules/lambdas/variables.tf`. Finally, we specify an output using the value of the `module.lambda.function_name` output created in `/modules/lambdas/outputs.tf` -```hcl +```hcl title="terraform-aws-gw-lambda-tutorial/main.tf" terraform { required_providers { aws = { @@ -218,7 +218,7 @@ aws lambda invoke --function-name $FUNCTION_NAME --output json lambda_output ``` The lambda `invoke` command should return a JSON blob in response with the StatusCode of 200 and the ExecutedVersion of `$LATEST`. -```bash +```json { "StatusCode": 200, "ExecutedVersion": "$LATEST" diff --git a/docs/iac/getting-started/deploying-a-module.md b/docs/iac/getting-started/deploying-a-module.md index 46e6919216..b5ee9b14c7 100644 --- a/docs/iac/getting-started/deploying-a-module.md +++ b/docs/iac/getting-started/deploying-a-module.md @@ -32,7 +32,7 @@ touch terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf First, define the resources that should be created by the module. This is where you define resource level blocks provided by Terraform. For this module, we need an AWS Lambda function and an IAM role that will be used by the Lambda function. Paste the following snippet in `terraform-aws-gw-lambda/modules/lambda/main.tf`. -```hcl +```hcl title="terraform-aws-gw-lambda/modules/lambda/main.tf" resource "aws_iam_role" "lambda_role" { name = "${var.lambda_name}-role" @@ -78,7 +78,7 @@ Now that you’ve defined the resources you want to create, you need to list out Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf`. -```hcl +```hcl title="terraform-aws-gw-lambda-tutorial/modules/lambda/variables.tf" variable "lambda_name" { type = string description = "Name that will be used for the AWS Lambda function" @@ -117,7 +117,7 @@ variable "timeout" { Terraform allows you to specify values that the module will output. Outputs are convenient ways to pass values between modules when composing a service comprised of many modules. Copy the following snippet into `terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf`. -```hcl +```hcl title="terraform-aws-gw-lambda-tutorial/modules/lambda/outputs.tf" output "function_name" { value = aws_lambda_function.lambda.function_name } @@ -143,7 +143,7 @@ Next, we’ll write a simple Python function that returns a string that will be Copy the following to `terraform-aws-gw-lambda-tutorial/main.py`. -```py +```py title="terraform-aws-gw-lambda-tutorial/main.py" def lambda_handler(event, context): return "Hello from Gruntwork!" ``` @@ -152,7 +152,7 @@ def lambda_handler(event, context): Next, create a reference to the module you just created in `/modules/lambda/main.tf`. This code uses the `module` block from Terraform, which references the `/modules/lambda` directory using the `source` attribute. You can then specify values for the required variables specified in `/modules/lambdas/variables.tf`. Finally, we specify an output using the value of the `module.lambda.function_name` output created in `/modules/lambdas/outputs.tf` -```hcl +```hcl title="terraform-aws-gw-lambda-tutorial/main.tf" terraform { required_providers { aws = { @@ -218,7 +218,7 @@ aws lambda invoke --function-name $FUNCTION_NAME --output json lambda_output ``` The lambda `invoke` command should return a JSON blob in response with the StatusCode of 200 and the ExecutedVersion of `$LATEST`. -```bash +```json { "StatusCode": 200, "ExecutedVersion": "$LATEST" @@ -259,6 +259,6 @@ In [Using a module](../usage/using-a-module.md), you’ll learn how to create t From 90663196c6703bc8392d3acf15a007851bcf2dd1 Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:31:20 -0700 Subject: [PATCH 07/10] fix ticks --- _docs-sources/iac/stay-up-to-date/versioning.md | 6 +++--- docs/iac/stay-up-to-date/versioning.md | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/_docs-sources/iac/stay-up-to-date/versioning.md b/_docs-sources/iac/stay-up-to-date/versioning.md index 423ecf3cc8..7383adbcf7 100644 --- a/_docs-sources/iac/stay-up-to-date/versioning.md +++ b/_docs-sources/iac/stay-up-to-date/versioning.md @@ -5,7 +5,7 @@ Gruntwork versions the IaC library using [Semantic Versioning](https://semver.or - MINOR version when we make backward incompatible API changes, and - PATCH version when we add backward compatible functionality or bug fixes -For modules that have submodules (e.g., terraform-aws-server/modules/single-server), not every release contains changes to every module. While using the latest available version is recommended, the version that most recently contains changes for a module can be found in each submodule's reference in the [Library Reference](../reference/index.md). +For modules that have submodules (e.g., terraform-aws-server/modules/single-server), not every release contains changes to every module. While using the latest available version is recommended, the version that most recently contains changes for a module can be found in each submodule’s reference in the [Library Reference](../reference/index.md). We release new module versions using GitHub releases, refer to the release notes in the GitHub repository release page for a list of changes and migration guides (when necessary). @@ -29,6 +29,6 @@ module "my_instance" { } ``` -## What's next +## What’s next -Once you start using versioned modules, it's important to keep the modules up to date. Refer to the [Updating](./updating.md) guide to learn more. +Once you start using versioned modules, it’s important to keep the modules up to date. Refer to the [Updating](./updating.md) guide to learn more. diff --git a/docs/iac/stay-up-to-date/versioning.md b/docs/iac/stay-up-to-date/versioning.md index fae7340975..04d84c925e 100644 --- a/docs/iac/stay-up-to-date/versioning.md +++ b/docs/iac/stay-up-to-date/versioning.md @@ -5,7 +5,7 @@ Gruntwork versions the IaC library using [Semantic Versioning](https://semver.or - MINOR version when we make backward incompatible API changes, and - PATCH version when we add backward compatible functionality or bug fixes -For modules that have submodules (e.g., terraform-aws-server/modules/single-server), not every release contains changes to every module. While using the latest available version is recommended, the version that most recently contains changes for a module can be found in each submodule's reference in the [Library Reference](../reference/index.md). +For modules that have submodules (e.g., terraform-aws-server/modules/single-server), not every release contains changes to every module. While using the latest available version is recommended, the version that most recently contains changes for a module can be found in each submodule’s reference in the [Library Reference](../reference/index.md). We release new module versions using GitHub releases, refer to the release notes in the GitHub repository release page for a list of changes and migration guides (when necessary). @@ -29,14 +29,14 @@ module "my_instance" { } ``` -## What's next +## What’s next -Once you start using versioned modules, it's important to keep the modules up to date. Refer to the [Updating](./updating.md) guide to learn more. +Once you start using versioned modules, it’s important to keep the modules up to date. Refer to the [Updating](./updating.md) guide to learn more. From 720af9777990ace3a8eef06a6c0a5a4727711923 Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:33:56 -0700 Subject: [PATCH 08/10] fix more things --- _docs-sources/iac/stay-up-to-date/updating.md | 2 +- _docs-sources/iac/stay-up-to-date/versioning.md | 2 +- docs/iac/stay-up-to-date/updating.md | 4 ++-- docs/iac/stay-up-to-date/versioning.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_docs-sources/iac/stay-up-to-date/updating.md b/_docs-sources/iac/stay-up-to-date/updating.md index a356637dac..28299fbe22 100644 --- a/_docs-sources/iac/stay-up-to-date/updating.md +++ b/_docs-sources/iac/stay-up-to-date/updating.md @@ -10,7 +10,7 @@ Below is a module block referencing version `0.15.3` of the `single-server` subm To update to version `0.15.4`, you update the value to the right of `ref=` in the source attribute. Since the version number denotes that this update is backwards compatible, it should not require any other changes. -```tf +```hcl module "my_instance" { # Old # source = "git::git@github.com:gruntwork-io/terraform-aws-server.git//modules/single-server?ref=v0.15.3" diff --git a/_docs-sources/iac/stay-up-to-date/versioning.md b/_docs-sources/iac/stay-up-to-date/versioning.md index 7383adbcf7..b33afe0f45 100644 --- a/_docs-sources/iac/stay-up-to-date/versioning.md +++ b/_docs-sources/iac/stay-up-to-date/versioning.md @@ -14,7 +14,7 @@ We release new module versions using GitHub releases, refer to the release notes The git tag created by the release can then be referenced in the source argument for a module block sourcing from a git URL. For example, below is a module block referencing version `0.15.4` of the `single-server` submodule from the `terraform-aws-server` module. -```tf +```hcl module "my_instance" { source = "git::git@github.com:gruntwork-io/terraform-aws-server.git//modules/single-server?ref=v0.15.4" diff --git a/docs/iac/stay-up-to-date/updating.md b/docs/iac/stay-up-to-date/updating.md index cefa6bc443..a74745ec52 100644 --- a/docs/iac/stay-up-to-date/updating.md +++ b/docs/iac/stay-up-to-date/updating.md @@ -10,7 +10,7 @@ Below is a module block referencing version `0.15.3` of the `single-server` subm To update to version `0.15.4`, you update the value to the right of `ref=` in the source attribute. Since the version number denotes that this update is backwards compatible, it should not require any other changes. -```tf +```hcl module "my_instance" { # Old # source = "git::git@github.com:gruntwork-io/terraform-aws-server.git//modules/single-server?ref=v0.15.3" @@ -39,6 +39,6 @@ Keeping track of all references to modules and services is a complicated, error diff --git a/docs/iac/stay-up-to-date/versioning.md b/docs/iac/stay-up-to-date/versioning.md index 04d84c925e..d30304ccdc 100644 --- a/docs/iac/stay-up-to-date/versioning.md +++ b/docs/iac/stay-up-to-date/versioning.md @@ -14,7 +14,7 @@ We release new module versions using GitHub releases, refer to the release notes The git tag created by the release can then be referenced in the source argument for a module block sourcing from a git URL. For example, below is a module block referencing version `0.15.4` of the `single-server` submodule from the `terraform-aws-server` module. -```tf +```hcl module "my_instance" { source = "git::git@github.com:gruntwork-io/terraform-aws-server.git//modules/single-server?ref=v0.15.4" @@ -37,6 +37,6 @@ Once you start using versioned modules, it’s important to keep the modules up From c6ee01a384e3bea4694b9bf588f6ece89b3e0373 Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 14:53:11 -0700 Subject: [PATCH 09/10] remove link to empty page --- _docs-sources/iac/getting-started/deploying-a-module.md | 2 -- docs/iac/getting-started/deploying-a-module.md | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/_docs-sources/iac/getting-started/deploying-a-module.md b/_docs-sources/iac/getting-started/deploying-a-module.md index 5b062ff442..9ed81cada7 100644 --- a/_docs-sources/iac/getting-started/deploying-a-module.md +++ b/_docs-sources/iac/getting-started/deploying-a-module.md @@ -252,5 +252,3 @@ Finally, when prompted, enter `yes` to confirm the resource deletion. Terraform Now that you’ve developed and deployed your first Terraform module, try creating another module that leverages the module you just created. For example, make your Lambda function available via a URL using an [AWS API Gateway HTTP API](../../reference/modules/terraform-aws-lambda/api-gateway-proxy/) with an AWS Lambda integration. Then, write a test using [Terratest](https://terratest.gruntwork.io/) that confirms your module creates resources as you’d expect. Finally, consider what other resources you would create to make your modules ready to use in production. For example, you would likely need to add [metrics](../../reference/modules/terraform-aws-monitoring/metrics/metrics.md) and [alerting](../../reference/modules/terraform-aws-monitoring/alarms/alarms.md). - -In [Using a module](../usage/using-a-module.md), you’ll learn how to create the same resources defined in these modules using a pre-built Gruntwork module. diff --git a/docs/iac/getting-started/deploying-a-module.md b/docs/iac/getting-started/deploying-a-module.md index b5ee9b14c7..a8610ec3d1 100644 --- a/docs/iac/getting-started/deploying-a-module.md +++ b/docs/iac/getting-started/deploying-a-module.md @@ -253,12 +253,10 @@ Now that you’ve developed and deployed your first Terraform module, try creati Finally, consider what other resources you would create to make your modules ready to use in production. For example, you would likely need to add [metrics](../../reference/modules/terraform-aws-monitoring/metrics/metrics.md) and [alerting](../../reference/modules/terraform-aws-monitoring/alarms/alarms.md). -In [Using a module](../usage/using-a-module.md), you’ll learn how to create the same resources defined in these modules using a pre-built Gruntwork module. - From eaf906b4a23de728d49a3895af89f4ac8bd76bab Mon Sep 17 00:00:00 2001 From: Maxwell Moon Date: Thu, 25 May 2023 15:06:08 -0700 Subject: [PATCH 10/10] add screenshot for versioning --- _docs-sources/iac/stay-up-to-date/versioning.md | 2 ++ docs/iac/stay-up-to-date/versioning.md | 4 +++- .../versioning/module_release_tag_versions.png | Bin 0 -> 15448 bytes 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 static/img/iac/stay-up-to-date/versioning/module_release_tag_versions.png diff --git a/_docs-sources/iac/stay-up-to-date/versioning.md b/_docs-sources/iac/stay-up-to-date/versioning.md index b33afe0f45..35601ca3b3 100644 --- a/_docs-sources/iac/stay-up-to-date/versioning.md +++ b/_docs-sources/iac/stay-up-to-date/versioning.md @@ -7,6 +7,8 @@ Gruntwork versions the IaC library using [Semantic Versioning](https://semver.or For modules that have submodules (e.g., terraform-aws-server/modules/single-server), not every release contains changes to every module. While using the latest available version is recommended, the version that most recently contains changes for a module can be found in each submodule’s reference in the [Library Reference](../reference/index.md). +![Submodules show the last version in which they were modified](/img/iac/stay-up-to-date/versioning/module_release_tag_versions.png) + We release new module versions using GitHub releases, refer to the release notes in the GitHub repository release page for a list of changes and migration guides (when necessary). ## Example: Reference a version diff --git a/docs/iac/stay-up-to-date/versioning.md b/docs/iac/stay-up-to-date/versioning.md index d30304ccdc..068cbfc8c4 100644 --- a/docs/iac/stay-up-to-date/versioning.md +++ b/docs/iac/stay-up-to-date/versioning.md @@ -7,6 +7,8 @@ Gruntwork versions the IaC library using [Semantic Versioning](https://semver.or For modules that have submodules (e.g., terraform-aws-server/modules/single-server), not every release contains changes to every module. While using the latest available version is recommended, the version that most recently contains changes for a module can be found in each submodule’s reference in the [Library Reference](../reference/index.md). +![Submodules show the last version in which they were modified](/img/iac/stay-up-to-date/versioning/module_release_tag_versions.png) + We release new module versions using GitHub releases, refer to the release notes in the GitHub repository release page for a list of changes and migration guides (when necessary). ## Example: Reference a version @@ -37,6 +39,6 @@ Once you start using versioned modules, it’s important to keep the modules up diff --git a/static/img/iac/stay-up-to-date/versioning/module_release_tag_versions.png b/static/img/iac/stay-up-to-date/versioning/module_release_tag_versions.png new file mode 100644 index 0000000000000000000000000000000000000000..009d5071e04a253390bae300cb91f60ce057dce3 GIT binary patch literal 15448 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 mljm{Mf4mxhk$y4Otyt~~TVnn1p(p_C^+rZTx