Browse the Repo

file-type-icon.circleci
file-type-icon_docs
file-type-iconexamples
file-type-iconmodules
file-type-iconattach-eni
file-type-icondisable-instance-metadata
file-type-iconec2-backup
file-type-iconpersistent-ebs-volume
file-type-iconrequire-instance-metadata-service-version
file-type-iconbin
file-type-iconREADME.md
file-type-iconinstall.sh
file-type-iconroute53-helpers
file-type-iconsingle-server
file-type-icontest
file-type-icon.gitignore
file-type-icon.pre-commit-config.yaml
file-type-iconCODEOWNERS
file-type-iconLICENSE.txt
file-type-iconREADME.adoc
file-type-iconcore-concepts.md
file-type-iconterraform-cloud-enterprise-private-module-...

Browse the Repo

file-type-icon.circleci
file-type-icon_docs
file-type-iconexamples
file-type-iconmodules
file-type-iconattach-eni
file-type-icondisable-instance-metadata
file-type-iconec2-backup
file-type-iconpersistent-ebs-volume
file-type-iconrequire-instance-metadata-service-version
file-type-iconbin
file-type-iconREADME.md
file-type-iconinstall.sh
file-type-iconroute53-helpers
file-type-iconsingle-server
file-type-icontest
file-type-icon.gitignore
file-type-icon.pre-commit-config.yaml
file-type-iconCODEOWNERS
file-type-iconLICENSE.txt
file-type-iconREADME.adoc
file-type-iconcore-concepts.md
file-type-iconterraform-cloud-enterprise-private-module-...
Single EC2 Instance

Single EC2 Instance

Run a single EC2 instance for stateless or stateful apps. Supports IAM roles, EBS volumes, ENIs, and EIPs.

Code Preview

Preview the Code

mobile file icon

README.md

down

Require Instance Metadata Service version script

This folder contains a script (require-instance-metadata-service-version) you can use to either:

  1. Allow access to both versions 1.0 and 2.0 of the Instance Metadata Service
  2. Disable version 1.0 of the Instance Metadata Service and require that version 2.0 be used

Learn more at the official AWS EC2 Instance Metadata Service documentation.

Check out the route53-helpers example for how to use these scripts with Packer and Terraform.

Installing bash-commons

bash-commons is a dependency of this script. You must first install it via the Gruntwork Installer. This script requires version v0.1.8 of bash-commons or newer.

gruntwork-install --module-name "bash-commons" --repo "https://github.com/gruntwork-io/bash-commons" --tag "0.1.8"

Installing the script

You can install these scripts using the Gruntwork Installer:

gruntwork-install --module-name "require-instance-metadata-service-version" --repo "https://github.com/gruntwork-io/terraform-aws-server" --tag "0.13.3"

Using the script

The require-instance-metadata-service-version script has the following prerequisites:

  1. It must be run on an EC2 instance
  2. It requires that bash-commons version v0.1.8 or newer is installed on the EC2 Instance. See instructions above.
  3. The EC2 instance must have an IAM role with permissions to modify the Instance Metadata service's options. See the route53-helpers example) for a reference implementation.
  4. The EC2 instance must have the AWS CLI (version 2.2.37 or higher), unzip and jq installed.

Run the require-instance-metadata-service-version script in the User Data of your EC2 instances, prior to any calls to the Instance Metadata Service to configure if you want 2.0 credentials to be required or optional.

Here is an example usage:

# Require that only IMDS version 2.0 be used, disabling version 1.0
require-instance-metadata-service-version --version-2-state 'required'

# Allow either IMDS 1.0 or 2.0 versions to be used
require-instance-metadata-service-version --version-2-state 'optional'

Example output:

Setting Instance Metadata Service version 2 state to required
{
    "InstanceId": "i-002132f6f69e13b22",
    "InstanceMetadataOptions": {
        "State": "pending",
        "HttpTokens": "required",
        "HttpPutResponseHopLimit": 1,
        "HttpEndpoint": "enabled",
        "HttpProtocolIpv6": "disabled"
    }
}

...

Setting Instance Metadata Service version 2 state to optional
{
    "InstanceId": "i-002132f6f69e13b22",
    "InstanceMetadataOptions": {
        "State": "pending",
        "HttpTokens": "optional",
        "HttpPutResponseHopLimit": 1,
        "HttpEndpoint": "enabled",
        "HttpProtocolIpv6": "disabled"
    }
}

Questions? Ask away.

We're here to talk about our services, answer any questions, give advice, or just to chat.

Ready to hand off the Gruntwork?