Sunday, August 4, 2013

Utilizar PHP AWS SDK 2 con Ceph

Como se describió en el artículo pasado, estoy utilizando Ceph como almacén de objetos para proyectos internos.

Al utilizar Ceph nos da la ventaja de poder utilizar herramientas hechas para el Api de Amazon S3 en nuestros proyectos, pero se deben de instanciar de manera especial para que puedan conectarse a su Servicio Compatible de S3.

Nuestro servicio no brinda soporte de acceso a los buckets a través de Subdominios, por lo que al momento de Instanciar, se debe de cambiar el End Point y el estilo de acceso.

Al momentos de Crear la instancia del Cliente

$client = S3Client::factory(array(
    'key'    => '<ACCESS KEY>',
    'secret' => '<SECRET KEY>',
    'base_url' => 'https://objectos.ejemplo.com',
    'ssl.certificate_authority' => false,
    'curl.options' => array(CURLOPT_SSL_VERIFYPEER => 0)
  

));



Al momentos de Crear un Bucket

$result = $client->createBucket(array(
        'Bucket' => $bucket,
        'PathStyle' => TRUE
    ));
Al momentos de Subir Un Archivo

$result = $client->putObject(array(
        'Bucket'     => $bucket,
        'Key'        => $key,
        'SourceFile' => $pathToFile,
        'Metadata'   => array(
            'Foo' => 'abc',
            'Baz' => '123'
        ),
        'PathStyle' => TRUE,
        'ACL'        => CannedAcl::PUBLIC_READ
    ));

Cambios en S3Cmd para su uso en Servicios Compatibles de Amazon S3

Para un proyecto hemos instalado Ceph, un sistema de archivos distribuidos que tiene un servicio de Almacenamiento de Objetos con un interfaz compatible con el Api de Amazon S3.

Amazon utiliza dos formas para acceder los buckets en S3, si por ejemplo, se tiene el bucket demoprueba, este puede ser accedido como:

  • https://demoprueba.s3.amazonaws.com 
  • https://s3.amazonaws.com/demoprueba
La primera es la forma preferida de Amazon y de las herramientas que se han desarrollado alrededor de este servicio.

En el caso nuestro al utilizar Ceph, tenemos las dos opciones, pero la opción de usar subdominios por bucket nos brinda un problema ya que no contamos con certificados para cada subdominio o certicados wildcard.

Por lo que hemos optado a utilizar la segunda opción, https://objetos.ejemplo.com/demoprueba.

Al ultizar esta opción nos da un problemas porque existen varias herramientas donde no utilizan esta opción como defecto y se debe de instanciar de otra forma los clientes o se deben de hacer cambios en el código.

Tuvimos un problema para utilizar S3Cmd en nuestro servicio, los desarrolladores no dan la opción de cambiar el estilo de acceso a S3 en su archivo de configuración por lo que se debe de modificar una línea para que sea compatible con nuestro servicio.


Este es el cambio que se hizo a la clase S3/S3.py para que sea compatible con Ceph.


214c214
<         if resource['bucket'] and not check_bucket_name_dns_conformity(resource['bucket']):
---
>         if resource['bucket'] :
217a218,219
>
>