AWS CodePipelineを使ったSAMアプリケーションのCI/CD環境構築(後編)

AWS

AWSサービスを利用した、SAMアプリケーションのCI/CD環境(後編)です。
前編は以下を参照してください。
AWS CodePipelineを使ったSAMアプリケーションのCI/CD環境構築(前編)

前編では基礎となるリポジトリ(CodeCommit)とビルド環境(CodeBuild)を作成しました。
今回はそれらのサービスをCodePipelineで利用し、自動ビルド・デプロイ環境を作っていきます。

AWS CodeCommitのPushイベント検知

AWS CodeCommitのPushイベント検知方法は色々な種類があるのですが
今回は「Amazon CloudWatch Events」を利用して、Pushイベントを検知します。

プッシュイベントを使用するようにパイプラインを編集する

通知を行うためにCodePipelineに権限を付与する必要があるので
CodePipline用にロールを作成します。

  AmazonCloudWatchEventRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - events.amazonaws.com
            Action: sts:AssumeRole
      Path: /
      Policies:
        -
          PolicyName: cwe-pipeline-execution
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              -
                Effect: Allow
                Action: codepipeline:StartPipelineExecution
                Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] 

あとは「PollForSourceChanges」を true に設定すると
CodePiplineがCodeCommitを監視し、変更があればパイプラインを自動で開始してくれます。

AWS CodePipelineの構築

・ Sourceステージに前編で作成したCodeCommitのリポジトリを指定
・ Buildステージに前編で作成したCodeBuildプロジェクトを指定
・ ロールには前編で作成した「MyCodePipelineServiceRole」を指定

  AppPipeline: 
    Type: AWS::CodePipeline::Pipeline 
    Properties: 
      Name: AppPipeline
      RoleArn: !GetAtt MyCodePipelineServiceRole.Arn
      ArtifactStore:
        Type: S3
        Location: app-pipeline-artifacts
      Stages: 
        - 
          Name: Source
          Actions: 
            - 
              Name: SourceAction
              ActionTypeId: 
                Category: Source 
                Owner: AWS 
                Version: 1 
                Provider: CodeCommit
              Configuration:
                RepositoryName: MyDemoRepo
                BranchName: master
                PollForSourceChanges: true
              OutputArtifacts:
                - Name: app-rtifact
        - 
          Name: Build
          Actions: 
            - 
              Name: BuildAction
              ActionTypeId: 
                Category: Build 
                Owner: AWS 
                Version: 1
                Provider: CodeBuild
              Configuration:
                ProjectName: myProjectName
              InputArtifacts:
                - Name: app-rtifact

これでパイプラインが構築出来ました!
指定したCodeCommitにPushを行うと自動でパイプラインが実行されて
SAMプロジェクトのビルドとデプロイが行われるので試してください。

AWS ChatbotクライアントによるSlack通知

AWS Chatbotクライアントの設定

AWS Chatbotを利用しSlack通知を行うにはSlackのアクセス許可を取得する必要があります。
ここはCFnでは出来ないのでAWSコンソールから実施します。

AWS Chatbotのコンソールを開きます。
チャットクライアントで「Slack」を選択し「クライアントを設定」ボタンを押下します。

以下のように権限リクエストの画面が表示されたら、アクセス許可を行います。

これで指定したSlackのワークスペースが作成され、「ワークスペース ID」が
発行されていますので確認しておきます。後ほどこのIDをCFnで指定します。

AWS ChatbotのSlackチャネル設定

通知に必要なロールを作成し、AWS ChatbotのSlackチャンネル設定を行います。
「SlackWorkspaceId」に先程作成したSlackのワークスペースIDを指定、
「SlackChannelId」には連携するSlackのチャンネルIDを指定します。
※SlackのチャンネルIDはSlackで
  チャンネルを選択 → 右クリック → リンクをコピー
 で取得したリンク末尾の英数字になります。

  PipelineNotificationRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - chatbot.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess

  AppPipelineNotificationForSlack:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: app-pipeline-notification-slack
      IamRoleArn: !GetAtt PipelineNotificationRole.Arn
      LoggingLevel: ERROR
      SlackChannelId: xxx
      SlackWorkspaceId: xxx

AWS Codepipelineの通知ルール作成


通知は対象のカテゴリ(ステージやパイプライン実行)と
ステータス(成功・失敗・キャンセルなど)を指定することが可能です。

指定可能なIDの一覧は以下を参照してください。
Events for notification rules on pipelines
今回はパイプライン実行の全てのステータス変更通知を受け取るように指定します。

  PipelineNotificationRule:
    Type: AWS::CodeStarNotifications::NotificationRule
    Properties:
      Name: app-pipeline-notification-rule
      DetailType: FULL
      Resource: !Sub arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:AppPipeline
      EventTypeIds:
        - codepipeline-pipeline-pipeline-execution-started
        - codepipeline-pipeline-pipeline-execution-succeeded
        - codepipeline-pipeline-pipeline-execution-failed
        - codepipeline-pipeline-pipeline-execution-canceled
        - codepipeline-pipeline-pipeline-execution-resumed
        - codepipeline-pipeline-pipeline-execution-superseded
      Targets:
        -
          TargetType: AWSChatbotSlack
          TargetAddress: !Ref AppPipelineNotificationForSlack

これで通知設定が完了しました。
CodeCommitにソースをPushすると、ビルドの開始や完了が
Slackに通知されるようになっていると思います。

Slack通知をE-mail通知に変更したい場合はSNSトピックを作成し
SNSトピック経由で通知するように設定すればOKです。

以上

タイトルとURLをコピーしました