AWS CodePipelineをCloudFormationで構築してみた

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。
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のステージを増やす等することで、案件固有のテンプレートに育てることができるのではと思っております。