How to Fetch AWS Auto Scaling Group Name from EC2 Instance Metadata and CLI


2 views

When working with Auto Scaling Groups (ASGs) in AWS, you'll quickly discover that instance-specific tags aren't automatically propagated to spawned EC2 instances. This creates a significant pain point when you need to:

  • Access ASG configuration details from within the instance
  • Use ASG-level tags in bootstrap scripts
  • Implement dynamic configuration based on ASG membership

1. Using Instance Metadata Service (IMDS)

The simplest way to retrieve ASG information from within a running instance:

curl http://169.254.169.254/latest/meta-data/autoscaling-group-name

For more comprehensive metadata including ASG ARN:

curl http://169.254.169.254/latest/meta-data/placement/availability-zone
curl http://169.254.169.254/latest/meta-data/instance-id
aws autoscaling describe-auto-scaling-instances \
  --instance-ids $(curl -s http://169.254.169.254/latest/meta-data/instance-id) \
  --query 'AutoScalingInstances[].AutoScalingGroupName' \
  --output text

2. AWS CLI Approach (External to Instance)

When working from your local machine or CI/CD pipeline:

#!/bin/bash
INSTANCE_ID="i-0123456789abcdef0"
REGION="us-west-2"

ASG_NAME=$(aws autoscaling describe-auto-scaling-instances \
  --instance-ids $INSTANCE_ID \
  --region $REGION \
  --query 'AutoScalingInstances[0].AutoScalingGroupName' \
  --output text)

echo "Instance belongs to ASG: $ASG_NAME"

3. Programmatic Solutions

Python example using Boto3:

import boto3

def get_asg_name(instance_id, region='us-west-2'):
    client = boto3.client('autoscaling', region_name=region)
    response = client.describe_auto_scaling_instances(
        InstanceIds=[instance_id]
    )
    return response['AutoScalingInstances'][0]['AutoScalingGroupName']

# Usage:
instance_id = 'i-0123456789abcdef0'
asg_name = get_asg_name(instance_id)
print(f"ASG Name: {asg_name}")

Once you have the ASG name, you can retrieve its tags:

ASG_NAME=$(curl -s http://169.254.169.254/latest/meta-data/autoscaling-group-name)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//')

aws autoscaling describe-tags \
  --filters "Name=auto-scaling-group,Values=$ASG_NAME" \
  --region $REGION \
  --query 'Tags[?PropagateAtLaunch==true].[Key,Value]' \
  --output text | while read key value; do
    echo "Exporting tag: $key=$value"
    export $key="$value"
done
  • IMDSv2 Requirement: Modern AWS environments may require IMDSv2 tokens. Use this pattern:
  • TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
    curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/autoscaling-group-name
    
  • Region Detection: Always detect the region dynamically:
  • REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//')
    

When working with AWS Auto Scaling Groups (ASGs), many developers encounter this frustrating scenario: Instance tags defined at the ASG level don't propagate to the actual EC2 instances. This becomes problematic when you need to:

  • Access ASG-specific configurations from within instance user-data scripts
  • Implement tag-based logic in bootstrap scripts
  • Maintain consistent metadata across scaled instances

Here's how to programmatically determine the ASG membership of any EC2 instance:

#!/bin/bash
# Get instance ID from metadata
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# Get ASG name using AWS CLI
ASG_NAME=$(aws autoscaling describe-auto-scaling-instances \
  --instance-ids $INSTANCE_ID \
  --query "AutoScalingInstances[0].AutoScalingGroupName" \
  --output text)

echo "Instance ${INSTANCE_ID} belongs to ASG: ${ASG_NAME}"

Once you have the ASG name, you can fetch its tags:

# Fetch all tags for the ASG
aws autoscaling describe-tags \
  --filters "Name=auto-scaling-group,Values=${ASG_NAME}" \
  --query "Tags[].{Key:Key,Value:Value}" \
  --output json

Here's a complete Python solution using Boto3:

import boto3
import requests

def get_asg_tags():
    # Initialize clients
    ec2 = boto3.client('ec2')
    autoscaling = boto3.client('autoscaling')
    
    # Get instance metadata
    instance_id = requests.get(
        'http://169.254.169.254/latest/meta-data/instance-id'
    ).text
    
    # Get ASG information
    response = autoscaling.describe_auto_scaling_instances(
        InstanceIds=[instance_id]
    )
    
    if not response['AutoScalingInstances']:
        return None
        
    asg_name = response['AutoScalingInstances'][0]['AutoScalingGroupName']
    
    # Get ASG tags
    tag_response = autoscaling.describe_tags(
        Filters=[{'Name': 'auto-scaling-group', 'Values': [asg_name]}]
    )
    
    return {
        tag['Key']: tag['Value']
        for tag in tag_response['Tags']
        if tag['ResourceType'] == 'auto-scaling-group'
    }

Ensure your instance role has these permissions:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeTags"
            ],
            "Resource": "*"
        }
    ]
}

For environments where CLI isn't available, consider these methods:

  • User Data Injection: Pass ASG name and critical tags through instance user-data during launch
  • Systems Manager Parameter Store: Store ASG metadata in SSM and retrieve during bootstrap
  • Instance Metadata Service V2: Some AWS services now expose ASG information via IMDSv2