如何在Shell脚本中提取EC2实例的InstanceProfileArn并存储到变量
提取EC2实例的InstanceProfileArn并获取实例名
问题描述
需要在Shell脚本中获取EC2实例的实例名,已通过以下命令获取到IAM元数据的JSON输出:
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" -v http://169.254.169.254/latest/meta-data/iam/info
返回的JSON格式如下:
{ "Code":"Success", "LastUpdated":"date", "InstanceProfileArn" : "arn:aws:iam::123456789012:instance-profile/instance-name", "InstanceProfileId" : "AIPAJ2XQ7Yexample" }
需要提取其中的InstanceProfileArn字段值,并进一步从中分离出实例名,存储到Shell变量中供后续使用。
解决方案
方法一:使用jq工具解析(推荐)
jq是专门处理JSON的工具,可读性和稳定性更强,需提前安装(如apt install jq或yum install jq):
# 1. 获取EC2元数据令牌 TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") # 2. 获取IAM信息并提取InstanceProfileArn INSTANCE_PROFILE_ARN=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/info | jq -r '.InstanceProfileArn') # 3. 从Arn中提取实例名(Arn最后一段为实例名,用/分割取最后一个元素) INSTANCE_NAME=$(echo "$INSTANCE_PROFILE_ARN" | awk -F '/' '{print $NF}') # 验证结果(可选) echo "提取到的实例名: $INSTANCE_NAME"
方法二:纯文本工具解析(无需额外安装)
如果无法安装jq,可以用grep+sed组合处理:
# 1. 获取EC2元数据令牌 TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") # 2. 提取InstanceProfileArn INSTANCE_PROFILE_ARN=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/info | grep -o '"InstanceProfileArn" : "[^"]*"' | sed -E 's/"InstanceProfileArn" : "([^"]*)"/\1/') # 3. 提取实例名 INSTANCE_NAME=$(echo "$INSTANCE_PROFILE_ARN" | awk -F '/' '{print $NF}')
内容的提问来源于stack exchange,提问作者Tejaswini Reddy Puli
相关产品推荐
相关产品推荐

