AWS CodePipeline에서 CloudFormation 템플릿 검증

6690 단어 clouddevopsaws
CloudFormation Linter ( 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까지 지원해 주시기 바랍니다. 여러분의 지원 덕분에 제가 가장 좋아하는 일인 클라우드 커뮤니티와 학습 내용을 공유하는 일을 계속할 수 있습니다.

좋은 웹페이지 즐겨찾기