Use Serverspec para desarrollar código de infraestructura basado en pruebas - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Use Serverspec para desarrollar código de infraestructura basado en pruebas

Creado por Sushant Jagdale (AWS)

Entorno: PoC o piloto

Tecnologías: Infraestructura DevOps; Nube híbrida

Servicios de AWS: Amazon EC2; AWS; AWS CodeBuild CodeDeploy

Resumen

Este patrón muestra cómo usar Serverspec para escribir código de infraestructura mediante desarrollo basado en pruebas en la nube de Amazon Web Services (AWS). El patrón también cubre la automatización con AWS CodePipeline. El TDD centra su atención en lo que debe hacer el código de infraestructura, y establece una definición clara del trabajo realizado. Puede usar Serverspec para probar la infraestructura creada por herramientas como AWS CloudFormation, Terraform by HashiCorp y Ansible.

Serverspec ayuda a refactorizar el código de infraestructura. Serverspec le permite escribir pruebas de RSpec para comprobar la instalación de distintos paquetes y software, ejecutar comandos, comprobar procesos y puertos en ejecución, comprobar la configuración de permisos de los archivos, etc. Serverspec comprueba si sus servidores están configurados correctamente. Solo tiene que instalar Ruby en sus servidores. No es necesario instalar ningún software de agente.

La infraestructura basada en pruebas proporciona los siguientes beneficios:

  • Actualizaciones entre plataformas

  • Validación de las expectativas

  • Confianza en su automatización

  • Coherencia y estabilidad de la infraestructura

  • Errores tempranos

Puede usar este patrón para ejecutar pruebas unitarias de Serverspec en el software Apache y comprobar la configuración de permisos de los archivos durante la creación de imágenes de máquina de Amazon (AMI). Solo se creará la AMI si se superan todos los casos de prueba. Serverspec realizará las siguientes pruebas:

  • El proceso de Apache se está ejecutando.

  • El puerto de Apache se está ejecutando.

  • Los archivos y directorios de configuración de Apache existen en sus ubicaciones, etc.

  • Los permisos de los archivos están configurados correctamente.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de AWS activa

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Una nube privada virtual (VPC) con una subred pública

  • Instalación de la Interfaz de la línea de comandos de AWS (AWS CLI) y Git

Versiones de producto

  • HashiCorp Versión Packer: 1.6.6

  • Versión 2.5.1 y posteriores

  • AWS CLI versión 1.18.185

Arquitectura

Arquitectura de destino

  1. Cuando insertas el código en el CodeCommit repositorio, un evento de Amazon CloudWatch Events activa el CodePipeline. En la primera etapa de la canalización, se obtiene el código de. CodeCommit

  2. Se ejecuta la segunda etapa de canalización CodeBuild, que valida y crea la plantilla de Packer.

  3. Como parte del aprovisionador de compilaciones de Packer, Packer instala el software Ruby y Apache. A continuación, el aprovisionador llama a un script de intérprete de comandos que usa Serverspec para realizar pruebas unitarias del proceso, el puerto, los archivos y los directorios de Apache. El postprocesador Packer escribe un archivo de notación de JavaScript objetos (JSON) con una lista de todos los artefactos producidos por Packer durante una ejecución

  4. Por último, se crea una instancia de Amazon Elastic Compute Cloud (Amazon EC2) con el ID de AMI producido por Packer.

Herramientas

  • AWS CLIla linterfaz de la línea de comandos de AWS (AWS CLI) es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante comandos en su intérprete de comandos de línea de comandos.

  • Amazon CloudWatch Events: Amazon CloudWatch Events ofrece una near-real-time secuencia de eventos del sistema que describen los cambios en los recursos de Amazon Web Services (AWS).

  • AWS CodeBuild: AWS CodeBuild es un servicio de compilación en la nube totalmente gestionado. CodeBuild compila su código fuente, ejecuta pruebas unitarias y produce artefactos listos para su implementación.

  • AWS CodeCommit: AWS CodeCommit es un servicio de control de versiones hospedado por Amazon Web Services. Puede utilizarlo CodeCommit para almacenar y gestionar de forma privada activos (como documentos, código fuente y archivos binarios) en la nube.

  • AWS CodePipeline: AWS CodePipeline es un servicio de entrega continua que puede utilizar para modelar, visualizar y automatizar los pasos necesarios para lanzar su software. Puede diseñar y configurar rápidamente las diferentes etapas de un proceso de lanzamiento de software.

  • HashiCorp Packer: HashiCorp Packer es una herramienta para automatizar la creación de imágenes de máquinas idénticas a partir de una configuración de fuente única.

  • Serverspec: Serverspec ejecuta pruebas de RSpec para comprobar la configuración del servidor. Serverspec usa Ruby, y no es necesario instalar el software del agente.

Código

El código está adjunto. El código emplea la siguiente estructura, con tres directorios y ocho archivos.

├── 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)

Epics

TareaDescripciónHabilidades requeridas
Cree un usuario de IAM.

Cree un usuario de AWS Identity and Access Management (usuario de IAM) con acceso de consola y programático. Para obtener más información, consulte la documentación de AWS.

Desarrollador, administrador de sistemas, ingeniero DevOps
Configurar credenciales de AWS.

En su computadora local o en su entorno, configure las credenciales de AWS para el usuario de IAM. Para obtener instrucciones, consulte la documentación de AWS.

Desarrollador, administrador de sistemas, DevOps ingeniero
Pruebe sus credenciales.

Para validar las credenciales configuradas, ejecute el siguiente comando.

aws sts get-caller-identity --profile <profile>
Desarrollador, administrador de sistemas, DevOps ingeniero
TareaDescripciónHabilidades requeridas
Cree un CodeCommit repositorio.

Para crear un CodeCommit repositorio, ejecute el siguiente comando.

aws codecommit create-repository --repository-name "<provide repository-name>" --repository-description "repository to unit test the infrastructure code"
Desarrollador, administrador de sistemas, DevOps ingeniero
Escriba pruebas de RSpec.

Cree casos de prueba de RSpec para su infraestructura. Para obtener más información, consulte la sección Información adicional.

Desarrollador, DevOps ingeniero
Envía el código al CodeCommit repositorio.

Para enviar el código adjunto al CodeCommit repositorio, ejecuta los siguientes comandos.

git clone <repository url> cp -R /tmp/<code folder>/ <repository_folder>/ git add . git commit -m"initial commit" git push
Desarrollador, administrador de sistemas, DevOps ingeniero
Cree la canalización.

Para crear el proceso, ejecute en la CLI de AWS el comando que encontrará en la sección Información adicional.

Desarrollador, administrador de sistemas, DevOps ingeniero
Iniciar la canalización.

Envíe el código al CodeCommit repositorio. La confirmación en el repositorio iniciará el proceso.

Desarrollador, administrador de sistemas, DevOps ingeniero
Pruebe la URL de Apache.

Para probar la instalación de la AMI, use la siguiente URL.

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

La página mostrará un mensaje de “Hola desde Apache”.

Desarrollador, administrador de sistemas, DevOps ingeniero

Recursos relacionados

Información adicional

Escriba pruebas de RSpec

La prueba RSpec para este patrón se encuentra en <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

Puede añadir sus propias pruebas al directorio /spec.

Creación de la canalización

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

Detalles de los parámetros

repository-name— El nombre del CodeCommit repositorio de AWS

application-name: Los nombres de recurso de Amazon (ARN) están vinculados con ApplicationName; proporcione cualquier nombre

SecurityGroupId: Cualquier ID de grupo de seguridad de su cuenta de AWS que tenga el puerto 80 abierto

VpcId: ID de su VPC

SubnetId: ID de una subred pública de su VPC

Region: Región de AWS en la que se ejecuta este patrón

Keypair: Nombre de la clave de Secure Shell (SSH) para iniciar sesión en la instancia de EC2

AccountId: Su ID de cuenta de AWS

También puede crear una CodePipeline canalización mediante la consola de administración de AWS y pasar los mismos parámetros que estaban en la línea de comandos anterior.

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip