Aplicação Serverless desenvolvida em PHP usando AWS Lambda \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 12 Horas 

 37 Min 

 02 Seg 

   Tempo restante da oferta: 12 37 02 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Aplicação Serverless desenvolvida em PHP usando AWS Lambda  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) [ Computação em nuvem ](https://www.treinaweb.com.br/blog/categoria/computacao-em-nuvem) 

# Aplicação Serverless desenvolvida em PHP usando AWS Lambda

 Veja como fazer o deploy de uma aplicação PHP Serverless no AWS Lambda usando o Bref.

 [ Kennedy Tedesco ](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/13190452/php-cloud.jpg)  

Se você não está familiarizado com o conceito, recomendo a leitura do artigo “[Serverless: uma introdução](https://www.treinaweb.com.br/blog/serverless-uma-introducao/ "Serverless: uma introdução")”, que introduz os pilares dessa forma de utilizar a computação em nuvem.

[  ![Yii - Framework PHP](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/yii-framework.svg)   Curso Yii - Framework PHP Conhecer o curso ](https://www.treinaweb.com.br/curso/yii-framework-completo)

## Bref

O [Bref](https://github.com/mnapoli/bref) é uma ferramenta que permite publicarmos aplicações PHP serverless no AWS Lambda.

Para rodar o [PHP](https://www.treinaweb.com.br/blog/o-que-e-php/ "O que é PHP?") no [Lambda](https://www.treinaweb.com.br/blog/o-que-e-aws-lambda/ "O que é AWS Lambda?") o Bref usa [AWS Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html), uma nova [API](https://www.treinaweb.com.br/blog/o-que-e-uma-api/ "O que é uma API?") da AWS que permite que qualquer linguagem seja executada. O Bref intermedia e tira a complexidade dessa integração para que possamos nos preocupar em apenas desenvolver o nosso código.

O Bref utiliza [Serverless Framework](https://serverless.com/), um [framework](https://www.treinaweb.com.br/blog/para-que-serve-um-framework/ "Para que serve um framework?") para gerenciamento, teste e publicação de funções nas principais plataformas FaaS do mercado.

Daqui pra frente trabalharemos com:

- Terminal;
- PHP (é necessário que você tenha conhecimento ao menos intermediário em PHP e que também tenha o [Composer](https://getcomposer.org/) instalado na sua máquina);
- NodeJS (O Serverless Framework funciona sob o NodeJS, então é necessário tê-lo instalado no seu ambiente);
- AWS (é necessário ter uma conta na AWS para a publicação da aplicação, pois o Bref funciona apenas na AWS nesse momento);

Se você ainda não tem uma conta na AWS, você pode criar uma [clicando aqui](https://aws.amazon.com/pt/free/) e utilizá-la por 1 ano de forma **gratuita** (mas com alguns limites) a maioria dos serviços. No caso do *AWS Lambda*, a conta gratuita permite que façamos muitas requisições por mês de forma grátis, o que é suficiente para que implementamos nossas primeiras funções sem ter nenhum gasto com isso.

### Criando um usuário na AWS

Se você já criou a sua conta na AWS, agora é a hora de termos uma chave de acesso, chave esta que será usada pelo *Serverless Framework* no deploy da função.

Vamos criar um usuário, pro nosso exemplo didático, chamado **serverless-admin**. Você deve usar o serviço *IAM* para criar esse usuário:

https://console.aws.amazon.com/iam/home?region=sa-east-1#/users

Em “**Access type**” escolha a opção “**Programmatic access**”:

![tela da AWS de criação de novo usuário](https://dkrn4sk0rn31v.cloudfront.net/2018/11/06132017/image-20181105172318318.png)

Na próxima tela, vou dar permissão de administrador para esse usuário. Veja bem, essa chave de acesso estará disponível apenas no meu ambiente. Na vida real, usuários devem ter permissões bem mais “magras”, com apenas o que for suficiente para que desempenhem suas funções.

![Tela de permissão de usuário](https://dkrn4sk0rn31v.cloudfront.net/2018/11/06132042/image-20181105172612742.png)

Basta avançar e depois concluir a criação do usuário:

![Tela de conclusão da criação de novo usuário](https://dkrn4sk0rn31v.cloudfront.net/2018/11/06132104/image-20181105172728001.png)

Guarde a **Access key ID** e a **Secret access key**, pois as utilizaremos daqui a pouco.

### Instalando o Serverless Framework

O primeiro passo é instalar o *Serverless Framework*. É necessário que você tenha NodeJS e NPM instalados no seu ambiente:

```bash
$ npm install -g serverless

```

Depois, é hora de configurar nele as chaves que geramos anterior na AWS:

```shell
$ serverless config credentials --provider aws --key  --secret 

```

Basta que você substitua os placeholders `e` pelas chaves geradas no passo anterior.

Se tudo ocorrer bem, você receberá no terminal:

```
Serverless: Setting up AWS...

```

## Criando a aplicação

Na sua pasta preferida, onde você desenvolve os seus projetos, crie uma nova pasta chamada `cep-serverless`. Dentro dela, pelo terminal, execute:

```shell
$ composer require bref/bref "^0.5"

```

Isso instalará o Bref como dependência do projeto.

**Nota:** O foco do artigo está no uso da versão **0.5** do Bref, futuras versões podem ter quebras de compatibilidade.

Em seguida, rode o comando que inicializará o template padrão do Bref na pasta que acabamos de criar:

```shell
$ vendor/bin/bref init

```

A ferramenta perguntará que tipo de aplicação estamos desenvolvendo. Vamos escolher a opção 1, pois a ideia aqui é a gente expor uma API pública e aberta de consulta de cep e essa opção nos permitirá criar uma aplicação que use, por exemplo, o Slim, para responder às requisições:

```
 What kind of lambda do you want to create? (you will be able to add more functions later by editing `serverless.yml`) [PHP function]:
  [0] PHP function
  [1] HTTP application
  [2] Console application

```

Se tudo der certo, o resultado será:

```
[OK] Project initialized and ready to test or deploy.

```

Não ignore a documentação oficial, ela possui muitos insights sobre todo o processo. Por exemplo, leia também a seção que explica [aplicações HTTP](https://bref.sh/docs/runtimes/http.html) no Bref, que é o tipo que estamos usando.

Na raiz do projeto, abra o arquivo `template.yaml`. É nesse arquivo que temos todas as configurações usadas pelo Serverless Framework para o deploy da nossa aplicação.

Primeiro de tudo, alterei o nome da aplicação de `app` :

```yaml
service: app

```

Para:

```yaml
service: cep

```

Em layers temos:

```yaml
${bref:layer.php-73-fpm}

```

Como o AWS Lambda não tem suporte nativo ao PHP, o Bref usa a API AWS Lambda Layers para executar o código numa compilação do PHP (mantida pelo próprio Bref), como pode ser visto na seção [Runtimes](https://bref.sh/docs/runtimes/) da documentação.

[  ![Joomla - Criação de Temas](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/joomla.svg)   Curso Joomla - Criação de Temas Conhecer o curso ](https://www.treinaweb.com.br/curso/joomla-criacao-de-temas-completo)

Altere a linha:

```yaml
region: us-east-1

```

Para a região de São Paulo:

```yaml
region: sa-east-1

```

Outra propriedade que podemos alterar desde já é o nome da função, que por padrão é:

```yaml
functions:
    api:
        handler: index.php

```

Podemos alterar para:

```yaml
functions:
    consulta:
        handler: index.php

```

O arquivo a ser executado quando a função for invocada é definido na propriedade `handler`:

```yaml
handler: index.php

```

As requisições HTTP passarão pelo [API Gateway](https://aws.amazon.com/pt/api-gateway/). Igual explicamos no artigo [Serverless: uma introdução](https://www.treinaweb.com.br/blog/serverless-uma-introducao/ "Serverless: uma introdução"), as lambdas são invocadas por eventos e uma requisição HTTP é um evento que no API Gateway pode disparar a execução de uma lambda. É essa a dinâmica que a nossa aplicação terá.

Em `events` configuramos quais são os eventos que vão disparar a nossa Lambda. Por padrão, temos:

```yaml
        events:
            -   http: 'ANY /'
            -   http: 'ANY /{proxy+}'

```

Essa configuração padrão faz com que qualquer requisição de qualquer método (GET, POST etc) seja enviada para a nossa função. Mas a nossa aplicação didática será simples e bem específica, queremos que apenas um endpoint funcione:

```yaml
GET /cep/{cep}

```

Portanto, altere `events` para:

```yaml
        events:
            -   http: 'GET /cep/{cep}'

```

A configuração final ficará assim:

```yaml
service: cep

provider:
    name: aws
    region: sa-east-1
    runtime: provided

plugins:
    - ./vendor/bref/bref

functions:
    consulta:
        handler: index.php
        description: ''
        timeout: 30
        layers:
            - ${bref:layer.php-73-fpm}
        events:
            -   http: 'GET /cep/{cep}'

```

Agora é hora da gente desenvolver o protótipo da aplicação.

### Respondendo à consulta do CEP

Vamos usar o Slim (micro framework PHP) para responder à requisição do CEP. Mas poderíamos usar qualquer framework ou library do ecossistema PHP. Como usamos o Composer, poderíamos, inclusive, ter uma estrutura padrão MVC de uma aplicação configurada.

Na raiz do projeto, execute:

```shell
$ composer require slim/slim "^3.0"

```

Altere o `index.php` para:

```php
