如何构建无需强制IMDSv2的AL2023 AMI?
解决方法:通过Cloud-Init自动配置IMDS选项
因为IMDS的强制要求是实例级属性,无法直接在AMI中固化,但可以通过在AMI中预置Cloud-Init脚本,让实例启动后自动修改自身的IMDS配置,绕过Terraform启动配置的限制。
具体步骤如下:
在Packer构建过程中添加Cloud-Init脚本
在Packer的provisioner阶段添加shell脚本,将自定义Cloud-Init配置写入实例的Cloud-Init配置目录:cat <<EOF > /etc/cloud/cloud.cfg.d/01-disable-imdsv2-force.cfg runcmd: - > INSTANCE_ID=\$(curl -s http://169.254.169.254/latest/meta-data/instance-id) aws ec2 modify-instance-metadata-options --instance-id \$INSTANCE_ID --require-imdsv2 false --http-endpoint enabled --http-put-response-hop-limit 2 EOF该脚本会在实例启动时自动获取自身ID,调用AWS CLI修改IMDS选项,禁用IMDSv2强制要求。
确保实例具备修改权限
构建AMI的临时实例需要拥有ec2:ModifyInstanceMetadataOptions权限,可通过指定具备该权限的IAM实例配置文件,或在实例的IAM角色中添加对应权限策略。构建并验证AMI
完成Packer构建后,启动测试实例,执行以下命令验证配置是否生效:aws ec2 describe-instance-metadata-options --instance-id <你的实例ID>检查输出中
RequireImdsv2字段是否为false。
替代方案(若适用)
如果你的旧Terraform版本支持EC2 Launch Template,可创建Launch Template并配置:
resource "aws_launch_template" "example" { # 其他配置... metadata_options { require_imdsv2 = false } }
之后让Terraform通过Launch Template创建实例,替代原有的Launch Config。
注意:Cloud-Init脚本执行需要实例能访问EC2 API,需确保实例有公网访问权限或配置了EC2 VPC端点。
内容的提问来源于stack exchange,提问作者Tien Dung Tran
相关产品推荐
相关产品推荐

