Подключение к EFS из Elastic Beanstalk с помощью PHP - PullRequest
0 голосов
/ 07 сентября 2018

Как обычно, чем проще операция, тем больше смущает документация AWS. Я хочу использовать PHP для записи и чтения файлов, хранящихся в EFS. У меня есть опыт использования библиотеки AWS PHP, мне просто нужен правильный код для облегчения общения. Вот мои настройки:

  • 1 Файловая система EFS на моем VPC по умолчанию.
  • 1 Среда Elasticbeanstalk с «storage-efs-mountfilesystem.config», добавленной в каталог .ebextensions самого последнего кода приложения и инициализированной без ошибок (что заставляет меня думать, что она подключается). Группа безопасности для EB добавляется в группу безопасности EFS. AWS PHP SDK также существует с приложением
  • 1 PHP-файл в приложении

Теперь в файле я обычно подключаюсь к другим сервисам следующим образом:

use Aws\S3\S3Client;
$options = [
    'region'            => 'us-east-1',
    'version'           => '2006-03-01',
    'signature_version' => 'v4',
    'credentials' => [
        'key' => 'key#',
        'secret' => 'secret#'
    ] 
];
$GLOBALS['s3Client'] = new S3Client($options);
$writeFile = $GLOBALS['s3Client']->putObject(array(...

Полагаю, это должно быть то же самое для EFS. Сначала я попробовал:

$efsOptions = [
    'region'            => 'us-east-1',
    'version'           => 'latest',
    'credentials' => [
        'key' => 'key#',
        'secret' => 'secret#'
    ] 
];
use Aws\Efs\EfsClient;
$efsClient = new EfsClient($efsOptions);
$result = $efsClient->describeFileSystems(array(
    'FileSystemId' => 'fs-#'
));

Но получите ошибку:

Fatal error: Uncaught exception 'Aws\Efs\Exception\EfsException' with message 'Error executing "DescribeFileSystems" on "https://elasticfilesystem.us-east-1.amazonaws.com/2015-02-01/file-systems?FileSystemId=f#"; AWS HTTP error: Client error: `GET https://elasticfilesystem.us-east-1.amazonaws.com/2015-02-01/file-systems?FileSystemId=f#` resulted in a `403 Forbidden`

Так каков правильный способ сделать это? (Код Судо):

use Aws\efs\EfsClient;
$options = [
    'What keys need to be here' => 'paramter',
    'credentials' => [
        'key' => 'key#',
        'secret' => 'sevret#'
    ] 
];
$efsClient = new EfsClient($options);
$dir = "/test/";
$makeDir = $efsClient -> mkdir($dir);
$scanDir = $efsClient -> scandir($dir);
print_r($scanDir);
**/test/

Я никогда не использую консоль или подключаюсь к серверу для установки пакетов, поэтому, пожалуйста, ограничьте это ответами, которые позволяют мне делать все в файле PHP или ограниченной «одноразовой» конфигурации консоли. Суть в том, что мне нужен PHP-скрипт для создания и чтения файлов в EFS и обмена ими с другими средами EB. Документация AWS, которую я просмотрел или использовал до сих пор:

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/services-efs.html https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/instance-configuration/storage-efs-mountfilesystem.config https://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.Efs.EfsClient.html

1 Ответ

0 голосов
/ 07 сентября 2018

Почему бы просто не смонтировать EFS в качестве общего ресурса на вашем экземпляре EC2, на котором выполняется код Тогда EFS - это обычный путь, в который может писать ваше PHP-приложение. Это то, что мы делаем на наших веб-серверах Elastic Beanstalk для постоянной загрузки пользовательских файлов и т. Д.

Необходимо установить соединение из экземпляра EB / EC2, используя механизм AWS EBExtensions при развертывании кода. Примерный фрагмент конфигурации для этого:

# config.yml file:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/my_config_job.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      # Load the EFS path from the EB environment settings
      # (The variables are set in the "Configuration" section in the AWS
      # Console under the "Environment properties" area. That area takes
      # Name and Value pairs, so in our example below, the value
      # "WHERE_TO_MOUNT_EFS" is the Name of the variable, and it contains
      # a path on the EC2, for example "/efs". That would mount the EFS
      # volume at the path /efs on the filesystem.
      WHERE_TO_MOUNT_EFS=$(/opt/elasticbeanstalk/bin/get-config environment -k WHERE_TO_MOUNT_EFS)

      # This is the actual AWS EFS volume name that has been set up
      EFS_VOLUME_NAME=$(/opt/elasticbeanstalk/bin/get-config environment -k EFS_VOLUME_NAME)

      # Now create the path for the mount on the filesystem (again, in 
      # our example "/efs" as specified in the WHERE_TO_MOUNT_EFS variable)
      mkdir ${WHERE_TO_MOUNT_EFS}

      # Now actually mount the EFS to the "/efs" folder created above
      mount -t nfs4 -o nfsvers=4.1 ${EFS_VOLUME_NAME}-$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone).mydomain.com:/ ${WHERE_TO_MOUNT_EFS}

Это всего лишь образец, конечно.

Команды "curl" используются для запроса информации, предоставляемой AWS по специальному IP 169.254.169.154. Ваш домен и путь будут другими.

Кроме того, это скрипт Bash, работающий в Linux. Если вы используете Windows на вашем EB, вам придется адаптировать этот процесс.

Наконец, после монтирования, приведенного выше, в наших скриптах мы фактически создаем символическую ссылку из подпапки нашего веб-сайта в присоединенную папку EFS. Мы также управляем разрешениями с помощью команд Bash, которые назначают пользователю «webapp» необходимые ему разрешения. Эти шаги не являются обязательными, конечно.

Теперь PHP увидит эту папку как путь в файловой системе, но на самом деле она находится в вашей общей папке EFS. Когда среда (-ы) EB восстанавливается, этот сценарий автоматически перезапускается, а EFS повторно подключается, поэтому данные, по-видимому, сохраняются в приложении на EC2.

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

...