CloudFormation을 사용하여 CloudWatch Canaris 자동 배포

CloudWatch Canaries 사이트와 API를 모니터링하고 CloudFormation AWS 리소스를 자동으로 배포할 수 있습니다.본고에서 저는 이 두 가지 기술이 어떻게 협동하여 일을 하는지 보여드리고 이 참새들을 자동으로 배치하여 일련의 응용 프로그램을 모니터링할 것입니다.

왜 구름이 형성됩니까?


Grid Smarter Cities:
  • 프런트엔드 및 백엔드 애플리케이션을 위한 CI/CD 프로세스
  • 사용자 및 권한 관리
  • CloudWatch Canaris 및 Lambda 성능 향상 등의 도구 배포
  • 우리가 이렇게 하는 것은 자원을 자동으로 배치하는 과정을 효율적이고 시간 소모가 적기 때문이다.CloudFormation은 인프라를 코드로 간주합니다. 이것은 하나의 템플릿 파일에서 자원과 의존항을 만들고 검증하며 배치할 수 있음을 의미합니다.
    스택을 업데이트해야 할 경우 사용자가 해야 할 일은 템플릿에 필요한 변경 사항을 적용하고 템플릿을 다시 로드하여 CloudFormation에서 유효성을 검사하고 리소스에 필요한 모든 변경 사항을 적용하는 것입니다.스택에 복제가 필요한 경우 템플릿을 다시 업로드하고 매개 변수를 조정하고 재배치합니다.스택이 더 이상 필요하지 않으면 단추를 누르면 모든 내용을 삭제할 수 있습니다.

    스택에 독립적인 리소스 필요


    스택을 배치하기 전에, 우리는 canary와 두 개의 S3 메모리 통을 위해 스크립트를 준비해야 한다.첫 번째 버킷은 스크린 캡처, 로그, 생성된 보고서를 저장하는 데 사용되는 참새입니다.두 번째 버킷은 참새가 사용하는 원본 코드를 저장하는 데 사용될 것입니다. 우리는 이 참새를 위해 노드 스크립트를 사용하고 있습니다.이 코드here를 찾을 수 있습니다.

    파일 업로드


    이러한 파일은 특정 폴더 구조인 AWS CloudFormation 문서에 명시되어 있지 않아야 합니다.그러나, 나는 최종적으로 당신의 canary 코드 파일 구조가/nodejs/node modules/인 것을 발견했습니다.
    다음 두 명령은 이 폴더 구조를 만들고 zip 폴더를 준비합니다.
    cp canary-function.js ./nodejs/node_modules/
    zip -r sourcecode.zip ./nodejs/*
    
    새 소스 코드입니다.zip 파일은 참새 소스 코드가 저장된 S3 저장통에 직접 업로드하기만 하면 된다.

    템플릿 작성


    이 템플릿에는 다음과 같은 매개 변수가 추가되었습니다.
  • 모니터링 중인 서비스의 이름
  • 참새의 이름
  • 소스 코드 Bucket의 이름
  • 소스 코드 저장통
  • 에 코드가 포함된 대상의 이름
  • 카나리아에 장애가 발생하면 경고 이메일을 보내는 이메일 주소
  • 모든 값은 사용자가 입력하고 템플릿을 업로드할 때 매개 변수로 전달됩니다.

    메타데이터


    Metadata:
      AWS::CloudFormation::Interface:
        ParameterGroups:
          - Label:
              default: 'Service'
            Parameters:
              - ServiceName
              - CanaryName
              - AlertEmail
          - Label:
              default: 'Buckets'
            Parameters:
              - CanarySourceCodeBucketName
              - CanarySourceCodeKey
              - CanaryArtifactBucketName
        ParameterLabels:
          ServiceName:
            default: Service Name
          CanaryName:
            default: Canary Name
          AlertEmail:
            default: Email
          CanarySourceCodeBucketName:
            default: Source code bucket name
          CanarySourceCodeKey:
            default: Key for the object 
          CanaryArtifactBucketName:
            default: The name of the S3 bucket where the artefacts will be store
    

    매개 변수


    Parameters:
      ServiceName:
        Description: Enter a lower case, high level service name without environment details. Used to autofill service names. For example, your-service-name
        Type: String
      CanaryName:
        Description: Enter a lower case name for the canary, as they should be known. For example dave not Dave
        Type: String
      AlertEmail:
        Description: Email address to send staging build alerts to, or example [email protected]
        Type: String
      CanarySourceCodeBucketName:
        Description: S3 Bucket Name where the source code lives
        Type: String
      CanarySourceCodeKey:
        Description: Key of the object which contains the source code
        Type: String
      CanaryArtifactBucketName:
        Description: S3 Bucket Name where the canary saves the screenshots and other 
        Type: String
    

    리소스


    필요한 리소스는 다음과 같습니다.
  • 구름표 참새
  • CloudWatch Canary 역할
  • CloudWatch Canary 역할의 전략
  • 참새 고장 검출을 위한 클라우드워치 경보
  • 알림 메시지를 보낼 SNS 주제
  • 종달새


    첫 번째 리소스는 AWS::Synthetics::Canary 유형입니다.지정된 카나리아 이름과 연관된 S3 스토리지 통의 속성이 템플릿 앞에 정의된 매개변수에서 읽혔습니다.현재 실행 중인 버전, 처리 프로그램, 시간표는 모두 하드코딩이지만, 이것들은 템플릿을 더욱 유연하게 하기 위해 매개 변수로 쉽게 추출할 수 있다.
    CloudwatchCanary: 
        Type: AWS::Synthetics::Canary
        Properties: 
            ArtifactS3Location: !Sub s3://${CanaryArtifactBucketName}
            Code: 
                Handler: canary-function.handler
                S3Bucket: !Sub ${CanarySourceCodeBucketName}
                S3Key:  !Sub ${CanarySourceCodeKey}
            Name: dave-the-canary
            RuntimeVersion: syn-nodejs-puppeteer-3.1
            Schedule: 
                Expression: rate(5 minutes)
            StartCanaryAfterCreation: true
            ExecutionRoleArn: !GetAtt CloudwatchCanaryRole.Arn
    

    정책과 참새를 관찰하다


    두 번째와 세 번째 자원의 유형은 AWS:IAM:Policy와 AWS::IAM:Policy입니다.CloudWatch Canary 에서 수정된 정책을 선택했습니다.이것은 우리에게 참새를 허락해 주었다.
  • 소스 코드 저장소 통
  • 에서 데이터 읽기
  • 인공제품 통
  • 의 데이터 저장 및 검색
  • 참새가 오류를 감지하면 경보를 울린다.
  • 우리는 자원 이름과 일치하도록 자원 선택기를 수정해야 합니다.최선의 방법과 안전을 위해 불필요한 행동들이 삭제되었다.

    CloudWatchsFullAccess CloudWatch 카나리아 정책


    CloudwatchCanaryPolicy:
      Type: AWS::IAM::Policy
      Properties:
        PolicyName: !Sub ${ServiceName}-dave-the-canary-policy
        PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
            Action:
            - synthetics:*
            Resource: "*"
        - Effect: Allow
            Action:
            - s3:CreateBucket
            - s3:PutEncryptionConfiguration
            Resource:
            - arn:aws:s3:::*
        - Effect: Allow
            Action:
            - iam:ListRoles
            - s3:ListAllMyBuckets
            - s3:GetBucketLocation
            - xray:GetTraceSummaries
            - xray:BatchGetTraces
            - apigateway:GET
            Resource: "*"
        - Effect: Allow
            Action:
            - s3:GetObject
            - s3:ListBucket
            - s3:PutObject
            Resource: arn:aws:s3:::*
        - Effect: Allow
            Action:
            - s3:GetObjectVersion
            Resource: arn:aws:s3:::*
        - Effect: Allow
            Action:
            - iam:PassRole
            Resource:
            - !Sub arn:aws:iam::*:role/service-role/${CloudwatchCanaryRole}
            Condition:
            StringEquals:
                iam:PassedToService:
                - lambda.amazonaws.com
                - synthetics.amazonaws.com
        - Effect: Allow
            Action:
            - iam:GetRole
            Resource:
            - !Sub arn:aws:iam::*:role/service-role/*
        - Effect: Allow
            Action:
            - cloudwatch:GetMetricData
            - cloudwatch:GetMetricStatistics
            Resource: "*"
        - Effect: Allow
            Action:
            - cloudwatch:PutMetricAlarm
            - cloudwatch:PutMetricData
            - cloudwatch:DeleteAlarms
            Resource:
            - '*'
        - Effect: Allow
            Action:
            - cloudwatch:DescribeAlarms
            Resource:
            - arn:aws:cloudwatch:*:*:alarm:*
        - Effect: Allow
            Action:
            - lambda:CreateFunction
            - lambda:AddPermission
            - lambda:PublishVersion
            - lambda:UpdateFunctionConfiguration
            - lambda:GetFunctionConfiguration
            Resource:
            - arn:aws:lambda:*:*:function:cwsyn-*
        - Effect: Allow
            Action:
            - lambda:GetLayerVersion
            - lambda:PublishLayerVersion
            Resource:
            - arn:aws:lambda:*:*:layer:cwsyn-*
            - arn:aws:lambda:*:*:layer:Synthetics:*
        - Effect: Allow
            Action:
            - ec2:DescribeVpcs
            - ec2:DescribeSubnets
            - ec2:DescribeSecurityGroups
            Resource:
            - "*"
        - Effect: Allow
            Action:
            - sns:ListTopics
            Resource:
            - "*"
        - Effect: Allow
            Action:
            - sns:CreateTopic
            - sns:Subscribe
            - sns:ListSubscriptionsByTopic
            Resource:
            - arn:*:sns:*:*:Synthetics-*
        Roles:
        - !Ref CloudwatchCanaryRole
    

    CloudWatch 카나리아 역할


    CloudwatchCanaryRole:
        Type: AWS::IAM::Role
        Properties:
            RoleName:  !Sub ${ServiceName}-${CanaryName}-the-canary-role
            AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
                - Effect: Allow
                Principal:
                    Service:
                    - lambda.amazonaws.com
                Action:
                    - sts:AssumeRole
    
    배치된 canary 자체는 canary 소스 코드 파일로 사용되는 자원을 감시합니다.카나리아가 발견한 모든 문제는 클라우드워치 관련 대시보드에서 볼 수 있다.불행히도, 이것은 어떠한 전자 우편 경보나 통지도 울리지 않을 것이다.스택에 이 기능을 추가하는 것은 간단합니다. CloudWatchAlarm과 SNS 테마를 추가해야 합니다.

    주제 및 경고 추가


    다음 섹션을 추가하여 템플릿을 커밋하면 지정된 e-메일 주소로 경고 e-메일이 전송됩니다.
    하나의 평가 기간 동안 평균 성공 계수가 100%보다 낮을 때 클라우드 워치 캐너 경보가 촉발된다.이 시간은 5분으로 하드코딩되었다.이 장애가 감지되면 CloudWatchCanaryAlarmTopic이 트리거됩니다.
    CloudwatchCanaryAlarm:
        Type: AWS::CloudWatch::Alarm
        Properties:
            ActionsEnabled: true
            AlarmDescription: !Sub ${ServiceName}-${CanaryName}-the-canary-alert
            ComparisonOperator:  LessThanThreshold
            EvaluationPeriods: 1
            DatapointsToAlarm: 1
            MetricName: SuccessPercent
            Namespace: CloudWatchSynthetics
            Period: 60
            Statistic: Average
            Threshold: 100
            TreatMissingData: notBreaching
            AlarmActions:
            - !Ref CloudwatchCanaryAlarmTopic
            Dimensions:
                - Name: CanaryName
                Value: !Sub ${CanaryName}-the-canary
    
    CloudWatchCanaryAlarmTopic은 AlertEmail 주소로 메시지를 보냅니다. 이 주소는 사용자가 창고를 배치할 때 입력한 CloudFormation 파라미터가 지정합니다.
    CloudwatchCanaryAlarmTopic:
        Type: AWS::SNS::Topic
        Properties:
            DisplayName: !Sub ${CanaryName}-cw-canary-alarms
            Subscription:
                - Endpoint: !Ref AlertEmail
                Protocol: email
    

    스택 배포


    남은 일은 참새 데이브를 배치하는 것이다.이를 위해 템플릿을 업로드하고 스택 매개 변수를 정의하는 양식을 작성합니다. 아래와 같이 다음(기본 스택 옵션은 구성하지 않음)을 클릭하고 다음을 다시 클릭하여 "AWS CloudFormation이 IAM 리소스를 사용자 정의 이름으로 만들 수 있는지 확인한 다음 스택 만들기 버튼을 클릭합니다.그리고 자원을 배치하고 실행해야 합니다.

    폐막사


    이 CloudFormation 템플릿은 Grid Smarter Cities 개발자가 Google 제품을 모니터링하는 도구를 배포할 수 있도록 도와줍니다.콘솔에서 카나리아를 배치하는 것은 간단하지만 클라우드 포메이션을 사용하면 배치 과정을 자동화하여 모든 제품에 모니터링 도구와 경보를 설정할 수 있다.
    이 템플릿을 작성하는 데는 약간의 연구와 시도와 오류가 필요할 수 있지만, 이렇게 하는 과정에서 우리 개발자와 QA는 우리의 제품이 활성 상태인지 수동으로 검사할 필요가 없을 것이다.만약 제품이 그렇지 않다면 클라우드 워치 캐너는 우리가 수동으로 자신을 검사할 때보다 빠르고 신뢰할 수 있다는 것을 자동으로 우리에게 알릴 것이다.
    에서 두 템플릿(경고 또는 없음)과 샘플 카나리아 기능의 전체 복사본을 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기