Назад | Перейти на главную страницу

Amazon Cloud Formation: импорт файла из корзины S3

Я изо всех сил пытаюсь получить файлы из моей корзины S3 в свой экземпляр EC2, используя формирование облака. У меня есть следующие файлы:

"files" : {
  "/var/www/text.txt": {
      "source": "https://s3.amazonaws.com/bucket/test.txt",
      "mode": "000644",
      "owner" : "root",
      "group" : "root"
  },
  "/var/temp/http.conf": {
    "source" : "https://s3.amazonaws.com/bucket/httpd.conf",
    "mode": "000644",
    "owner" : "root",
    "group" : "root"
  },
  "/var/temp/mime-types.conf": {
    "source" : "https://s3.amazonaws.com/bucket/mime-types.conf",
    "mode": "000644",
    "owner" : "root",
    "group" : "root"
  }
}

Где test.txt - это файл с текстом «текст», а два других - файлы конфигурации.

Я обновил свои разрешения для файла test.txt, чтобы любой мог его просмотреть или загрузить, попытался сделать его http поверх https и попытался удалить два других файла.

До сих пор, /var/www/ будет создан с четырьмя каталогами, но не /var/temp/. /var/www/error также будет содержать файлы.

У меня сложилось впечатление, что это должно работать, но это не так. Я делаю что-то неправильно? Я слежу за документация по aws.

РЕДАКТИРОВАТЬ Я заглянул в журнал ошибок. Вот результат. Очевидно, он не может найти файл:

2015-06-04 14:28:50,381 [ERROR] HTTP Error 404 : <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 159, in _retry
    return f(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 283, in get_role_creds
    resp.raise_for_status()
  File "/usr/lib/python2.7/dist-packages/cfnbootstrap/packages/requests/models.py", line 834, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
HTTPError: 404 Client Error: Not Found
2015-06-04 14:28:51,208 [ERROR] HTTP Error 404 : <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 159, in _retry
    return f(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 283, in get_role_creds
"cfn-init.log" [readonly] 1216L, 58277C

Чтобы копия файла S3 работала с доступом только для чтения S3, вам необходимо:

  1. Чтобы назначить свой экземпляр профилю экземпляра - прикрепленному к роли экземпляра, с доступом только для чтения к сегменту - [ "s3:Get*", "s3:List*" ]
  2. Определить AWS::CloudFormation::Authentication рядом с твоим AWS::CloudFormation::Init раздел и настройте роль, как показано ниже.
  3. Убедитесь, что ваш "source" раздел выглядит так, как показано ниже.

    "AWS::CloudFormation::Authentication" : {
      "default" : {
        "type" : "S3",
        "buckets" : [ { "Ref" : "ConfigBucket" } ],
        "roleName" : { "Ref" : "MyNodeRole" }
        }
    },
    
    "AWS::CloudFormation::Init" : {
      "config" : {
        "files" : {
          "/etc/myapp/config/filename": {
            "source" : { "Fn::Join": [ "", [ "http://", { "Ref" : "ConfigBucket" }, ".s3-us-west-1.amazonaws.com/config/filename" ]]},
            "mode": "000444",
            "owner": "root",
            "group": "root",
            "authentication": "default"
            }
        }
      }
    }
    

В source ссылка должна быть ключом. Документация AWS для корзины S3 состояния:

Объекты, хранящиеся в сегментах, имеют уникальное значение ключа и извлекаются с использованием URL-адреса HTTP. Например, если объект со значением ключа /photos/mygarden.jpg хранится в myawsbucket ведро, то к нему можно обратиться с помощью URL http://myawsbucket.s3.amazonaws.com/photos/mygarden.jpg.

Я не думаю, что вы копируете какие-либо файлы. Возможно, вам потребуется добавить IAM S3 доступ роль к вашему экземпляру - например AmazonS3FullAccess. Я делаю нечто подобное, но настраиваю свои экземпляры с этой ролью и копировать в него файлы с S3 с участием aws s3 cp ... или целые каталоги с aws s3 sync .... Я помещаю эти команды в поле данных пользователя, чтобы я мог «настроить экземпляр и забыть о нем».

Я столкнулся с той же проблемой, что и OP. Моя проблема заключалась в том, что я указывал роль ARN вместо roleName. Это заставляло меня получать ту же ошибку 404, что и OP. Из-за ошибки 404 могло показаться, что я указывал неправильный путь S3, но на самом деле именно роль cfn-init использовал.