Packer配置:如何赋予EC2实例访问S3的权限
解决Packer实例访问S3的凭证缺失问题
当Packer启动的EC2实例执行aws s3 cp时出现fatal error: Unable to locate credentials,本质是实例没有被授予访问S3的权限或凭证。以下是几种解决方式,优先推荐IAM实例角色方案:
方法1:使用IAM实例角色(安全最佳实践)
这种方式不需要在代码中嵌入任何凭证,实例会自动获取临时权限:
创建IAM角色与权限策略
新建一个IAM角色,附加允许访问目标S3对象的权限策略,示例策略如下(替换资源路径为你的实际S3路径):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::path/to/kaiju/viruses/names.dmp" } ] }同时确保角色的信任策略允许EC2服务扮演它:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }在Packer配置中关联角色
在amazon-ebsvolume源配置里添加iam_instance_profile参数,指定你创建的IAM角色名称:source "amazon-ebsvolume" "data-volume" { region = "us-east-1" ssh_username = "ubuntu" instance_type = "t2.micro" # 新增:关联IAM实例角色 iam_instance_profile = "你的IAM实例角色名称" source_ami_filter { filters = { name = "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*" root-device-type = "ebs" virtualization-type = "hvm" } most_recent = true owners = ["099720109477"] } ebs_volumes { volume_type = "gp2" device_name = "/dev/xvdf" delete_on_termination = false tags = { zpool = "data" Name = "development-data" } volume_size = 20 } }配置完成后,Packer启动的实例会自动获取角色权限,无需额外配置AWS CLI即可访问S3。
方法2:通过环境变量传递凭证(仅临时测试用)
如果暂时无法使用IAM角色,可以通过环境变量直接传递凭证,但生产环境禁止使用,存在凭证泄露风险:
provisioner "shell" { environment_vars = [ "DATA_PATH=data", "AWS_ACCESS_KEY_ID=你的AWS访问密钥ID", "AWS_SECRET_ACCESS_KEY=你的AWS秘密访问密钥" ] inline = [ "rm -rf $DATA_PATH", "mkdir $DATA_PATH", "aws s3 cp s3://path/to/kaiju/viruses/names.dmp $DATA_PATH/names.dmp" ] }
方法3:使用Packer变量传入凭证(比硬编码安全)
通过Packer变量传递凭证,避免硬编码在配置文件中:
- 定义变量
在配置文件开头添加变量定义:variable "aws_access_key_id" { type = string } variable "aws_secret_access_key" { type = string } - 在provisioner中引用变量
provisioner "shell" { environment_vars = [ "DATA_PATH=data", "AWS_ACCESS_KEY_ID=${var.aws_access_key_id}", "AWS_SECRET_ACCESS_KEY=${var.aws_secret_access_key}" ] inline = [ "rm -rf $DATA_PATH", "mkdir $DATA_PATH", "aws s3 cp s3://path/to/kaiju/viruses/names.dmp $DATA_PATH/names.dmp" ] } - 构建时传入变量
执行Packer构建时通过命令行传入凭证:packer build -var 'aws_access_key_id=你的访问密钥ID' -var 'aws_secret_access_key=你的秘密访问密钥' .
内容的提问来源于stack exchange,提问作者spitfiredd
相关产品推荐
相关产品推荐

