Amazon Web Services ブログ

Tekton と Argo CD を使用した AWS でのクラウドネイティブな CI/CD

この記事は Cloud Native CI/CD with Tekton and ArgoCD on AWS (記事公開日: 2022 年 1 月 25 日) を翻訳したものです。

イントロダクション

Kubernetes などのコンテナオーケストレーターの普及と採用が進み、その上にますます多くのクラウドネイティブアプリケーションが構築されています。ビジネスアプリケーションに加えて、企業は CI/CD システムなどのインフラストラクチャー関連のコンポーネントも移行しています。

しかし、それらのシステムはそのような最新のプラットフォームに対応できるでしょうか?答えはシステム次第です。明らかに、既存の CI/CD システムのほとんどは、Kubernetes やクラウドネイティブの世界を直接想定して作られたものではありません。

このブログ記事では、Amazon Elastic Kubernetes Service (Amazon EKS) 上で Kubernetes ネイティブな CI/CD システムである Tekton を使用する方法と、開発者向けのさまざまな AWS サービスとの連携について紹介します。

まず、Tekton についての簡単な紹介と、いくつかの重要なコンセプトについて説明します。続いて、Tekton ネイティブな CI/CD パイプラインを使用して Spring Boot ベースの Web アプリケーションをビルドしてデプロイするためのプロセスを説明する実践的な例を紹介します。提供されるサンプルコードを使用して、独自の要件に合わせてより高度なパイプラインを構築できます。

Tekton の概要

Tekton は、Kubernetes 上でクラウドネイティブな CI/CD システムを構築するためのオープンソースプロジェクトです。クラウドネイティブなアプリケーションとは何かについては、Cloud Native Computing Foundation が定義しています

他の CI/CD ソリューションと比較すると、Tekton は Kubernetes 上でネイティブに動作します。Tekton は一般的な CI/CD のビルディングブロックを Kubernetes ネイティブなリソースとして登録するために、カスタムリソース定義 (CRD) を利用します。Kubernetes 1.16 以降、Kubernetes API を拡張するカスタムリソースを導入することが可能になりました。Pod や Deployment といった既存のリソースと同様に、CRD によって独自のオブジェクトを登録できます。これらの新しいリソースを登録することに加えて、これらを処理するために独自のビジネスロジックを開発する必要があります。これらビジネスロジックを持ったアプリケーションは、カスタムコントローラーとして Kubernetes にデプロイされます。

一言で言えば、Tekton はクラウドネイティブな特性を考慮して開発されたカスタムコントローラーのセットと、いくつかのカスタムリソースに過ぎません。これらのカスタムリソースを組み合わせて、CI/CD パイプラインのビルディングブロックを定義します。

Tekton は、複数のコンポーネントで構成されるモジュラーシステムとして設計されています。これにより、特定のユースケースに必要なコンポーネントのみを選択することができます。基本となるのは Tekton Pipelines と呼ばれるコンポーネントで、パイプラインを構築するための主要なカスタムリソースとコントローラーが含まれています。このコンポーネントの最も重要なカスタムリソースについては、次のセクションで説明します。

さらに、バージョン管理システムに加えられたコード変更に基づいて、Tekton がパイプラインをトリガーできる方法が必要です。この機能は、Tekton Triggers という名前の別のコンポーネントでカバーされています。このプロジェクトの CRD を使用すると、コードベースに対して行われたプルリクエストやコミットなどの Git イベントを受信するイベントリスナーを設定することができます。Webhook によって提供されたペイロードの必要なフィールドを抽出した後、パイプラインの実行を自動的にインスタンス化できます。

最後に、Tekton Dashboard プロジェクトでは、すべての Tekton リソースを視覚化し、現在および最近のパイプラインの実行を追跡するための Web UI を提供します。

これらのプロジェクトを Kubernetes クラスターにデプロイすると、複数のカスタムリソースがインストールされます。このブログ記事では、利用可能なリソースの一部のみを紹介しています。以下のセクションでは、Tekton Pipelines プロジェクトに含まれる最も基本的なもののみを取り上げます。

  • Task
    このカスタムリソースは、順番に実行される 1 つ以上の CI/CD ステップを定義します。Kubernetes の用語で言えば、Task は Pod として実行され、ステップはこの Pod の一部であるコンテナとなります。Task カスタムリソースでは、コンテナイメージの指定に加えて、ボリュームマウントや環境変数の形式でコンテキストを指定することができます。さらに、Task には、再利用やカスタマイズを可能にするためのパラメーターを含めることができます。Task の例としては、リポジトリからソースコードを取得するためのクローン Task や、アプリケーションの単体テストを実行するためのテスト Task などが考えられます。
  • TaskRun
    事前に定義された Task を実行するためには、TaskRun という名前の別のカスタムリソースが必要となります。このリソースには、実行されるべきタスクへの参照と入力パラメーターが含まれています。
  • Pipeline
    Pipeline は、1 つ以上の Task への参照を含み、CI/CD パイプラインのさまざまなステージを表します。また、それぞれの Task に必要な入力パラメーターを定義できます。Pipeline 内の Task は、並列に実行することも、順番に実行することもできます。
  • PipelineRun
    この最後の部品は、すでに定義されている Pipeline リソースをインスタンス化し、そのための入力パラメーターを定義します。PipelineRun オブジェクトは、手動で適用することも、前述の Tekton Triggers プロジェクトが提供する TriggerTemplate のような自動化のための拡張機能でトリガーすることもできます。
  • Workspace
    Workspace は、Pipeline の一部として実行される Task が、JAR ファイルなどのビルドアーティファクトを交換するための永続的な保存場所を定義します。Workspace は、Kubernetes の PersistentVolume (PV) または ConfigMap (CM) として定義することができます。

Pipeline のアーキテクチャ

次のセクションでは、Tekton を使用して Spring Boot ベースの Web アプリケーションをビルドおよびデプロイする例を紹介します。アーキテクチャ図と各 Pipeline と Task の説明を以下に示します。

Pipeline は tekton-demo-spring-boot という名前で、以下のステージを含んでいます。

  1. Git Clone Task
    これが最初の Task です。AWS CodeCommit リポジトリからソースコードをクローンするためのステップが含まれています。加えて、後の Task でコンテナイメージタグやビルドアーティファクトの識別子として使用されるコミットハッシュを計算します。さらに、後続の TaskWorkspace を介してソースコードを利用できるようにする責任もあります。Workspace は、Tekton が Task 間でアーティファクトを共有するためのもう 1 つのカスタムリソースです。Task は EKS クラスター内の任意のノードで実行できるため、このアクションが必要です。Workspace は、Pipeline または Task にリンクされ、Kubernetes のストレージバックエンドとして機能する PV や CM を利用します。このような Task の例は、関連する GitHub リポジトリにあります。
  2. Maven Build Task
    Apache Maven は、Java プロジェクトで広く使われているビルドツールです。依存関係やプラグインを管理し、Java ソースコードを Java アーカイブ (JAR) などのデプロイ可能なビルドアーティファクトに変換します。現在、ほとんどのソフトウェアプロジェクトには、さまざまなサードパーティーの依存関係があります。Maven で構築されたプロジェクトでは、アップストリームの Maven Central リポジトリが、そのような依存関係を取得するための中心的な場所となります。しかし、最近ではほとんどの企業が、企業が管理するリポジトリに内部および外部の依存関係を保存したいと考えています。多くのソリューションが存在しますが、そのようなリポジトリの管理とメンテナンスは困難で時間がかかる場合があります。ここでは、フルマネージドなアーティファクトリポジトリである AWS CodeArtifact を使用しています。これによって、Maven を含むさまざまな種類のソフトウェアアーティファクトの保存と管理が可能になります。Pipeline の Task には 2 つのステップがあります。最初のステップでは、AWS CodeArtifact リポジトリに対して認証を行い、必要な認証トークンを取得して、次のステップで利用できるようにします。2 つ目のステップでは、mvn package コマンドを実行して、Java アーカイブファイルを作成します。Workspace にある、事前にクローンされたソースコードファイルを利用します。Maven は、アップストリームの Maven Central へのプロキシとして構成されている AWS CodeArtifact から、必要な依存関係を直接取得します。JAR アーティファクトのビルドに成功すると、それをプライベートな AWS CodeArtifact リポジトリにアップロードし、後続の Task のためにアーティファクトを Workspace に保存します。
  3. Docker Build Task
    このアプリケーションのデプロイのターゲットは EKS です。したがって、Pipeline は、JAR アーティファクトを含むコンテナイメージをビルドする必要があります。したがって、この Task は、コンテナイメージをビルドし、それを AWS が提供するフルマネージドなコンテナレジストリである Amazon Elastic Container Registry (Amazon ECR) にプッシュする役割を果たします。Docker in Docker ビルドを実行するために、この Task は Kaniko というオープンソースツールを使用します。
  4. Deploy Task
    最後に、Pipeline はアプリケーションの新しいリビジョンをクラスターにデプロイする必要があります。Tekton は EKS に直接デプロイすることもできますが、ここでの方法は少し異なります。Pipeline では、Argo CD という別のオープンソースプロジェクトを使用しています。簡単に言うと、Argo CD は 1 つまたは複数の Git リポジトリに接続し、それらへの変更を監視します。変更が検出されると、Argo CD はリポジトリをプルし、その内容をクラスターに適用します。これにより、GitOps のようなワークフローが可能になります。Argo CD の詳細を知りたい場合は、公式サイトから始めるのがよいでしょう。このソリューションでは、専用の AWS CodeCommit リポジトリがあり、そこには Helm チャートが含まれています。この Helm チャートは、汎用的な Web アプリケーションをデプロイするために必要な Kubernetes マニフェストをすべて含むマスター Helm チャートに依存しています。この依存関係により、インターフェイスを定義し、変更が許可されているパラメーターのサブセットのみを公開することができます。さらに、この AWS CodeCommit リポジトリは、クラスター内の Argo CD インスタンスに接続されています。Helm チャートが変更されるたびに、Argo CD はアプリケーションの新しいデプロイをトリガーします。これを実現するために、Deploy Task は、tekton-demo-deploy リポジトリの現在の状態をクローンし、Helm チャート内のイメージタグを更新し、コミットして、変更をリポジトリにプッシュします。その後、Argo CD はその変更を認識し、ECR から直接プルされる新しいイメージバージョンを使用して新しいアプリケーションバージョンをデプロイします。

Pipeline デモ

このチュートリアルでは、アプリケーションのビルドと EKS へのデプロイをカバーする Pipeline の実行について説明します。

前提条件

このデモでは、EKS クラスターとさまざまな AWS サービスをセットアップする必要があります。このデモのために、専用の AWS アカウントを作成することをお勧めします。

デモの手順を進める前に、以下のリポジトリの README.md に記載されているすべての前提条件を満たしていることを確認してください。

https://github.com/aws-samples/aws-pipeline-demo-with-tekton

必要なすべてのツールがインストールされ、専用の EKS クラスターが用意されていることを確認してください。eksctl コマンドラインツールを使って新しい EKS クラスターを作成することをお勧めします。クラスターのプロビジョニングに使うことができる、クラスター設定のサンプル (eks-cluster-template.yaml) をディレクトリー内に用意しています。

クラスターの作成と必要なツールのインストールが完了したら、リポジトリ内にあるインストールスクリプト (install.sh) を実行してください。(訳注: 環境によって install.sh が上手く動かないことがあるため、install.sh の内容をステップ実行することをお勧めします。また、eu-central-1 リージョンがハードコードされている箇所があるため、他のリージョンを使用する場合はリポジトリ内を検索して書き換えてください。)

提供されたスクリプトでインストールに成功すると、デモを通じて参照されるさまざまな出力パラメーターを含む出力が表示されます。

リポジトリの構造

コードリポジトリには、デモ環境をセットアップするために必要なさまざまなファイルが含まれています。以下に、各フォルダの概要を示します。

  • cloudformation
    このフォルダには、CI/CD パイプラインに必要な AWS サービスをデプロイするための CloudFormation テンプレートが含まれています。これらのテンプレートによって作成されるサービスは、AWS CodeCommit、AWS CodeArtifact、Amazon S3、Amazon ECR、そしてセキュリティグループや IAM ロールなどのさまざまな追加のリソースです。
  • docker
    このフォルダには、ビルドアーティファクトを生成するためにパイプラインが依存するコンテナイメージをビルドするための Dockerfile が含まれています。
  • helm-springboot
    このフォルダには、シンプルなアプリケーションをデプロイするための Kubernetes ファイルを含む Helm チャートが含まれています。この Helm チャートは、Argo CD がアプリケーションをクラスターにデプロイする際に使用されます。
  • tekton-demo-app-build
    このフォルダには、Spring Boot アプリケーションのソースコードが含まれています。このフォルダの内容は、プロビジョニングされた tekton-demo-app-build リポジトリにアップロードされます。
  • tekton-demo-app-deploy
    このフォルダには、tekton-demo-app-deploy リポジトリの内容が含まれています。このリポジトリは、Argo CD に接続され、クラスターへのアプリケーションの最初のデプロイと、更新のために使用されます。
  • tekton-pipeline-demo-k8s-artifacts
    このフォルダには、Tekton ベースの CI/CD パイプラインと、Workspace の PersistentVolume (PV) などのサポートリソースが含まれています。
  • tekton-webhook-middleware
    このフォルダーには、Git イベントからデータを抽出するために実行される小さなヘルパーアプリケーションが含まれています。

デモの実行

1. Web ウェブアプリケーションの現在の状態を表示する

インストールスクリプトの出力から、デモアプリケーションを指すロードバランサーの URL (DEMO APP) を探して、任意の Web ブラウザに入力します。ブラウザには、次のような内容のシンプルな Web アプリケーションが表示されるはずです。

アプリケーションへの小さな変更をシミュレートするために、テキストの色を Tekton のロゴの色に合わせて変更します。

2. アプリケーションに簡単な変更を加える

インストールスクリプトの出力から、ソースリポジトリの URL と必要な Git 認証情報を探してください。次のコマンドを使って、そのリポジトリをクローンします。

$ git clone "SOURCE REPO URL" #Please enter the git username and password
$ cd tekton-demo-app-build

リポジトリのクローンに成功したら、src/main/resources/templates にある greeting.html を開き、前の h1 タグをコメントアウトします (13行目) 。そして、インライン CSS グラデーションを使用する h1 タグを追加します。ファイル内のコメントを参考にしてください。

変更内容を保存し、以下のコマンドでコミットします。

$ git commit -am "Change text color to match color of Tekton logo"
$ git push

3. パイプラインの現在の実行状況を確認する

インストールスクリプトの出力から、Tekton Dashboard を指すロードバランサーの URL (TEKTON DASHBOARD) を探し、任意のブラウザに入力します。ダッシュボードの左メニューから PipelineRuns を選択し、実行中のジョブをすべて 表示します。最近のコミットの後に Tekton がビルドを開始したことが確認できるはずです。Tekton は Task を順番に実行します。実行中の Task は青色のインジケーターでハイライトされます。画面の右側には、ビルドログが表示されますので、自由に確認してください。

さらに、EKS クラスター内で進行中のアクティビティを確認することもできます。以下のコマンドを使用して、Tekton が作成した Pod を監視します。

$ kubectl --namespace apps-build get pods --watch

数分後、ビルドが正常に完了し、緑色のステータスインジケーターが表示されるはずです。

4. AWS CodeArtifact で JAR アーティファクトの新バージョンを確認する

AWS マネジメントコンソールで、AWS CodeArtifact サービスを選択します。tekton-demo-repository リポジトリ内の com.amazon:tekton-demo パッケージを選択します。最近の Git コミットハッシュを持つパッケージの新しいバージョンが表示されるはずです。

5. Amazon ECR で新しいコンテナイメージのバージョンを確認する

AWS マネジメントコンソールで、Amazon ECR サービスを選択します。プライベートリポジトリのリストから tekton-demo-app を開きます。最近の Git コミットハッシュを識別子として含む新しいイメージタグが表示されるはずです。

6. アプリケーションの新しいバージョンを確認する

デモアプリケーションを指しているロードバランサーの URL を探し、任意の Web ブラウザに入力します。すると、ステップ 1 と同じアプリケーションが表示されますが、今度はテキストの色が Tekton のロゴと一致してるはずです。

おめでとうございます!Tekton による CI/CD パイプラインの実行が正常に完了しました。このパイプラインの構築に使用されたさまざまな Kubernetes マニフェストを自由に見てください。クローンしたリポジトリの tekton-pipeline-demo-k8s-artifacts/templates フォルダ内で探索を始めることができます。

クリーンアップ

Github リポジトリ内の README ファイルに記載されている手順に従って、プロビジョニングされたリソースをクリーンアップしてください。

まとめ

この記事では、Tekton の概要から始め、シンプルな Web アプリケーションをビルドしてデプロイする実践的な例で締めくくりました。いくつかの AWS サービスと統合された機能的なパイプラインができましたが、ここで取り上げたトピックは氷山の一角に過ぎません。Tekton は、クラウドネイティブな世界で複雑で包括的なパイプラインを構築するための堅実なビルディングブロックを提供します。公式ドキュメントにアクセスして、これらのビルディングブロックの詳細について確認することをお勧めします。また、Tekton エコシステムの新しいプロジェクトや今後のプロジェクトについては、公式 GitHub リポジトリを参照することをお勧めします。

自由にパイプラインを拡張し、ビルドステージを追加してください。あなたが EKS の上に Tekton を使ってどのようなものを構築したのか、見せていただけたら幸いです。

翻訳はプロフェッショナルサービスの杉田が担当しました。原文はこちらです。