Как сделать эквивалент 's3cmd setacl --acl-grant = read: 82b82d .. s3: // somebucket / ..' в Ruby? - PullRequest
3 голосов
/ 07 июля 2011

Как вы можете сделать эквивалент:

s3cmd setacl --acl-grant=read:82b82d14a8d011e09d86001cc029a3688cdd635ea8d011e0b499001cc029a3689052a4f4a8d011e0bd25001cc029a368 s3://somebucket/some/path/to/file

в рубине? (желательно с использованием драгоценного камня 'aws-s3')

=== Редактировать ===

Как Сорен предлагает ниже, что-то похожее на это должно работать:

grant = AWS::S3::ACL::Grant.new
grant.permission = 'READ'
grantee = AWS::S3::ACL::Grantee.new
grantee.id = '82b82d14a8d011e09d86001cc029a3688cdd635ea8d011e0b499001cc029a3689052a4f4a8d011e0bd25001cc029a368'
grant.grantee = grantee
acl = AWS::S3::S3Object.acl('some/path/to/file', 'somebucket')
acl.grants << grant
AWS::S3::S3Object.acl 'some/path/to/file', 'somebucket', acl 

Однако, это не работает, я получаю следующую ошибку:

Предоставленный вами XML не был правильно сформирован или не подтвержден против нашей опубликованной схемы (AWS :: S3 :: MalformedACLError)

Есть идеи, как заставить это работать?

Ответы [ 4 ]

1 голос
/ 02 июня 2012

Я сам столкнулся с той же ошибкой.Похоже, что для обхода этого вам нужно сначала захватить политику объекта, затем изменить ее и снова применить измененный ACL к объекту.

Я вижу одно отличие - вы явно не определяететип должен быть CanonicalUser.Другая проблема может заключаться в том, что объект, чей ACL вы читаете, не дает вам разрешения на это (у вас нет разрешения READ_ACP).

policy = AWS::S3::S3Object.acl('object_in_somebucket', 'somebucket')
grantee = AWS::S3::ACL::Grantee.new
grantee.type = 'CanonicalUser'
grantee.id = '82b82d14a8d011e09d86001cc029a3688cdd635ea8d011e0b499001cc029a3689052a4f4a8d011e0bd25001cc029a368'

grant = AWS::S3::ACL::Grant.new
grant.permission = 'READ'
grant.grantee = grantee
policy.grants << grant
AWS::S3::S3Object.acl('object_in_somebucket', 'somebucket', policy)
1 голос
/ 08 июля 2011

Я не могу заставить его работать с гемом 'aws-s3', но он работает с гемом 'rightscale_aws':

require 'right_aws'

s3     = RightAws::S3.new(access_key, secret_key, {:logger => Logger.new('/dev/null')})
bucket =  s3.bucket('somebucket')

bucket.put 'some/path/to/file', open('/tmp/myfile')
access_id = '82b82d14a8d011e09d86001cc029a3688cdd635ea8d011e0b499001cc029a3689052a4f4a8d011e0bd25001cc029a368'
key = bucket.key('some/path/to/file')
RightAws::S3::Grantee.new(key, access_id, ['READ'], :apply)
1 голос
/ 08 марта 2012

Я боролся ровно с той же ошибкой, документация очень плоха в этом вопросе, вы должны взглянуть на Грантополучатель класса

Для установки идентификатора грантополучателя необходимо указать:

grantee.type = "CanonicalUser"
grantee.name = "aName"
grantee.id = '82b82d14a8d011e09d86001cc029a3688cdd635ea8d011e0b499001cc029a3689052a4f4a8d011e0bd25001cc029a368'

Это решает некорректную ошибку XML, которая у вас есть

Надеюсь, это поможет, Винсент

0 голосов
/ 07 июля 2011

Реализация Ruby (которую вы найдете здесь http://amazon.rubyforge.org/ http://amazon.rubyforge.org/doc/) должна работать для вас.

...