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=$(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