Use o Serverspec para o desenvolvimento orientado por testes de código de infraestrutura - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Use o Serverspec para o desenvolvimento orientado por testes de código de infraestrutura

Criado por Sushant Jagdale (AWS)

Ambiente: PoC ou piloto

Tecnologias: DevOps; Infraestrutura; Nuvem híbrida

Serviços da AWS: Amazon EC2; AWS; AWS CodeBuild CodeDeploy

Resumo

Esse padrão mostra como usar o Serverspec para usar o desenvolvimento orientado a testes (TDD) ao escrever código de infraestrutura na nuvem da Amazon Web Services (AWS). O padrão também abrange a automação com a AWS CodePipeline. O TDD concentrará a atenção no que o código de infraestrutura deve fazer e definirá uma definição clara de concluído. Você pode usar o Serverspec para testar a infraestrutura criada por ferramentas como AWS CloudFormation, Terraform by HashiCorp e Ansible.

O Serverspec ajuda na refatoração do código da infraestrutura. Com o Serverspec, você pode escrever testes RSpec para verificar a instalação de vários pacotes e softwares, executar comandos, verificar processos e portas em execução, verificar as configurações de permissão de arquivos e assim por diante. O Serverspec verifica se seus servidores estão configurados corretamente. Você instala somente o Ruby em seus servidores. Você não precisa instalar nenhum software agente.

A infraestrutura orientada a testes oferece os seguintes benefícios:

  • Testes entre plataformas

  • Validação de expectativas

  • Confiança em sua automação

  • Consistência e estabilidade da infraestrutura

  • Falhe antecipadamente

Você pode usar esse padrão para executar testes de unidade do Serverspec para o software Apache e verificar as configurações de permissão do arquivo durante a criação da imagem de máquina da Amazon (AMI). Uma AMI será criada somente se todos os casos de teste forem aprovados. O Serverspec realizará os seguintes testes:

  • O processo Apache está em execução.

  • A porta Apache está em execução.

  • Os arquivos e diretórios de configuração do Apache existem em determinados locais e assim por diante.

  • As permissões de arquivo estão configuradas corretamente.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta AWS ativa

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Uma nuvem privada virtual (VPC) com uma sub-rede pública

  • Instalação da AWS Command Line Interface (AWS CLI) e do Git

Versões do produto

  • HashiCorp Versão do Packer: 1.6.6

  • Versão do Ruby: 2.5.1 e posterior

  • Versão da AWS CLI: 1.18.185

Arquitetura

Arquitetura de destino

  1. Quando você envia o código para o CodeCommit repositório, um evento da Amazon CloudWatch Events envolve o. CodePipeline No primeiro estágio do pipeline, o código é obtido CodeCommit em.

  2. A segunda etapa do pipeline é executada CodeBuild, que valida e constrói o modelo do Packer.

  3. Como parte do provisionador de compilação do Packer, o Packer instala os softwares Apache e Ruby. Em seguida, o provisionador chama um script de shell que usa o Serverspec para teste de unidade do processo, porta, arquivos e diretórios do Apache. O pós-processador do Packer grava um arquivo de notação de JavaScript objeto (JSON) com uma lista de todos os artefatos produzidos pelo Packer durante uma execução

  4. Por fim, uma instância do Amazon Elastic Compute Cloud (Amazon EC2) é criada usando a ID da AMI produzida pelo Packer.

Ferramentas

  • AWS CLI: o Amazon Command Line Interface (AWS CLI) é uma ferramenta de código aberto para interagir com serviços da AWS usando comandos em seu shell de linha de comando.

  • CloudWatch Eventos da Amazon — A Amazon CloudWatch Events fornece um near-real-time fluxo de eventos do sistema que descrevem as mudanças nos recursos da Amazon Web Services (AWS).

  • AWS CodeBuild — CodeBuild A AWS é um serviço de construção totalmente gerenciado na nuvem. CodeBuild compila seu código-fonte, executa testes de unidade e produz artefatos prontos para serem implantados.

  • AWS CodeCommit — AWS CodeCommit é um serviço de controle de versão hospedado pela Amazon Web Services. Você pode usar CodeCommit para armazenar e gerenciar ativos de forma privada (como documentos, código-fonte e arquivos binários) na nuvem.

  • AWS CodePipeline — CodePipeline A AWS é um serviço de entrega contínua que você pode usar para modelar, visualizar e automatizar as etapas necessárias para lançar seu software. É possível modelar e configurar rapidamente os diferentes estágios de um processo de lançamento de software.

  • HashiCorp Packer — O HashiCorp Packer é uma ferramenta para automatizar a criação de imagens de máquina idênticas a partir de uma única configuração de origem.

  • Serverspec: o Serverspec executa testes RSpec para verificar a configuração do servidor. O Serverspec usa Ruby e você não precisa instalar o software do agente.

Código

O código está anexado. O código usa a estrutura a seguir, com três diretórios e oito arquivos.

├── amazon-linux_packer-template.json (Packer template) ├── buildspec.yaml (CodeBuild .yaml file) ├── pipeline.yaml (AWS CloudFormation template to automate CodePipeline) ├── rspec_tests (RSpec required files and spec) │   ├── Gem-file │   ├── Rakefile │   └── spec │       ├── apache_spec.rb │       └── spec_helper.rb └── scripts    └── rspec.sh (Installation of Ruby and initiation of RSpec)

Épicos

TarefaDescriçãoHabilidades necessárias
Criar um usuário do IAM.

Crie um usuário do AWS Identity and Access Management (IAM) com acesso programático e ao console. Para obter mais informações, consulte a documentação da AWS.

Desenvolvedor, administrador de sistemas, DevOps engenheiro
Configurar credenciais da AWS.

Em seu computador local ou em seu ambiente, configure as credenciais da AWS para o usuário do IAM. Para obter instruções, consulte a documentação da AWS.

Desenvolvedor, administrador de sistemas, DevOps engenheiro
Teste suas credenciais.

Para validar as credenciais configuradas, execute o comando a seguir.

aws sts get-caller-identity --profile <profile>
Desenvolvedor, administrador de sistemas, DevOps engenheiro
TarefaDescriçãoHabilidades necessárias
Crie um CodeCommit repositório.

Para criar um CodeCommit repositório, execute o comando a seguir.

aws codecommit create-repository --repository-name "<provide repository-name>" --repository-description "repository to unit test the infrastructure code"
Desenvolvedor, administrador de sistemas, DevOps engenheiro
Escreva testes RSpec.

Crie casos de teste RSpec para sua infraestrutura. Para obter mais informações, consulte a seção Informações adicionais.

Desenvolvedor, DevOps engenheiro
Envie o código para o CodeCommit repositório.

Para enviar o código anexado ao CodeCommit repositório, execute os comandos a seguir.

git clone <repository url> cp -R /tmp/<code folder>/ <repository_folder>/ git add . git commit -m"initial commit" git push
Desenvolvedor, administrador de sistemas, DevOps engenheiro
Criar o pipeline.

Para criar o pipeline, execute o comando da AWS CLI que está na seção Informações adicionais.

Desenvolvedor, administrador de sistemas, DevOps engenheiro
Iniciar o pipeline.

Confirme o código no CodeCommit repositório. Qualquer confirmação no repositório iniciará o pipeline.

Desenvolvedor, administrador de sistemas, DevOps engenheiro
Teste o URL do Apache.

Para testar a instalação da AMI, use o seguinte URL.

http://<your instance public ip>/hello.html

A página mostrará a mensagem “Hello from Apache”.

Desenvolvedor, administrador de sistemas, DevOps engenheiro

Recursos relacionados

Mais informações

Escreva testes RSpec

O teste RSpec para esse padrão está localizado em <repository folder>/rspec_tests/spec/apache_spec.rb.

require 'spec_helper' describe service('httpd') do   it { should be_enabled }   it { should be_running } end describe port(80) do   it { should be_listening } end describe file('/etc/httpd/conf/httpd.conf') do   it { should exist }   it { should be_owned_by 'root' }   it { should contain 'ServerName www.example.com' } end describe file('/etc/httpd/conf/httpd.conf') do   its(:content) { should match /ServerName www.example.com/ } end describe file('/var/www/html/hello.html') do   it { should exist }   it { should be_owned_by 'ec2-user' } end describe file('/var/log/httpd') do   it { should be_directory } end describe file('/etc/sudoers') do   it { should be_mode 440 } end describe group('root') do   it { should have_gid 0 } end

Você pode adicionar seus próprios testes ao diretório /spec.

Criar o pipeline

aws cloudformation create-stack --stack-name myteststack --template-body file://pipeline.yaml --parameters ParameterKey=RepositoryName,ParameterValue=<provide repository-name> ParameterKey=ApplicationName,ParameterValue=<provide application-name> ParameterKey=SecurityGroupId,ParameterValue=<provide SecurityGroupId> ParameterKey=VpcId,ParameterValue=<provide VpcId> ParameterKey=SubnetId,ParameterValue=<provide SubnetId> ParameterKey=Region,ParameterValue=<provide Region> ParameterKey=Keypair,ParameterValue=<provide Keypair> ParameterKey=AccountId,ParameterValue=<provide AccountId> --capabilities CAPABILITY_NAMED_IAM

Detalhes do parâmetro

repository-name— O nome do CodeCommit repositório da AWS

application-name: o nome do recurso da Amazon (ARN) está vinculado a ApplicationName; forneça qualquer nome

SecurityGroupId: qualquer ID de grupo de segurança da sua conta da AWS que tenha a porta 80 aberta

VpcId: o ID da sua VPC

SubnetId: o ID de uma sub-rede pública em sua VPC

Region: a região da AWS na qual você está executando esse padrão

Keypair: o nome da chave Secure Shell (SSH) para fazer login na instância do EC2

AccountId: o ID de sua conta da AWS

Você também pode criar um CodePipeline pipeline usando o AWS Management Console e transmitindo os mesmos parâmetros que estão na linha de comando anterior.

Anexos

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: attachment.zip