这是说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
我有一个附加了配置文件的 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) 我正在尝试在我的Rails服务器上生成预先签名的URL以发送到浏览器,以便浏览器可以上传到S3.
看起来好像aws-sdk-s3是未来的宝石.但不幸的是,我没有遇到可以提供清晰度的宝石文档.似乎有几种不同的方式这样做,并希望对以下方法的差异提供任何指导 -
使用Aws::S3::Presigner.new(https://github.com/aws/aws-sdk-ruby/blob/master/aws-sdk-core/lib/aws-sdk-core/s3/presigner.rb)但似乎没有采取在对象参数或身份验证凭据中.
使用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/)
使用Aws::S3::Object.new然后调用该put对象上的方法.
AWS::SigV4直接使用.
我想知道他们是如何不同的,以及选择一个而不是另一个的含义?任何建议都非常感谢,尤其是aws-sdk-s3.
谢谢!
ruby ruby-on-rails amazon-s3 amazon-web-services aws-sdk-ruby
我正在尝试阻止在 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
查看 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 一起使用吗?
我有一个 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)
不确定,什么是正确的方法,可以 -
让我知道最适合这种方法的逻辑是什么。
我应该将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
我在 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) 我有一个类使用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) 我想将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
我在自述文件中注意到我现在尝试了什么。
请指教 :)
我有一个在 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) 我将一个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) 我刚刚在 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 相同。
aws-sdk-ruby ×13
amazon-s3 ×6
ruby ×6
aws-sdk ×3
aws-glue ×1
aws-msk ×1
aws-sdk-js ×1
localstack ×1
mocking ×1
oauth-2.0 ×1
rspec ×1
rubygems ×1
shrine ×1
testing ×1