AWS CodePipeline에서 CloudFormation 템플릿 검증
cfn-lint
)은 CloudFormation 리소스 사양에 대해 CloudFormation YAML 및 JSON 템플릿을 검증하는 정적 코드 분석 도구입니다. CloudFormation으로 작업하는 엔지니어는 일반적으로 컴퓨터에서 로컬로 이 도구를 실행하여 템플릿 관련 문제를 수정하고 즉시 수정합니다.그러나... 더 큰 팀에서 작업하고 수백 개의 템플릿을 관리해야 하는 사용 사례가 있습니다. CI/CD 파이프라인에 통합
cfn-lint
하면 공유 CloudFormation 템플릿에 규칙을 적용할 수 있으므로 더 큰 팀에 대한 규칙과 지침을 더 쉽게 표준화할 수 있습니다. 사용자 지정 AWS CodeBuild 프로젝트를 사용하여 AWS CodePipeline에 통합cfn-lint
할 예정입니다.개요
이 예제에는 AWS CodeCommit 리포지토리의 CloudFormation 템플릿을 포함하여 소스 코드가 포함된 AWS CodePipeline이 있습니다. 다음에는
cfn-lint
도구가 포함된 AWS CodeBuild 작업이 있는 유효성 검사 단계가 있습니다. 템플릿이 스캔되고 보고서가 암호화된 S3 버킷으로 전송됩니다. 마지막 단계에는 유효성 검사가 완료된 후의 실제 배포가 포함됩니다.관로
파이프라인을 구축하는 경우 다음과 같이 표시됩니다(스니펫).
CodePipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
ArtifactStore:
Location:
Ref: ArtifactStore
Type: S3
Name: !Ref CloudFormationPipelineName
RoleArn: !GetAtt CodePipelineRole.Arn
RestartExecutionOnUpdate: False
Stages:
- Name: Source
Actions:
- Name: GetSource
ActionTypeId:
Category: Source
Owner: AWS
Version: 1
Provider: CodeCommit
OutputArtifacts:
- Name: source
Configuration:
BranchName: master
RepositoryName: cloudformation-codecommit-repo
- Name: Validation
Actions:
- Name: Linter
RunOrder: 1
InputArtifacts:
- Name: source
ActionTypeId:
Category: Build
Owner: AWS
Version: 1
Provider: CodeBuild
Configuration:
ProjectName: !Ref CodeBuildLinter
- Name: Deploy
Actions:
- Name: Dev
RunOrder: 1
InputArtifacts:
- Name: source
ActionTypeId:
Category: Build
Owner: AWS
Version: 1
Provider: CodeBuild
Configuration:
ProjectName: !Ref CodeBuildDev
ArtifactStore:
Type: AWS::S3::Bucket
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: aws:kms
CloudFormation 템플릿 스니펫에는 빌드에서 아티팩트를 저장하기 위한 아티팩트 버킷을 포함하여 이전에 언급된 세 단계
Source -> Validation -> Deploy
가 포함되어 있습니다.코드빌드
이 파이프라인의 가장 중요한 부분은 CodeBuild 단계가 포함된 유효성 검사 단계입니다.
CodeBuildLinter:
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: CODEPIPELINE
Description: Linting CloudFormation templates and sending reports to S3
Environment:
ComputeType: BUILD_GENERAL1_SMALL
EnvironmentVariables:
- Name: AWS_ACCOUNT_ID
Value: !Sub ${AWS::AccountId}
- Name: CFN_LINT_BUCKET
Value: !Ref CfnLintBucket
- Name: CFN_LINT_KMS_KEY_ARN
Value: !Ref CfnLintKmsKeyId
- Name: CODE_PIPELINE_NAME
Value: !Ref ProvisioningPipelineName
Image: aws/codebuild/standard:3.0
Type: LINUX_CONTAINER
ServiceRole: !GetAtt CodeBuildRole.Arn
Source:
Type: CODEPIPELINE
BuildSpec: buildspec-linter.yml
TimeoutInMinutes: 20
cfn-lint
도구는 이 파이프라인의 유효성 검사 단계에서 CodeBuild 작업으로 추가됩니다. AWS 계정 ID, S3 보고서 버킷, KMS 키 및 파이프라인 이름과 같은 추가 환경 변수를 추가합니다. 다음 단계는 CodeBuild 프로젝트의 buildspec을 설정하고 실행해야 하는 명령이 포함된 컨테이너를 추가하는 것입니다.version: 0.2
phases:
install:
runtime-versions:
python: 3.8
commands:
- apt-get update -y
- apt-get install -y uuid-runtime
- pip install cfn-lint
build:
commands:
- |
REPORT=$(uuidgen)-cfnlint-report.json
set +e; cfn-lint -f json > $REPORT
aws s3 cp $REPORT s3://$CFN_LINT_BUCKET/$AWS_ACCOUNT_ID/$CODE_PIPELINE_NAME/$(date +'%Y')/$(date +'%m')/$(date +'%d')/ --sse=aws:kms --sse-kms-key-id $CFN_LINT_KMS_KEY_ARN --acl bucket-owner-full-control
먼저 컨테이너에 필요한 패키지를 설치합니다. 다음으로
cfn-lint
를 실행하고 명령이 오류를 보고할 때 종료되지 않는지( set +e
) 확인합니다. 이 상황에서는 보고용으로만 cfn-lint
를 사용하기 때문에 오류가 발견되더라도 CodeBuild 종료를 중지하고 싶지 않습니다.이 설정에서는 분석해야 하는 템플릿을 지정하는 configuration file을 포함했습니다.
분석 후 암호화된 S3 버킷에 업로드될 JSON 형식의 보고서를 생성합니다. 보시다시피 S3 CLI 명령이 보고서를 S3 버킷으로 전송하는 데 사용되고 있습니다. 객체를 동적으로 생성하고 KMS 암호화를 활성화하기 위해
AWS::CodeBuild::Project
리소스에서 전달한 변수를 포함했습니다. 보고서가 S3에 업로드되면 다른 애플리케이션에서 사용할 수 있습니다.KMS 및 S3 버킷
AWS KMS를 활성화하는 경우 CodeBuild 역할에 대해 다음 정책을 포함해야 합니다.
- Action:
- s3:ListBucket
- s3:ListBucketVersions
- s3:ListObjects
- s3:PutObject
- s3:PutObjectAcl
Effect: Allow
Resource:
- !GetAtt CfnLintBucket.Arn
- !Sub ${CfnLintBucket.Arn}/*
Sid: Allow S3 put CfnLintBucket
- Action:
- kms:Encrypt
- kms:ReEncrypt*
- kms:GenerateDataKey*
- kms:DescribeKey
- kms:ListKeys
Effect: Allow
Resource: !GetAtt KMSKey.Arn
Sid: Allow use of CMK in CfnLintBucket
CodeBuild 역할은 보고서를 대상 버킷(CfnLintBucket)에 넣을 수 있습니다. 또한 역할이 S3 버킷에 대해 생성한 KMSKey를 사용하여 객체를 암호화하도록 허용합니다. 그런 다음 KMS 키 정책에서 CodeBuildRole을 명시적으로 허용해야 합니다. 다음과 같이 할 수 있습니다.
- Sid: Allow encrypt use of the key by the CodeBuildRole
Effect: Allow
Principal:
AWS:
- !GetAtt CodeBuildRole.Arn
Action:
- kms:Encrypt
- kms:ReEncrypt*
- kms:GenerateDataKey*
- kms:DescribeKey
- kms:ListKeys
Resource: '*'
요약
cfn-lint를 검증 단계로 추가하여 CloudFormation 템플릿을 분석하고 보고서를 암호화된 S3 버킷으로 보내는 CodePipeline을 설정했습니다. 이를 통해 감사자는 예를 들어 모범 사례에 따라 템플릿이 얼마나 잘 구축되었는지 확인할 수 있습니다.
👋 이 기사가 마음에 드셨나요? 아래 의견에 연락하거나 의견을 보내주세요.
이 글을 읽으면서 가치를 발견하셨다면 sponsoring me까지 지원해 주시기 바랍니다. 여러분의 지원 덕분에 제가 가장 좋아하는 일인 클라우드 커뮤니티와 학습 내용을 공유하는 일을 계속할 수 있습니다.
Reference
이 문제에 관하여(AWS CodePipeline에서 CloudFormation 템플릿 검증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/validating-cloudformation-templates-in-aws-codepipeline-4f3i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)