You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Packer配置:如何赋予EC2实例访问S3的权限

解决Packer实例访问S3的凭证缺失问题

当Packer启动的EC2实例执行aws s3 cp时出现fatal error: Unable to locate credentials,本质是实例没有被授予访问S3的权限或凭证。以下是几种解决方式,优先推荐IAM实例角色方案:

方法1:使用IAM实例角色(安全最佳实践)

这种方式不需要在代码中嵌入任何凭证,实例会自动获取临时权限:

  1. 创建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"
        }
      ]
    }
    
  2. 在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变量传递凭证,避免硬编码在配置文件中:

  1. 定义变量
    在配置文件开头添加变量定义:
    variable "aws_access_key_id" {
      type = string
    }
    
    variable "aws_secret_access_key" {
      type = string
    }
    
  2. 在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"
      ]
    }
    
  3. 构建时传入变量
    执行Packer构建时通过命令行传入凭证:
    packer build -var 'aws_access_key_id=你的访问密钥ID' -var 'aws_secret_access_key=你的秘密访问密钥' .
    

内容的提问来源于stack exchange,提问作者spitfiredd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:23:10