通过 Lambda 和 Slack 监控你的 AWS 代码构建

通过 Lambda 和 Slack 监控你的 AWS 代码构建

原文:https://medium.com/hackernoon/monitor-your-aws-codebuilds-via-lambda-and-slack-ae2c621f68f1

我最近设置了 AWS CodePipeline 和 CodeBuild 来执行持续集成和测试。开箱即用中缺少的部分是构建通知。我想知道我的构建是通过还是失败,如果失败了,错误是什么。

我能够使用 AWS CloudWatch Events、Lambda 和 Slack 快速解决问题。它是这样工作的…

CloudWatch 事件触发所有代码构建阶段的 Lambda。Lambda 帖子是给 Slack web hook 的消息。我得到了松弛的信息…现场直播是好的。

我使用 CloudFormation 来定义和部署堆栈。

Lambda 权限和功能

*#
# Role that our Lambda will assume to provide access to other AWS resources
#* **IamRoleLambdaExecution:
  Type:** AWS::IAM::Role
  **Properties:
    AssumeRolePolicyDocument:
      Version:** '2012-10-17'
      **Statement:** - **Effect:** Allow
          **Principal:
            Service:** - lambda.amazonaws.com
          **Action:** - sts:AssumeRole
    **Path:** '/'

*#
# Create a Policy and attach it to our Lambda Role.
#* **IamPolicyLambdaExecution:
  Type:** AWS::IAM::Policy
  **DependsOn:** IamRoleLambdaExecution
  **Properties:
    PolicyName:** IamPolicyLambdaExecution
    **PolicyDocument:
      Version:** '2012-10-17'
      **Statement:** - **Effect:** Allow
        **Action:** - logs:*
        **Resource:** '*'
    **Roles:** - **Ref:** IamRoleLambdaExecution

*#
# Lambda Function
#*
**SlackFunction:
  Type:** AWS::Lambda::Function
  **Properties:
    Handler:** slack.handler
    **Timeout:** 5
    **Role:
      Fn::GetAtt:** - IamRoleLambdaExecution
        - Arn
    **Code:
      S3Bucket:** <your s3 bucket>
      **S3Key:** 'slack.js.zip'
    **Runtime:** nodejs6.10
    **Environment:
      Variables:
        SLACK_HOOK_URL:** <your slack url>

将下面的 lambda 函数作为 zip 文件上传到 S3 存储桶。替换上面 CloudFormation 代码片段中的 bucket 路径和 slack hook url。

CloudWatch 事件

*#
# CloudWatch Event to trigger lambda for build slack notifications.
#* **BuildEventRule:
  Type:** 'AWS::Events::Rule'
  **Properties:
    Description:** 'BuildEventRule'
    **EventPattern:
      source:** - 'aws.codebuild'
      **detail-type:** - 'CodeBuild Build State Change'
      **detail:
        build-status:** - 'IN_PROGRESS'
          - 'SUCCEEDED'
          - 'FAILED'
          - 'STOPPED'
    **State:** 'ENABLED'
    **Targets:** -
        **Arn:** !GetAtt SlackFunction.Arn
        **Id:** 'BuildRuleLambdaTarget'

*#
# Permission for CloudWatch to invoke our Lambda
#*
**PermissionForBuildEventsToInvokeLambda:
  Type:** 'AWS::Lambda::Permission'
  **Properties:
    FunctionName:** !Ref SlackFunction
    **Action:** 'lambda:InvokeFunction'
    **Principal:** 'events.amazonaws.com'
    **SourceArn:** !GetAtt BuildEventRule.Arn

现在,当 CodeBuild 改变状态时,我们的 Lambda 将被调用。

λ代码

就是这样!

如果您想将您的通知限制到特定的 CodeBuild 实例,您可以使用project-name将它添加到 EventPattern 中。例如:

**EventPattern:
  source:** - 'aws.codebuild'
  **detail-type:** - 'CodeBuild Build State Change'
  **detail:
    project-name:** - '<your CodeBuild name>'
    **build-status:** - 'IN_PROGRESS'
      - 'SUCCEEDED'
      - 'FAILED'
      - 'STOPPED'

本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除