인프라 코드의 테스트 기반 개발을 위해 Serverspec을 사용합니다 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

인프라 코드의 테스트 기반 개발을 위해 Serverspec을 사용합니다

작성자: Sushant Jagdale(AWS)

환경: PoC 또는 파일럿

기술: DevOps, 인프라, 하이브리드 클라우드

AWS 서비스: Amazon EC2, AWS CodeBuild, AWS CodeDeploy

요약

이 패턴은 Amazon Web Services(TDD) 클라우드에 인프라 코드를 작성할 때 Serverspec을 사용하여 테스트 기반 개발(AWS)을 사용하는 방법을 보여줍니다. 패턴은 를 사용한 자동화도 다룹니다AWS CodePipeline. TDD 는 인프라 코드가 수행해야 하는 작업에 주의를 기울이고 완료에 대한 명확한 정의를 설정합니다. Serverspec을 사용하여 AWS CloudFormation, Terraform by HashiCorp, Ansible과 같은 도구에서 생성된 인프라를 테스트할 수 있습니다.

Serverspec은 인프라 코드를 리팩터링하는 데 도움이 됩니다. Serverspec을 사용하면 RSpec 테스트를 작성하여 다양한 패키지 및 소프트웨어의 설치를 확인하고, 명령을 실행하고, 실행 중인 프로세스 및 포트를 확인하고, 파일 권한 설정 등을 확인할 수 있습니다. Serverspec은 서버가 올바르게 구성되어 있는지 확인합니다. 서버에는 Ruby만 설치합니다. 에이전트 소프트웨어를 설치할 필요가 없습니다.

테스트 기반 인프라는 다음과 같은 이점이 있습니다.

  • 교차 플랫폼 테스트

  • 기대치 검증

  • 자동화에 대한 자신감

  • 인프라 일관성 및 안정성

  • 조기 실패

이 패턴을 사용하여 Apache 소프트웨어에 대한 Serverspec 단위 테스트를 실행하고 Amazon Machine Image(AMI)를 생성하는 동안 파일 권한 설정을 확인할 수 있습니다. 모든 테스트 사례가 통과한 경우에만 AMI가 생성됩니다. Serverspec은 다음과 같은 테스트를 수행합니다.

  • Apache 프로세스가 실행 중입니다.

  • Apache 포트가 실행 중입니다.

  • Apache 구성 파일 및 디렉토리는 특정 위치에 있는 식입니다.

  • 파일 권한이 올바르게 구성되었습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 AWS 계정

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • 퍼블릭 서브넷이 있는 가상 프라이빗 클라우드(VPC)

  • AWS 명령줄 인터페이스(AWS CLI) 및 Git 설치

제품 버전

  • HashiCorp Packer 버전: 1.6.6

  • Ruby 버전 2.5.1 이상

  • AWS CLI 버전: 1.18.185

아키텍처

대상 아키텍처

Developer workflow diagram showing CodeCommit, Event, CodePipeline, AWS CodeBuild, and AMI creation.
  1. 코드를 CodeCommit 리포지토리로 푸시하면 Amazon CloudWatch Events 이벤트가 와 연결됩니다 CodePipeline. 파이프라인의 첫 번째 단계에서는 에서 코드를 가져옵니다 CodeCommit.

  2. 두 번째 파이프라인 단계는 를 실행 CodeBuild하여 Packer 템플릿을 검증하고 빌드합니다.

  3. Packer는 Packer 빌드 프로비저너의 일부로 Apache 및 Ruby 소프트웨어를 설치합니다. 그런 다음 제공자는 Serverspec을 사용하는 쉘 스크립트를 호출하여 Apache 프로세스, 포트, 파일 및 디렉터리를 유닛 테스트합니다. Packer 사후 프로세서는 실행 중에 Packer가 생성한 모든 아티팩트의 목록이 포함된 JavaScript 객체 표기법(JSON) 파일을 작성합니다.

  4. 마지막으로 Packer에서 생성한 AMI ID를 사용하여 Amazon Elastic Compute Cloud(AmazonEC2) 인스턴스가 생성됩니다.

도구

  • AWS CLI – Amazon Command Line Interface(AWS CLI)는 명령줄 쉘의 명령을 사용하여 AWS 서비스와 상호 작용하기 위한 오픈 소스 도구입니다.

  • Amazon CloudWatch Events - Amazon CloudWatch Events는 near-real-time Amazon Web Services(AWS) 리소스의 변경 사항을 설명하는 시스템 이벤트 스트림을 제공합니다.

  • AWS CodeBuild – 클라우드의 완전 관리형 빌드 서비스AWS CodeBuild 입니다. 는 소스 코드를 CodeBuild 컴파일하고, 단위 테스트를 실행하고, 배포할 준비가 된 아티팩트를 생성합니다.

  • AWS CodeCommit – AWS CodeCommit 는 Amazon Web Services에서 호스팅하는 버전 관리 서비스입니다. CodeCommit 를 사용하여 클라우드에 자산(예: 문서, 소스 코드 및 바이너리 파일)을 비공개로 저장하고 관리할 수 있습니다.

  • AWS CodePipeline – AWS CodePipeline 는 소프트웨어 릴리스에 필요한 단계를 모델링, 시각화 및 자동화하는 데 사용할 수 있는 지속적인 제공 서비스입니다. 소프트웨어 릴리스 프로세스를 구성하는 여러 단계를 신속하게 모델링하고 구성할 수 있습니다.

  • HashiCorp Packer – HashiCorp Packer는 단일 소스 구성에서 동일한 기계 이미지 생성을 자동화하는 도구입니다.

  • Serverspec - Serverspec은 RSpec 테스트를 실행하여 서버 구성을 확인합니다. Serverspec은 Ruby를 사용하므로 에이전트 소프트웨어를 설치할 필요가 없습니다.

code

코드가 첨부되었습니다. 코드는 디렉터리 3개와 파일 8개로 구성된 다음과 같은 구조를 사용합니다.

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

에픽

작업설명필요한 기술
IAM 사용자를 만듭니다.

프로그래밍 방식 및 콘솔 액세스를 사용하여 AWS Identity and Access Management(IAM) 사용자를 생성합니다. 자세한 내용은 AWS 설명서를 참조하세요.

개발자, 시스템 관리자, DevOps 엔지니어
AWS 보안 인증 정보를 구성합니다.

로컬 컴퓨터 또는 환경에서 IAM 사용자의 AWS 보안 인증을 구성합니다. 지침은 AWS 설명서 를 참조하세요.

개발자, 시스템 관리자, DevOps 엔지니어
보안 인증 정보를 테스트합니다.

구성된 보안 인증 정보를 검증하려면 다음 명령을 실행합니다.

aws sts get-caller-identity --profile <profile>
개발자, 시스템 관리자, DevOps 엔지니어
작업설명필요한 기술
CodeCommit 리포지토리를 생성합니다.

CodeCommit 리포지토리를 생성하려면 다음 명령을 실행합니다.

aws codecommit create-repository --repository-name "<provide repository-name>" --repository-description "repository to unit test the infrastructure code"
개발자, 시스템 관리자, DevOps 엔지니어
RSpec 테스트를 작성합니다.

인프라에 대한 RSpec 테스트 사례를 생성합니다. 자세한 내용은 추가 정보 섹션을 참조하세요.

개발자, DevOps 엔지니어
코드를 CodeCommit 리포지토리로 푸시합니다.

연결된 코드를 CodeCommit 리포지토리로 푸시하려면 다음 명령을 실행합니다.

git clone <repository url> cp -R /tmp/<code folder>/ <repository_folder>/ git add . git commit -m"initial commit" git push
개발자, 시스템 관리자, DevOps 엔지니어
파이프라인을 생성합니다.

파이프라인을 생성하려면 추가 정보 섹션에 있는 AWS CLI 명령을 실행합니다.

개발자, 시스템 관리자, DevOps 엔지니어
파이프라인을 시작합니다.

CodeCommit 리포지토리에 코드를 커밋합니다. 리포지토리를 커밋하면 파이프라인이 시작됩니다.

개발자, 시스템 관리자, DevOps 엔지니어
Apache 를 테스트합니다URL.

AMI 설치를 테스트하려면 다음 를 사용합니다URL.

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

페이지에 “Hello from Apache” 메시지가 표시됩니다.

개발자, 시스템 관리자, DevOps 엔지니어

관련 리소스

추가 정보

쓰기 RSpec 테스트

이 패턴에 대한 RSpec 테스트는 에 있습니다<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

/spec 디렉터리에 자체 테스트를 추가할 수 있습니다.

파이프라인 생성

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

파라미터 세부 정보

repository-name - AWS CodeCommit 리포지토리의 이름

application-name - Amazon 리소스 이름(ARNs)은 와 연결되어 ApplicationName있습니다. 이름을 입력합니다.

SecurityGroupId - 포트 80이 열려 있는 AWS 계정의 모든 보안 그룹 ID

VpcId - 의 ID VPC

SubnetId - 에 있는 퍼블릭 서브넷의 ID VPC

Region - 이 패턴을 실행하는 AWS 리전

Keypair - EC2 인스턴스에 로그인하기 위한 Secure Shell(SSH) 키 이름

AccountId - AWS 계정 ID

AWS 관리 콘솔을 사용하고 이전 명령줄에 있는 것과 동일한 파라미터를 전달하여 CodePipeline 파이프라인을 생성할 수도 있습니다.

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.