Эти команды не являются полностью эквивалентными, поэтому будет поучительно определить, что именно в результате отличается на проводе. В частности, SDK получает указание использовать конкретный регион и получать токены STS из IMDS, в то время как CLI остается работать с собственными настройками по умолчанию или с конфигурацией профиля. Кроме того, они не ведут себя одинаково.
Чтобы узнать, что на самом деле происходит, необходимо перезапустить оба с соответствующими флагами отладки, а именно:
aws --debug s3 cp hello.txt s3://bucketname/hello.txt
и
credentials = Aws::InstanceProfileCredentials.new(http_debug_output: $stdout)
client = Aws::S3::Client.new(region: 'us-east-1', credentials: credentials, http_wire_trace: true)
client.put_object(key: 'hello.txt', body: 'Hello World!', bucket: 'bucketname', content_type: 'text/plain')
Они будут генерировать массу вывода, но все это актуально и, что особенно важно, сравнимо, если не обращать внимания на шум. Первое, что нужно проверить, это то, что CLI определенно обращается к IMDS (у него будут запросы к http://169.254.169.254, которые завершаются чем-то вроде найденных учетных данных из роли IAM. Если нет, то экземпляр настроен не так, как вы думали, и в журнале появятся подсказки, объясняющие, как он получает учетные данные , например, неожиданный файл профиля или переменные среды. Вы также захотите проверить, что они получают ту же роль.
Второе, что нужно сравнить, - это последующие последовательности PUT, которые они оба пытаются выполнить. На этом этапе отладки почти все остальное одинаково, поэтому очень вероятно, что вы можете настроить параметры клиента Ruby SDK, чтобы они соответствовали тому, с чем успешно справляется CLI.
Третья возможность - это системный брандмауэр или какие-то средства управления обязательным доступом на уровне процесса, разрешения пользователей, cgroups / контейнеры и т. Д. Однако отладка ядра и конфигурации вашей ОС была бы глубокой темной кроличьей норой, и в любом случае вы сказали, что это экземпляр EC2, так что это, по-видимому, простой старый экземпляр EC2. Если на самом деле приведенные выше команды Ruby выполняются под другим идентификатором пользователя или внутри контейнера, то, возможно, ваш ответ уже есть, это вполне может быть проблема с сетью из-за элементов управления пользователем / контейнером / безопасностью или аналогичной конфигурации уровня ОС, которая требует чинить.
Обязательное предупреждение: если вы решите опубликовать какие-либо данные журнала, будьте осторожны, чтобы перезаписать любые учетные данные! Я не верю, что эти следы отладки особенно воспроизводимы, но вы не хотите выяснять, если я ошибаюсь.
person
inopinatus
schedule
30.12.2020
credentials = Aws::InstanceProfileCredentials.new
и распечатываю объект учетных данных, я вижу временный ключ / секрет со сроком действия - person Mike   schedule 18.11.2020Aws.config.update( credentials: credentials )
Перед тем, как сделать:client = Aws::S3::Client.new( region: "us-east-1" )
Похоже, они рекомендуют сделать это таким образом в документации AWS: docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/ и docs.aws.amazon.com/sdk-for-ruby/v3 / developer-guide / - person GuiFalourd   schedule 24.11.2020client = Aws::S3::Client.new(region: "us-east-1")
- person Amit Singh   schedule 02.01.2021