Enviando arquivos de backup para o Amazon S3 através do sdk para PHP

Posted on abril 6, 2013. Filed under: Amazon AWS, PHP | Tags:, , , , , , |

Introdução

Neste artigo vamos aprender como usar o serviço S3 da Amazon para armazenar arquivos de backup. O intuito é criarmos um script em php que utiliza o SDK da Amazon para enviar os arquivos para o serviço de Storage. Ideal para armazenar dumps de banco de dados e backup de diretórios de aplicações web. Através desse método fica simples integrar scripts de backup em shell já existentes em seu ambiente com o serviço da Amazon.

Vamos ver como ingressar no serviço S3, gerar as chaves de configuração, baixar e usar o sdk no php. Além disso, vamos abordar aqui como configurar o serviço da Amazon para deletar os arquivos de backups após um período de tempo determinado automaticamente.

  1. Cadastrando-se no Amazon AWS
  2. Será necessário ter um cadastro no serviço de AWS da Amazon. Caso ainda não tenha uma conta no serviço, acesse o link abaixo e clique em cadastrar-se. Siga as orientações do processo.

    http://aws.amazon.com/pt/

  3. Acessando o S3 e criando um bucket
  4. O Amazon S3 é um serviço de Storage em cima de um plataforma de computação em nuvem usado para armazenar e recuperar qualquer quantidade de dados. Para maiores informações sobre o serviço e preços, consultar o link abaixo:

    http://aws.amazon.com/pt/s3/

    O primeiro passo é criarmos um bucket no serviço S3 da Amazon. O bucket é uma unidade de armazenamento dentro da infra estrutura da Amazon. Estaremos armazenando os arquivos dentro do bucket.

    Para criarmos o bucket, acesse o console da Amazon, no serviço S3, através do link abaixo: (Já estando logado)
    https://console.aws.amazon.com/s3/

    Clique no botão Create Bucket. Ao clicar no botão, será exibida uma tela como na figura abaixo:

    ScreenShot092

    Insira o nome do bucket e clique no botão Create. O nome do bucket é um identificador único dentro da estrutura global do serviço da Amazon. Portanto, você deverá escolher um nome que ainda não esteja em uso. O nome da Region, mantive US Standard, pois o preço cobrado pelo uso na região EUA é mais barato do que no Brasil. Como estamos trabalhando com arquivos de backup, vamos escolher a região que cobra o menor preço possível.

    Com o bucket criado, vamos agora aprender como gerar as chaves conhecidas como Amazon Web Services Key. As chaves serão usadas na configuração do sdk. Dessa forma, a Amazon consegue identificar o usuário que esta realizando as requisições pelo sdk.

  5. Gerando as chaves de Acesso
  6. Para gerar as chaves de acesso, clique no menu superior “Nome_do_seu_Usuario -> Security Credentials”. Veja figura:

    ScreenShot093

    Ache a seção Credenciais de Acesso e clique em Criar uma nova chave de acesso, Veja figura abaixo:

    ScreenShot094

    Confirme a geração da chave. Anote as chaves geradas, o campo ID de chave de acesso e o campo Chave de acesso secreta (clicando no link mostrar). Usaremos as chaves mais tarde na configuração do sdk.

  7. Instalando e configurando o sdk
  8. Nosso script de envio de backup utilizará o sdk da Amazon S3 para a linguagem PHP. Portanto, baixe a última versão do sdk do Amazon S3 no link abaixo:

    http://pear.amazonwebservices.com/get/sdk-latest.zip

    Descompacte o arquivo zip dentro do diretório raiz onde estará seu script de backup. Ao descompactar será criado um diretório sdk-x.x.x/.(Onde x.x.x é a versão do sdk). Crie um link simbólico desse diretório para sdk-amazon/ ou renomeie a pasta para sdk-amazon/ como preferir. No meu caso, preferi criar um link simbólico, ficando da seguinte forma:

    $ ln -s sdk-1.6.2/ sdk-amazon
    

    Para configurar as chaves de acesso, entre no diretório do sdk da amazon e renomeie o arquivo config-sample.inc.php para config.inc.php

    $ cd sdk-amazon/
    $ mv config-sample.inc.php config.inc.php
    

    Identifique as linhas abaixo no arquivo config.inc.php e substitua com os valores das chaves geradas no portal da Amazon:

    ...
    CFCredentials::set(array(
    
            // Credentials for the development environment.
            'development' => array(
    
                    // Amazon Web Services Key. Found in the AWS Security Credentials. You can also pass
                    // this value as the first parameter to a service constructor.
                    'key' => 'development-key',
    
                    // Amazon Web Services Secret Key. Found in the AWS Security Credentials. You can also
                    // pass this value as the second parameter to a service constructor.
                    'secret' => 'development-secret',
    
                    // This option allows you to configure a preferred storage type to use for caching by
                    // default. This can be changed later using the set_cache_config() method.
                    //
                    // Valid values are: `apc`, `xcache`, or a file system path such as `./cache` or
                    // `/tmp/cache/`.
                    'default_cache_config' => '',
    
                    // Determines which Cerificate Authority file to use.
                    //
                    // A value of boolean `false` will use the Certificate Authority file available on the
                    // system. A value of boolean `true` will use the Certificate Authority provided by the
                    // SDK. Passing a file system path to a Certificate Authority file (chmodded to `0755`)
                    // will use that.
                    //
                    // Leave this set to `false` if you're not sure.
                    'certificate_authority' => false
            ),
    
            // Specify a default credential set to use if there are more than one.
            '@default' => 'development'
    ));
    
    

    Neste ponto já temos o sdk para php com as chaves de acesso configuradas. Vamos agora para a criação do nosso script de envio de arquivos para o bucket.

  9. Criando e usando o script de envio de backup
  10. Crie um script php com o conteúdo abaixo (O nome do arquivo que eu criei foi aws_s3_send.php). Substitua o valor da constante BUCKET_NAME com o nome do bucket criado no serviço do S3. No meu caso, usei um bucket chamado douglas.pasqua que criei anteriormente.

    <?php
    // Bucket Name
    define('BUCKET_NAME', 'douglas.pasqua');
    
    // inclui sdk da amazon
    require_once("sdk-amazon/sdk.class.php");
    
    // Instantiate the AmazonS3 class
    $s3 = new AmazonS3();
    
    /* validacoes */
    $bucket_exists = $s3->if_bucket_exists(BUCKET_NAME);
    if(!$bucket_exists) {
            die("Bucket '" . BUCKET_NAME . "' nao existe");
    }
    
    if ($argc != 2) {
            die("Usage: " . $argv[0] . " <arquivo_para_upload>" . PHP_EOL);
    }
    
    // verifica se arquivo p/ upload existe no bucket
    $file = $argv[1];
    if(!file_exists($file) || !is_file($file)) {
            die("Arquivo informado '$file' nao existe ou nao eh valido" . PHP_EOL);
    }
    $filename = basename($file);
    
    // verifica se objeto jah existe no bucket
    $object_exists = $s3->if_object_exists(BUCKET_NAME, $filename);
    if($object_exists) {
            die("Arquivo '$filename' ja consta no bucket remoto" . PHP_EOL);
    }
    
    $response = $s3->create_object(BUCKET_NAME, $filename, array('fileUpload' => $file));
    $upload_ok = $response->isOk();
    
    if($upload_ok) {
            echo "Arquivo '$file' enviado com sucesso para o bucket '" . BUCKET_NAME . "'" . PHP_EOL;
    } else {
            echo "Erro ao enviar '$file' para o bucket '" . BUCKET_NAME . "'" . PHP_EOL;
    }
    
    

    Usando o script:

    $ php aws_s3_send.php www-20130404.tar.gz
    Arquivo 'www-20130404.tar.gz' enviado com sucesso para o bucket 'douglas.pasqua'
    $ php aws_s3_send.php sqldump-20130404.gz
    Arquivo 'sqldump-20130404.gz' enviado com sucesso para o bucket 'douglas.pasqua'
    

    Basta agora você usar esse script no seu próprio mecanismo de geração de backup.

    PS: Você pode verificar os arquivos existentes no bucket acessando o console da amazon no serviço S3, usando sua conta. Através do console da amazon é possível fazer o download dos arquivos, excluir ou incluir novos.

    Nosso script faz algumas validações interessantes antes de enviar o arquivo:

    • Verifica se o bucket de destino existe no storage da Amazon, para evitar uma tentativa de envio para um bucket inexistente.
    • Verifica se o arquivo com o mesmo nome já consta no bucket, para evitar duplicidade.
  11. Configurando o Lifecycle
  12. O Lifecycle é uma funcionalidade associado ao seu bucket que permite configurar o tempo de vida para os arquivos armazenados nele. Útil por exemplo, caso você queria manter um histórico dos backups de no máximo 30 dias ou o tempo que preferir.

    Após o tempo configurado, o próprio serviço da Amazon excluirá seus arquivos.

    PS: Lembre-se que a Amazon cobra pelo uso de dados armazenados. Portanto, é interessante avaliar essa questão de tempo de vida dos seus arquivos para economizar dinheiro com o serviço.

    PS: A Amazon disponibiliza uma opção de mover seus arquivos para o Glacier, caso não queira excluí-los de vez. o Glacier é uma opção de armazenamento de custo extremamente mais baixo. Porém você não consegue recuperar imediatamente os arquivos armazenados no Glacier. (Normalmente terá que esperar de 3 a 5 horas).

    Para criar uma regra no Lifecyle, abra o console da Amazon no serviço S3. Identifique o bucket que deseja configurar, clique primeiro no ícone da lupa ao lado, depois na opção Lifecycle e depois em Add rule. Veja figura:

    ScreenShot095

    Irá abrir uma janela para configurar a Regra. Veja figura abaixo já parametrizada:

    ScreenShot096

    Principais parâmetros:

    • Name: Nome identificador da regra.
    • Apply to Entire Bucket: A regra se aplica para o bucket inteiro. Como alternativa, ao invés de marcar essa opção, você pode inserir um prefixo no campo Prefix: para que a regra se aplique somente aos arquivos que comecem com o prefixo escolhido.
    • Expiration: Clique no botão Expiration: e defina o número de dias em que o objeto deverá ser excluído contando a partir da data que foi incluso.
    • Move to Glacier: Clique no botão Move to Glacier: e defina o número de dias em que o objeto deverá ser movido para o Glacier contando a partir da data que foi incluso.

    PS: Você tem a opção de escolher um tempo de expiração ou um tempo para mover para o Glacier ou os dois juntos.

Parabéns

Caso tenha chego até aqui, provavelmente conseguiu criar seu script de envio de arquivos para o bucket com sucesso. Boa sorte!

Referências:

http://aws.amazon.com/pt/s3/
http://aws.amazon.com/pt/glacier/
http://aws.amazon.com/pt/sdkforphp/

Ler Post Completo | Make a Comment ( 2 so far )

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: