标签: aws-sdk-ruby

错误"未初始化的常量AWS(NameError)"

这是说AWS未初始化.我使用了aws-sdk-core gem.

我尝试使用aws-sdk gem,问题仍然存在.

这是initializers/aws.rb文件:

AWS.config(:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
                      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'])

s3 = AWS::S3.new
AVATAR_BUCKET = s3.buckets[ENV['AVATAR_BUCKET_NAME']]
Run Code Online (Sandbox Code Playgroud)

当我尝试运行服务器或打开控制台时,我收到此错误:

/initializers/aws.rb:1:in`':未初始化的常量AWS(NameError)

ruby-on-rails amazon-s3 amazon-web-services ruby-on-rails-4 aws-sdk-ruby

38
推荐指数
4
解决办法
3万
查看次数

Ruby:使用 AWS 实例配置文件进行 S3 访问

我有一个附加了配置文件的 ec2 实例。我可以使用 awscli,它可以很好地上传到存储桶。

root@ocr-sa-test:/# aws s3 ls s3://company-ocr-east/
                           PRE 7_day_expiry/

root@ocr-sa-test:/# touch foo
root@ocr-sa-test:/# aws s3 cp foo s3://company-ocr-east/foo
upload: ./foo to s3://company-ocr-east/foo
root@ocr-sa-test:/# aws s3 rm s3://company-ocr-east/foo
delete: s3://company-ocr-east/foo
Run Code Online (Sandbox Code Playgroud)

不过,我无法让它与 ruby​​ 中的 aws-sdk 一起使用。我被拒绝访问。

irb(main):001:0> require "aws-sdk"
=> true
irb(main):002:0>
irb(main):003:0> credentials = Aws::InstanceProfileCredentials.new
irb(main):004:1* client = Aws::S3::Client.new(
irb(main):005:1*   region: "us-east-1",
irb(main):006:1*   credentials: credentials,
irb(main):007:0> )
irb(main):008:0>
irb(main):009:0>
irb(main):010:0>
irb(main):011:1* begin
irb(main):012:2*   client.put_object(
irb(main):013:2*     key: 'hello.txt',
irb(main):014:2*     body: 'Hello World!',
irb(main):015:2*     bucket: 'company-ocr-east',
irb(main):016:2*     content_type: 'text/plain'
irb(main):017:1*   ) …
Run Code Online (Sandbox Code Playgroud)

ruby aws-sdk-ruby

9
推荐指数
1
解决办法
483
查看次数

建议在Ruby中为S3 Bucket生成预分配URL的方法

我正在尝试在我的Rails服务器上生成预先签名的URL以发送到浏览器,以便浏览器可以上传到S3.

看起来好像aws-sdk-s3是未来的宝石.但不幸的是,我没有遇到可以提供清晰度的宝石文档.似乎有几种不同的方式这样做,并希望对以下方法的差异提供任何指导 -

  1. 使用Aws::S3::Presigner.new(https://github.com/aws/aws-sdk-ruby/blob/master/aws-sdk-core/lib/aws-sdk-core/s3/presigner.rb)但似乎没有采取在对象参数或身份验证凭据中.

  2. 使用Aws::S3::Resource.new,但似乎aws-sdk-resources不会被维护.(https://aws.amazon.com/blogs/developer/upgrading-from-version-2-to-version-3-of-the-aws-sdk-for-ruby-2/)

  3. 使用Aws::S3::Object.new然后调用该put对象上的方法.

  4. AWS::SigV4直接使用.

我想知道他们是如何不同的,以及选择一个而不是另一个的含义?任何建议都非常感谢,尤其是aws-sdk-s3.

谢谢!

ruby ruby-on-rails amazon-s3 amazon-web-services aws-sdk-ruby

7
推荐指数
2
解决办法
4930
查看次数

存根 AWS S3 对象请求

我正在尝试阻止在 AWS 存储桶中获取对象的请求。我已经阅读了他们关于存根请求的文档,并且只能存根一个存储桶,而不是一个对象。这是我尝试过的一些事情:

通过 AWS 配置进行存根:

Aws.config[:s3] = {
  stub_responses: {
    list_buckets: {
      buckets: [name: "my-bucket"],
      list_objects: [key: "file.pdf"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然它得到了桶,但它没有给我对象。调用s3.buckets会列出存储桶,但s3.objects会是空的。

通过 gem 进行存根webmock

tempfile = file_fixture('file.pdf').read
base_uri = Regexp.new "https://my-bucket.s3.us-west-1.amazonaws.
stub_request(:get, base_uri).to_return(status: 200, body: tempfile)
Run Code Online (Sandbox Code Playgroud)

这似乎仍然不起作用。调用bucket.objects仍然返回一个空集合。

我想测试控制器中的代码:

s3 = Aws::S3::Resource.new
bucket = s3.bucket("my-bucket")
@files = {}

bucket.objects.each do |item|
  @files[File.basename(item.key)] = item.presigned_url(:get)
end
Run Code Online (Sandbox Code Playgroud)

目标是我想确保我的视图显示变量中对象的链接@file,并且我想测试该链接。任何帮助将不胜感激!我是使用 AWS S3 进行开发的新手,并且 google 没有提供太多帮助。我正在使用aws-sdk-s3gem 来处理 AWS S3。

testing ruby-on-rails amazon-s3 amazon-web-services aws-sdk-ruby

6
推荐指数
1
解决办法
3082
查看次数

使用适用于 Node.js 或 Ruby on Rails 的 AWS Glue Schema Registry

查看 AWS Glue Schema Registry 的文档,您似乎无法将其用于 Node.js 或 Ruby on Rails:

AWS Glue Schema 注册表支持 AVRO (v1.10.2) 数据格式和 Java 语言支持,其他数据格式和语言即将推出 https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html

注意先决条件:在完成以下步骤之前,您需要运行 Managed Streaming for Apache Kafka (MSK) 或 Apache Kafka 集群。您的生产者和消费者需要在 Java 8 或更高版本上运行。 https://docs.aws.amazon.com/glue/latest/dg/schema-registry-gs.html

有人有幸将 AWS Glue Schema Registry 与 Node.js 或 Ruby on Rails 一起使用吗?

aws-sdk-ruby aws-sdk-js aws-glue aws-msk

5
推荐指数
1
解决办法
993
查看次数

Rails 6 - 根据用户角色允许/禁止下载 AWS S3 上文件的文件

我有一个 Rails 6 应用程序,注册用户(所有者)可以在 S3 上上传文件 -图像/视频,然后所有者可以向其他用户(邀请)提供访问权限以查看他们上传的内容。

有没有办法限制文件访问,以便只有所有者才能下载他上传的文件(图像/视频),从而对其他非所有者/受邀用户进行限制。视频/图像不应该通过右键单击并保存/下载来如此轻松地下载。

注意- 上传的文件还包括大视频(mp4 和 HLS 流),因此其他受邀用户可以查看它们,但无法下载,除非他们是所有者/上传者,因为文件来自 AWS Cloudfront 的视频和 S3(如果他们是)是图像。

协会的设置如下 -

User has one role
User has many images/videos, each residing in his own folder on s3(`bucket/user_id/image_slug/` or `bucket/user_id/video_slug/`)
User has many invitations(must be view only access to owners file)
Run Code Online (Sandbox Code Playgroud)

不确定,什么是正确的方法,可以 -

  • 如果非所有者访问该文件,是否更新该文件的 ACL 并将其设为只读?
  • 公开所有上传的文件并禁止非所有者的公共访问,但这也会限制对文件的直接访问。

让我知道最适合这种方法的逻辑是什么。

ruby-on-rails amazon-s3 amazon-web-services aws-sdk-ruby

5
推荐指数
1
解决办法
426
查看次数

AWS Cognito + RubyOnRails在后端获取用户信息.AWS :: CognitoIdentityProvider ::错误:: NotAuthorizedException

我应该将cognito + ruby​​整合到轨道上.

我的用户使用cognito默认登录页面登录,并使用url params重定向到我的页面.

https://development-my-site.auth.us-west-2.amazoncognito.com/oauth2/authorize?client_id=62i222222222222&redirect_uri=https://c3ffec02.ngrok.io/auth/cognito/callback&response_type=token&scope=email+openid+profile

重定向后,我有params

id_token=eyJraWQiOiIyYThzTzY3........
&access_token=eyJraWQiOiJDa0I2NGJsUFJKTWZrNGlV.....
&expires_in=3600
&token_type=Bearer
Run Code Online (Sandbox Code Playgroud)

我应该access_token从url 获取并传递给后端以进行用户验证.

在后端我使用AWS-SDK```

  def client
    @client ||= Aws::CognitoIdentityProvider::Client.new(region: options.aws_region)
  end

  def get_user_info(params)
    client.get_user(access_token: params['access_token'])
  end
Run Code Online (Sandbox Code Playgroud)

```

但结果我有错误 Aws::CognitoIdentityProvider::Errors::NotAuthorizedException (Access Token does not have required scopes):

我应该怎么做获取用户信息?

ruby-on-rails amazon-web-services oauth-2.0 amazon-cognito aws-sdk-ruby

4
推荐指数
1
解决办法
1158
查看次数

从 AWS S3 下载文件时的文件编码问题

我在 AWS S3 中有一个 CSV 文件,我试图在本地临时文件中打开它。这是代码:

s3 = Aws::S3::Resource.new
bucket = s3.bucket({bucket name})
obj = bucket.object({object key})
temp = Tempfile.new('temp.csv')
obj.get(response_target: temp)
Run Code Online (Sandbox Code Playgroud)

它从 AWS 中提取文件并将其加载到名为“temp.csv”的新临时文件中。对于某些文件,该obj.get(..)行会引发以下错误:

WARN: Encoding::UndefinedConversionError: "\xEF" from ASCII-8BIT to UTF-8
WARN: /Users/.rbenv/versions/2.5.0/lib/ruby/2.5.0/delegate.rb:349:in `write'
/Users/.rbenv/versions/2.5.0/lib/ruby/2.5.0/delegate.rb:349:in `block in delegating_block'
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-core-3.21.2/lib/seahorse/client/http/response.rb:62:in `signal_data'
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-core-3.21.2/lib/seahorse/client/net_http/handler.rb:83:in `block (3 levels) in transmit'
...
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-s3-1.13.0/lib/aws-sdk-s3/client.rb:2666:in `get_object'
/Users/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/aws-sdk-s3-1.13.0/lib/aws-sdk-s3/object.rb:657:in `get'
Run Code Online (Sandbox Code Playgroud)

Stacktrace 显示错误最初是由.get适用于 Ruby 的 AWS 开发工具包抛出的。

我尝试过的事情:

将文件(对象)上传到 AWS S3 时,您可以指定content_encoding,因此我尝试将其设置为 UTF-8:

obj.upload_file({file path}, content_encoding: 'utf-8')
Run Code Online (Sandbox Code Playgroud)

此外,当您打电话时,.get您可以设置response_content_encoding

obj.get(response_target: …
Run Code Online (Sandbox Code Playgroud)

ruby amazon-s3 amazon-web-services aws-sdk-ruby

4
推荐指数
1
解决办法
6195
查看次数

如何使用rspec模拟AWS SDK(v2)?

我有一个类使用aws-sdk-rails gem(它是aws-sdk-ruby v2上的包装器)从SQS队列读取/处理消息.如何模拟AWS调用以便我可以测试我的代码而无需访问外部服务?

communicator.rb:

class Communicator
  def consume_messages
    sqs_client = Aws::SQS::Client.new
    # consume messages until the queue is empty
    loop do
      r = sqs_client.receive_message({
                                              queue_url: "https://sqs.region.amazonaws.com/xxxxxxxxxxxx/foo",
                                              visibility_timeout: 1,
                                              max_number_of_messages: 1
                                     })
      break if (response.message.length == 0)
      # process r.messages.first.body
      r = sqs_client.delete_message({
                                      queue_url: "https://sqs.region.amazonaws.com/xxxxxxxxxxxx/foo",
                                      receipt_handle: r.messages.first.receipt_handle
                                    })
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby rspec mocking aws-sdk-ruby

2
推荐指数
2
解决办法
3732
查看次数

Localstack:awscli 有效,aws-sdk 引发错误

我想将localstack与 ruby一起使用aws-sdk。aws sdk 似乎缺少一些配置或有错误,它引发了错误:

之后

Aws::S3::Resource.new.bucket('mybucket').exists?
Run Code Online (Sandbox Code Playgroud)

它提出了一个:

/usr/local/lib/ruby/2.2.0/net/http.rb:879:in `initialize': unable to connect to 
`mybucket.localstack`; SocketError: getaddrinfo: Name or service not known
(Seahorse::Client::NetworkingError)
Run Code Online (Sandbox Code Playgroud)

在同一个容器上,如果我awscli完全没有问题:

root@35afc611394b:/app/user# aws --endpoint-url=http://localstack:4572 s3 mb s3://test1
  make_bucket: test1
root@35afc611394b:/app/user# aws --endpoint-url=http://localstack:4572 s3 ls
  2006-02-03 16:45:09 test1
Run Code Online (Sandbox Code Playgroud)

我创建了一个 docker-compose.yml 来帮助解决这个问题:

https://github.com/ook/localstack-s3-problem

我在自述文件中注意到我现在尝试了什么。

请指教 :)

aws-sdk aws-sdk-ruby localstack

2
推荐指数
1
解决办法
2282
查看次数

aws-sdk-core/xml/parser.rb:74:in `set_default_engine': 无法找到兼容的 xml 库),Ruby 版本 3.0.2

我有一个在 Linux 服务器上运行的旧版 ruby​​ 守护程序脚本。在升级实例中的所有 ruby​​ 和 gem 包版本时,守护程序脚本现在出错。我在 irb 中遇到同样的错误

**

/home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/xml/parser.rb:74:in `set_default_engine': Unable to find a compatible xml library. Ensure that you have installed or added to your Gemfile one of ox, oga, libxml, nokogiri or rexml (RuntimeError)
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/xml/parser.rb:96:in `<class:Parser>'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/xml/parser.rb:7:in `<module:Xml>'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/xml/parser.rb:5:in `<module:Aws>'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/xml/parser.rb:3:in `<top (required)>'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/xml.rb:8:in `require_relative'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/xml.rb:8:in `<top (required)>'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core.rb:68:in `require_relative'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core.rb:68:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /home/ec2-user/.local/share/gem/ruby/gems/aws-sdk-kms-1.48.0/lib/aws-sdk-kms.rb:11:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require' …
Run Code Online (Sandbox Code Playgroud)

ruby rubygems aws-sdk aws-sdk-ruby

2
推荐指数
1
解决办法
3539
查看次数

您如何使用SDK创建指向S3(静态托管)网站终端节点的AWS Cloudfront分布?

我将一个S3存储桶配置为网站终结点,以托管静态网页。

我想将Cloudfront放在它前面。

我从S3存储桶的“属性” :: “静态网站托管”中复制了“端点”

它的形式为: “ example.com.s3-website-us-east-1.amazonaws.com”

当我尝试使用Aws SDK CloudFront客户端进行create_distribution时,出现以下错误:

Aws::CloudFront::Errors::InvalidArgument 
The parameter Origin DomainName does not refer to a valid S3 bucket.
Run Code Online (Sandbox Code Playgroud)

Ruby代码示例如下:

cloudfront = Aws::CloudFront::Client.new()
cloudfront.create_distribution({
  distribution_config: {
    ...
    origins: {
      quantity: 1,
      items: [{
        id: "Custom-example.com.s3-website-us-east-1.amazonaws.com",
        domain_name: "example.com.s3-website-us-east-1.amazonaws.com",
        s3_origin_config: {
          origin_access_identity: ""
        },
        origin_path: ""
      }]
    },
    ...
  }
Run Code Online (Sandbox Code Playgroud)

})

我可以通过GUI和CLI使用相同的“原始域名”创建分发

aws cloudfront create-distribution \
  --origin-domain-name example.com.s3-website-us-east-1.amazonaws.com \
  --default-root-object index.html
Run Code Online (Sandbox Code Playgroud)

ruby amazon-web-services amazon-cloudfront aws-sdk-ruby

1
推荐指数
1
解决办法
925
查看次数

浏览器缓存神社s3私人附件

我刚刚在 s3 上创建了一个私有存储桶,用于包含用户个人资料图片。使用公共存储桶,所有图像都会正确缓存(之前的回形针配置具有相同的设置)。

我有以下神社初始值设定项:

s3_options = {
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  region: ENV['AWS_REGION'],
  bucket: ENV['S3_BUCKET_NAME']
}

Shrine.storages = {
  cache: Shrine::Storage::FileSystem.new('tmp', prefix: 'uploads/cache'),
  store: Shrine::Storage::S3.new(**s3_options)
}

Shrine.plugin :activerecord
Shrine.plugin :logging
Shrine.plugin :determine_mime_type
Shrine.plugin :cached_attachment_data
Shrine.plugin :restore_cached_data
Shrine.plugin :delete_promoted
Shrine.plugin :delete_raw
Shrine.plugin :remove_invalid
Run Code Online (Sandbox Code Playgroud)

以及以下上传者:

class AvatarUploader < Shrine
  plugin :pretty_location
  plugin :processing
  plugin :upload_options, store: {
    acl: 'private',
    cache_control: "max-age=604800",
  }
end
Run Code Online (Sandbox Code Playgroud)

s3 对象上的 CacheControl 已正确设置为 1 周,并且在响应中可以看到相同的情况。我注意到,在每个请求上,签名的 url 在X-Amz-Signature哈希方面都不同,这很可能导致缓存未命中(每个请求的 Etag 都相同)。我认为这就是它不起作用的原因,但我不知道如何在对象未过期的情况下使 X-Amz-Signature 相同。

ruby-on-rails amazon-s3 aws-sdk shrine aws-sdk-ruby

1
推荐指数
1
解决办法
896
查看次数