CodePipeline とは? 関連サービスや料金までまとめて解説

2023年2月21日AWS

CodePipeline-アイキャッチ

CodePipeline は関連するリソースが非常に多いサービスになりますので、混乱しないように整理しておきます。

このブログではCodePipelineを作成する記事も執筆中です。

実際に構築する時にどのリソースが必要なのかすっきりさせておくためにも事前知識を入れておきましょう。

CodePipeline とは

CodePipelineとは?

公式ドキュメントによると

AWS CodePipeline は、ソフトウェアをリリースするために必要なステップのモデル化、視覚化、および自動化に使用できる継続的な配信サービスです。ソフトウェアリリースプロセスのさまざまなステージをすばやくモデル化して設定できます。

簡単にいうとCICDのサービスです。

ソフトウェアにおける、継続的なリリースを行うためにビルドやデプロイを自動で実施してくれる便利なやつです。

従来までのデプロイというとこんな流れを手動やスクリプトで実施していました。

といった流れを手動やスクリプトで実施していました。

昨今システムやアプリケーションは「リリースしたら終わり」ではなく、リリース後も継続的なアップデートを行なっていくというものがほとんどです。

頻発するデプロイ作業を手動で行なっていくのはあまりにも非効率ですし、ヒューマンエラーも起こりますので、CI/CDという概念が生まれ、デプロイまでを自動化しようという流れが広まっていったのです。

そんなCICDを実現するためのサービスの一つがCodepipelineになります。

その他のCICDサービス

CICDを実現するサービスはCodepipeline以外にもたくさんあります。

GithubやBitbucketといったリポジトリサービスに機能として提供されているものもあります。

  • Bitbucket のパイプライン
  • Github Actions

そのほかにもパイプライン単体としてSaasで提供される

  • CircleCI

であったり、オンプレミスで使うような

  • Jenkins

などがあります。

自身の環境にあったものを選択してみてください。

Codepipeline に関連するサービス

前章の構成図を見るとわかると思いますが、Codepipelineの中では、CodeBuild、CodeDeployといった別のサービスが実行されていますので詳しく書いていきます。

CodeBuild

名前の通り、ビルドを行うサービスです。

具体的には、

  • $ yarn build / $ npm run build のようなソースコードのビルド
  • $ docker build でのコンテナイメージのビルドやタグ付け
  • $ aws cloudformation packageコマンドでのCFnテンプレートのビルド

リポジトリ内に配置するbuildspec.ymlというファイルを参照して指定の作業を行います。

公式のチュートリアルでは、以下のbuildspec.ymlが用意されています。

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 012345678910.dkr.ecr.us-west-2.amazonaws.com
      - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json

内容を見るとわかる通り、ECRのログインやコンテナイメージのビルドからプッシュまでのコマンドが記述されています。

CodeDeploy

名前の通り、デプロイを行うサービスです。

具体的には、

  • ソースコードを対象サーバに配置
  • ECSサービス内にコンテナを起動
  • CloudFormationの変更セット作成/実行

といったアクションが該当します。

CodeDeployではappspec.ymlというファイルを参照してデプロイを行います。

こちらも公式チュートリアルのサンプルを見てみますと、

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "task-definition-ARN"
        LoadBalancerInfo:
          ContainerName: "container-name"
          ContainerPort: container-port-number
# Optional properties
        PlatformVersion: "LATEST"
        NetworkConfiguration:
            AwsvpcConfiguration:
              Subnets: ["subnet-name-1", "subnet-name-2"]
              SecurityGroups: ["security-group"]
              AssignPublicIp: "ENABLED"
Hooks:
- BeforeInstall: "BeforeInstallHookFunctionName"
- AfterInstall: "AfterInstallHookFunctionName"
- AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName"
- BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName"
- AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"

この場合、ECSのタスク定義を更新して、指定のサービスを更新するようなデプロイを実施します。

Codepipeline の利用例

イメージがつきやすいと思うので、先に具体的な利用例から提示します。

対象のサーバにソースコードをデプロイする

シンプルな利用例かと思います。

チュートリアル: シンプルなパイプラインを作成する (CodeCommit リポジトリ)

こんな感じの構成図になっています。

コンテナイメージをビルドしてデプロイする

ECSやECRを利用することでコンテナ環境でも効果的に動作します。

Tutorial: Amazon ECS Standard Deployment with CodePipeline

この場合はこんな感じになります。

コンテナイメージをビルドしてデプロイする

Cloudformationのスタックを更新する

昨今IaCという考え方も広まり、CICDはアプリケーションのものだけではなくなりました。

AWSではCloudformationと一緒に利用することでCodepipelineからコードで定義されたインフラリソースを自動でデプロイすることができます。

チュートリアル: AWS CloudFormation デプロイアクションの変数を使用するパイプラインを作成する

この場合はこんな感じになります。

CloudFormationのスタックを更新する

このようにCodePipelineによってさまざまなサービスにデプロイを行うことができます。

図を見てもらうとわかる通り、手動で実行する操作はリモートリポジトリへのPushのみです。

パイプラインの構築さえ完了できれば、その後のリリース作業が自動化されるというのが楽でいいですね。

Codepipeline 関連の料金

冒頭に記載しましたが、Codepipelineはさまざまなサービスに接続して動作します。

料金もCodepipelinとそれ以外で計算する必要があるので順番に見てみましょう。

Codepipeline の料金

ここでは重要なところをかいつまんで説明いたします。

詳しい情報は公式ドキュメントをご確認ください。

無料枠

まず、パイプラインは作成後30日は無料で動かすことができます。

パイプラインは作成後の最初の 30 日間は無料です。

https://aws.amazon.com/jp/codepipeline/pricing/

次に、30日がすぎでも1ヶ月アクティブなパイプライン1つまでなら無料で動かすことができます。

新規または既存のお客様は、アクティブなパイプラインを 1 か月あたり 1 つ無料で利用できます。

https://aws.amazon.com/jp/codepipeline/pricing/

アクティブなパイプラインというのは、作成後30日経過かつその月の1回以上起動したパイプラインが対象になります。

30 日以上存在していて、その月に少なくとも 1 つのコード変更が発生したパイプラインです。

https://aws.amazon.com/jp/codepipeline/pricing/

通常料金

アクティブなパイプライン1つにつき1.00USDです。

毎月アクティブなパイプライン*1つにつき1.00USD が課金されます。

https://aws.amazon.com/jp/codepipeline/pricing/

1つまでなら無料で稼働させることができますね。

2つ目のアクティブなパイプラインから1.00USD/月というような料金になります。

こうみるとかなりお手頃に見えますね。

追加料金

パイプラインの自体は別のサービスを動かすためのガワでしかありません。

追加料金というと少し身構えてしまいますが、よく考えれば当たり前のことが書いてあります。

例えば、パイプラインの出力結果をS3に保存したら、S3び料金体系で課金が発生します。

1.00USD/月というのはあくまでCodePipelineの料金であるということを覚えておきましょう。

CodePipelineの追加課金イメージ

よく一緒に使われるCodeシリーズの料金も合わせて見ていきましょう。

CodeBuild の料金

同じく重要な箇所をかいつまんで説明します。

詳しい料金表は公式のドキュメントをご確認ください。

無料枠

指定のインスタンスであれば、毎月100分間のビルド時間が無料です。

general1.small または arm1.small のインスタンスタイプで 1 か月あたり 100 分の総ビルド時間が含まれています。

https://aws.amazon.com/jp/codebuild/pricing/

この時点でお気づきかと思いますが、1つまでなら無料だからといってバンバン動かしているパイプラインにCodeBuildが含まれていた場合、100分の無料枠を使い切った時点から課金されていきます。

通常料金

CodeBuildはビルドに使用するインスタンスタイプによって1分単位で課金されていきます。

詳しい料金表は公式のドキュメントをご確認ください。

追加料金

CodeBuildにも追加料金の記載がありますね。

Cloudwatchにログを配信したり、ビルド結果をS3に保存したりするとそちらのサービスで料金がかかってきます。

CodeDeploy の料金

同じく、詳しい情報は公式のドキュメントをご確認ください。

無料枠

AWS CodeDeploy を使用した Amazon EC2、AWS Lambda や Amazon ECS へのコードデプロイに追加料金は必要ありません。

https://aws.amazon.com/jp/codedeploy/pricing/

EC2、Lambda、ECSへのデプロイは無料です!

通常料金

特殊なデプロイタイプにのみ料金がかかってきます。

AWS CodeDeploy オンプレミス:  AWS CodeDeploy を使用したアップデートの料金は、1 つのオンプレミスインスタンスあたり 0.02USD です

https://aws.amazon.com/jp/codedeploy/pricing/

EC2以外の物理機器に対してデプロイを行う場合に課金されます。

追加料金

こちらも同じですが、デプロイ先のサービスではそのサービスの利用分が課金されていきます。

さいごに

codepipeline-さいごに

Codepipelineを使いこなせると、デプロイ作業にさく工数を大きく削減できるかもしれません。

この記事をきっかけに既存のデプロイフローを見直してCICDに挑戦してみるもの良いかと思います!(PoCだけでも!)

1人で進めるのが難しい?

私は、AWSに関するスキルをRaiseTechのAWSフルコースからスタートさせました。

入会&受講後の感想はコチラ

コース受講後も、半永久的に質問し放題なので転職後の今も技術的な悩みを相談しています。

RaiseTechは毎週金曜日20時から無料説明会を開催しています。

IT業界や転職について「本当に無料?」というくらいボリュームのある内容でしたのでぜひみてみてください!

AWS

Posted by kotaro