5 minutos
Instalando driver MSSQL no PHP com AWS Elastic Beanstalk
Outra proposta minha foi aceita no portal Freelancer. Desta vez seria algo que não tenho muito conhecimento. Tenho conhecimento com AWS principalmente com S3 e EC2, mas nunca fiquei cara a cara com a orquestração Elastic Beanstalk.
Fui sincero na minha proposta, informando que minha área de maior conhecimento é Linux, mas tenho experiência com Docker e Kubernetes.
O empregador rebateu perguntando se eu já trabalhei com EB, informei que não, mas como é um contêiner baseado em CentOS, eu conseguiria me virar. Fiz uma proposta informando que eu iria escrever as configurações, e após o OK, ele aceitaria minha proposta.
Uma das melhores formas de aprender, é na marra!
Poucas documentações
Me deparei com poucas documentações informando como instalar os drivers MSSQL no PHP para Linux. A maioria já estava bem defasada. O que eu fiz? Instalar um CentOS virtualizado e ir procurando documentação do pecl.
Instalando no CentOS virtualizado
Basicamente precisava instalar o PHP, Pear, os compiladores GCC e o devel do driver ODBC.
yum update -y
# Habilitando PHP7, pois o CentOS 7 vem com PHP5
yum install -y epel-release yum-utils
yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php74
yum install -y php php-common php-opcache php-mcrypt php-cli php-gd \
php-curl php-mysqlnd php-pear php-devel gcc gcc-c++ unixODBC-devel
# Verificando a versão do PHP
php -v
E agora compilar o módulo e ativar as bibliotecas no conf
pecl install sqlsrv
pecl install pdo_sqlsrv
# Ativando as bibliotecas
echo extension=sqlsrv.so > /etc/php.d/sqlsrv.ini
echo extension=pdo_sqlsrv.so > /etc/php.d/pdo_sqlsrv.ini
Como eu não queria instalar o servidor web, vou rodar o phpinfo() pelo shell
echo "<?php
phpinfo();" > phpinfo.php
php phpinfo.php > resultado.txt
E no arquivo, fui procurar a parte pdo_sqlsrv para verificar se o módulo está ativo, e estava :)
pdo_sqlsrv
pdo_sqlsrv support => enabled
ExtensionVer => 5.8.1
Directive => Local Value => Master Value
pdo_sqlsrv.client_buffer_max_kb_size => 10240 => 10240
pdo_sqlsrv.log_severity => 0 => 0
pdo_sqlsrv.set_locale_info => 2 => 2
Agora é ler a documentação da AWS e verificar como faço o deploy do contêiner
Começando a apanhar
Pela documentação eu só precisaria me preocupar com a pasta .ebextensions, com um arquivo config e com os blocos de comandos em YAML.
Todos os arquivos de configurações para o deploy devem ficar na pasta .ebextensions, então criei o arquivo mssql.config. Percebi uma enorme diferença entre os comandos commands e container_commands. Sem me aprofundar, a chave commands é executada antes da inicialização do contêiner, e a chave container_commands é executada após a inicialização do contêiner.
Então comecei a montar o YAML .ebextensions/mssql.config:
commands:
# Instalação do Pear, compiladores e os headers
00_yum:
command: yum install -y php-pear gcc gcc-c++ unixODBC-devel
# Compilando o driver MSSQL
01_sqlsrv:
command: pecl install sqlsrv
# Compilando o PDO
02_pecl_pdo:
command: pecl install pdo_sqlsrv
# Configurando os módulos nos confs
03_files:
command: |
echo extension=sqlsrv.so > /etc/php.d/sqlsrv.ini
echo extension=pdo_sqlsrv.so > /etc/php.d/pdo_sqlsrv.ini
Crie o arquivo index.php:
<?php
phpinfo();
Para enviar os arquivos para o EB é só compactar todos os arquivos como ZIP e fazer o upload
Criando a instância
Para criar a instância faça
- Vá em https://console.aws.amazon.com/elasticbeanstalk;
- Clique em Create a new environment;
- Deixe marcado Web server environment => Select;
- Em Aplication name informe o nome da aplicação;
- Environment name deixe como preencheu;
- Platform => PHP e deixe o restante como padrão;
- Em Application code => Upload your code;
- Local file => Choose file e envie o .ZIP;
- Clique em Create environment e aguarde o deploy.
Se aparecer um OK, funcionou….. só que não!
Clique em Go to environment e observe o sqlsvr.
Primeiro problema
Me deparei com esse problema quando eu queria atualizar somente o arquivo PHP. Se pegar o mesmo arquivo .ZIP e enviar é apresentado erros no deploy, mas por quê?
Para enviar uma nova versão é ir em Application versions => Upload => selecionar a nova versão => Actions => Deploy.
Porque os comandos pecl quando executado novamente retornam erro, e o deploy finalizado com a saída de erro. A solução seria verificar se existem os arquivos .SO e não executar novamente
commands:
# Instalação do Pear, compiladores e os headers
00_yum:
command: yum install -y php-pear gcc gcc-c++ unixODBC-devel
# Compilando o driver MSSQL
01_sqlsrv:
command: |
if [ ! -f "/usr/lib64/php/modules/sqlsrv.so" ]; then
pecl install sqlsrv
fi
# Compilando o PDO
02_pecl_pdo:
command: |
if [ ! -f "/usr/lib64/php/modules/pdo_sqlsrv.so" ]; then
pecl install pdo_sqlsrv
fi
# Configurando os módulos nos confs
03_files:
command: |
echo extension=sqlsrv.so > /etc/php.d/sqlsrv.ini
echo extension=pdo_sqlsrv.so > /etc/php.d/pdo_sqlsrv.ini
Segundo problema
Agora seria testar a conexão, alterei o arquivo index.php para uma conexão com a base de dados e um retorno simples. O banco foi fornecido pelo próprio empregador
<?php
$pdo = new PDO( "sqlsrv:server=example.com;database=db",
"username", "password");
$query = $pdo->query("SELECT * FROM contacts");
$assoc = $query->fetch(PDO::FETCH_ASSOC);
print_r($assoc);
Fiz novamente o upload, e o que acontece?
"SQLSTATE[IMSSP]: This extension requires the Microsoft ODBC Driver for
SQL Server to communicate with SQL Server. Access the following URL to
download the ODBC Driver for SQL Server for x64:
https://go.microsoft.com/fwlink/?LinkId=163712"
Pela documentação da Microsoft, é necessário um driver ODBC para comunicar, então é ler, e adaptar ao YAML
commands:
# Instalação do Pear, compiladores e os headers
00_yum:
command: yum install -y php-pear gcc gcc-c++ unixODBC-devel
# Compilando o driver MSSQL
01_sqlsrv:
command: |
if [ ! -f "/usr/lib64/php/modules/sqlsrv.so" ]; then
pecl install sqlsrv
fi
# Compilando o PDO
02_pecl_pdo:
command: |
if [ ! -f "/usr/lib64/php/modules/pdo_sqlsrv.so" ]; then
pecl install pdo_sqlsrv
fi
# Configurando os módulos nos confs
03_files:
command: |
echo extension=sqlsrv.so > /etc/php.d/sqlsrv.ini
echo extension=pdo_sqlsrv.so > /etc/php.d/pdo_sqlsrv.ini
# Driver ODBC
05_odbc:
command: |
curl https://packages.microsoft.com/config/rhel/7/prod.repo > \
/etc/yum.repos.d/mssql-release.repo
ACCEPT_EULA=Y yum install -y msodbcsql17
ACCEPT_EULA=Y yum install -y mssql-tools
export PATH="$PATH:/opt/mssql-tools/bin"
E após enviar tudo novamente, obtive a minha consulta, e finalizei o projeto!
REFERÊNCIAS
Documentação AWS Elastic Beanstalk https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/ebextensions.html Documentação Microsoft https://docs.microsoft.com/en-us/sql/connect/php/system-requirements-for-the-php-sql-driver?redirectedfrom=MSDN&view=sql-server-ver15 Entendendo o AWS Elastic Beanstalk https://guilhermeteles.com.br/entendendo-o-aws-elastic-beanstalk/