AWS CodePipelineをCloudFormationで構築してみた

2017.06.28

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。 AWSのDevOps系のサービスであるCodePipeline触ってみました。 普通にManagement Consoleから構築するのは以下を参考にするとよいかと思います。

CodePipeline で CodeCommit/CodeBuild/CodeDeploy を繋げてデリバリプロセスを自動化してみた #reinvent

上記の記事を追従するのも良いですが、今後のことも見通してCloudFormationで今回は構築しました。

テンプレート

Parameters:
GitHubOwner:
Type: String
Description: GitHub Owner Name
GitHubToken:
Type: String
Description: GitHub Token
Repository:
Type: String
Description: GitHub Repository
Branch:
Type: String
Description: GitHub Branch
ServiceName:
Description: Name for the service
Type: String
AllowedPattern: "[-_ a-zA-Z0-9]*"
ConstraintDescription: can contain only alphanumeric characters, spaces, dashes
and underscores.
CodePipelineArtifactStoreBucket:
Type: String
CodePipelineRoleArn:
Type: String
CodeBuildRoleArn:
Type: String
CodeBuildImage:
Type: String
Default: "aws/codebuild/nodejs:7.0.0"
Description: Image used for CodeBuild project.
Resources:
CodeBuildProject:
Description: Creating AWS CodeBuild project
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: CODEPIPELINE
Description: !Sub Building stage for ${Branch}.
Environment:
ComputeType: BUILD_GENERAL1_SMALL
EnvironmentVariables:
- Name: Branch
Value: !Ref Branch
Image: !Ref CodeBuildImage
Type: LINUX_CONTAINER
Name: !Sub ${ServiceName}-${Branch}-build
ServiceRole: !Ref CodeBuildRoleArn
Source:
Type: CODEPIPELINE
TimeoutInMinutes: 5
ProjectPipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
ArtifactStore:
Location: !Ref CodePipelineArtifactStoreBucket
Type: S3
Name: !Sub ${ServiceName}-${Branch}-Pipeline
RestartExecutionOnUpdate: false
RoleArn:
Ref: CodePipelineRoleArn
Stages:
-
Name: Source
Actions:
-
Name: SourceAction
ActionTypeId:
Category: Source
Owner: ThirdParty
Provider: GitHub
Version: 1
OutputArtifacts:
-
Name: SourceOutput
Configuration:
Owner: !Ref GitHubOwner
Repo: !Ref Repository
Branch: !Ref Branch
OAuthToken: !Ref GitHubToken
RunOrder: 1
-
Name: Build
Actions:
-
Name: CodeBuild
InputArtifacts:
-
Name: SourceOutput
ActionTypeId:
Category: Build
Owner: AWS
Version: 1
Provider: CodeBuild
Configuration:
ProjectName: !Ref CodeBuildProject
OutputArtifacts:
-
Name: CodebuildOutput
RunOrder: 1

パラメータ

  • GitHubOwner デプロイ対象のGithubリポジトリの所有者を入力します。
  • GitHubToken デプロイ対象のリポジトリにアクセスするためのTokenを入力します。 GithubのユーザーのメニューからSetting→Developer settings → Personal access Tokenで取得できます。
  • Repository デプロイ対象のGithubリポジトリ名を入力します。
  • Branch デプロイ対象のブランチ名を入力します。
  • ServiceName デプロイ対象のサービス名を指定します。
  • CodePipelineArtifactStoreBucket CodePipelineの結果を格納するS3 Bucketを指定します。
  • CodePipelineRoleArn CodePipelineに付与するRoleのARNを指定します。
  • CodeBuildRoleArn CodeBuildに付与するRoleのARNを指定します。
  • CodeBuildImage CodeBuildのビルド環境のコンテナイメージ名を指定します。

動かしてみた

以下のGithubのリポジトリを対象に、上記のCloudFormationを動かしてみました。

CM-Kajiwara/codepipeline_sample

Cloudformationのスタックが作成された後、CodePipelineが自動で動き出します。 CodePipelineから呼び出されたCodeBuildがリポジトリに配置してあるbuildspec.ymlに基いてビルドをおこないます。

まとめ

そんなに大きくハマること無く、CodePipelineの構築ができました。

このテンプレート自体は構築に用いるブランチ名等はすべてパラメータになっています。 そのため後はBuildのステージを増やす等することで、案件固有のテンプレートに育てることができるのではと思っております。