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です。
以上