Ruby v2 的 aws-sdk:在我将对象放入 S3 存储桶后检查成功状态

Posted

技术标签:

【中文标题】Ruby v2 的 aws-sdk:在我将对象放入 S3 存储桶后检查成功状态【英文标题】:aws-sdk for Ruby v2: check success status after I PUT object in S3 bucket 【发布时间】:2017-03-01 12:19:08 【问题描述】:

我正在使用适用于 Ruby 的 aws-sdk v2,我发现对象上可用的方法非常有限。我像这样创建了一个存储桶:

client = Aws::S3::Client.new(region: 'us-west-2')
s3 = Aws::S3::Resource.new(client: client)
S3_BUCKET = s3.bucket(ENV['AWS_BUCKET'])

我发现可以将对象写入我的存储桶的唯一方法是put. 但是,我没有看到此方法可用的“success_action_status”。我已将我的应用程序部署到 Elastic Beanstalk。在本地,我可以写入此存储桶,但是当我尝试写入我的 eb 应用程序时,它无法正常工作,我正在盲目地试图弄清楚发生了什么。任何有助于确定我的 PUT 请求出错的信息都会有所帮助。

这是我的方法现在的样子:

  def create
    username = params[:user][:user_alias]
    key = "uploads/#username"
    obj = S3_BUCKET.object(key)

    obj.put(
      acl: 'public-read',
      body: params[:user][:image_uri],
    )

    @user = User.new(user_params)
    if @user.save
      render json: @user, status: :created, location: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

这是我所指的有关 PUT 方法的文档:http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#put-instance_method

【问题讨论】:

【参考方案1】:

您似乎不是在puting 图像文件,只有 uri。文档对put 方法的body 选项这么说:

body: source_file, # file/IO object, or string data

您必须阅读或打开图像文件才能实际上传图像:

obj.put(
  acl: 'public-read',
  body: File.open(params[:user][:image_uri], ?r),
)

然后你可以通过exists?查看成功状态

【讨论】:

有道理,谢谢!图片将被设置为 bytea 数据类型 - 我还需要读取/打开它才能上传吗? 另外,我很困惑为什么有些东西会在本地发布到 S3,但部署的应用程序上什么也没有。现在我正在通过传入一个字符串进行测试,当我在本地发布时,该字符串出现在 S3 存储桶中,但是当我在 eb 上执行完全相同的帖子时,什么也没有出现。为什么它在已部署的版本上不起作用? 您的服务器是否具有 AWS 凭据或允许其写入 S3 的策略? 我没有主动设置,所以可能没有。我一直在查看文档,但不清楚如何为我的 Elastic Beanstalk 应用程序提供写入 S3 的策略。 您必须登录您的 AWS 控制台,转到 EC2 部分,那里应该有您的应用程序的实例以及向其添加策略的选项docs.aws.amazon.com/AWSEC2/latest/UserGuide/…

以上是关于Ruby v2 的 aws-sdk:在我将对象放入 S3 存储桶后检查成功状态的主要内容,如果未能解决你的问题,请参考以下文章

使用 aws-sdk ruby​​ gem 知道自己的实例 ID

使用 aws-sdk-v1 从 ruby​​ 脚本中的 AWS SSM Parameter Store 获取数据

Ruby返回的HTTPVersionNotSupported对象

如何将应用程序对象放入片段类

aws-sdk bucket.getObject:没有“访问控制允许来源”错误

即使在提供区域之后,aws-sdk v3 lambda 区域也缺失