AWS CodePipeline と AWS CDK を使用して CI/CD パイプラインを設定する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS CodePipeline と AWS CDK を使用して CI/CD パイプラインを設定する

作成者: Konstantin Zarudaev (AWS)、Cizer Pereira (AWS)、Lars Kinder (AWS)、Yasha Dabas (AWS)

コードリポジトリ: CI/CD CodePipeline を使用した AWS

環境:PoC またはパイロット

テクノロジー: DevOps

ワークロード: オープンソース

AWS サービス: AWS CodePipeline

ホーム

継続的インテグレーションおよび継続的デリバリー (CI/CD) によるソフトウェアのビルドとリリースのプロセスを自動化することで、繰り返しビルドが可能になり、ユーザーへの新機能の迅速な提供が可能になります。各コード変更をすばやく簡単にテストでき、ソフトウェアをリリースする前にバグを見つけて修正できます。各変更をステージングとリリースのプロセスで実行することで、アプリケーションやインフラストラクチャコードの品質を検証できます。CI/CD は、アプリケーション開発チームがコード変更をより頻繁かつ確実に行うのに役立つ文化、一連の運用原則、一連のプラクティスを体現しています。この実装は CI/CD パイプラインとも呼ばれます。

このパターンは、Amazon Web Services (AWS) での再利用可能な継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインを定義します。AWS CodePipeline パイプラインは、AWS Cloud Development Kit (AWS CDK) v2 を使用して記述されます。

を使用すると CodePipeline、AWS マネジメントコンソールインターフェイス、AWS コマンドラインインターフェイス (AWS CLI)、AWS 、または AWS SDKs を使用して CloudFormation、ソフトウェアリリースプロセスのさまざまな段階をモデル化できます。このパターンは、AWS CDK を使用した CodePipeline とそのコンポーネントの実装を示しています。ライブラリを構築することに加えて、AWS CDK には AWS CDK アプリケーションを操作するための主要なツールであるツールキット (CLI コマンド cdk) が含まれています。ツールキットには、他の関数の中でも特に、1 つ以上のスタックを CloudFormation テンプレートに変換し、AWS アカウントにデプロイする機能があります。

パイプラインにはサードパーティライブラリのセキュリティを検証するテストが含まれており、指定された環境で迅速かつ自動的なリリースを保証するのに役立ちます。アプリケーションを検証プロセスにかけることで、アプリケーション全体のセキュリティを強化できます。

このパターンの目的は、CI/CD パイプラインを使用してコードをデプロイするのを高速化し、デプロイするリソースが DevOps ベストプラクティスに準拠していることを確認することです。サンプルコード を実装すると、リンティング、テスト、セキュリティチェック、デプロイ、デプロイ後のプロセスを含む AWS CodePipeline が作成されます。このパターンには Makefile のステップも含まれています。Makefile を使用すると、デベロッパーは CI/CD のステップをローカルで再現し、開発プロセスのスピードを上げることができます。

前提条件と制限

前提条件

  • アクティブな AWS アカウント

  • 基本的な理解は以下のとおりです。

    • AWS CDK

    • AWS CloudFormation

    • AWS CodePipeline

    • TypeScript

制約事項

このパターンでは、 TypeScript にのみ AWS CDK を使用します。AWS CDK でサポートされている他の言語は対象外です。

製品バージョン

次のツールの最新バージョンを使用します。

  • AWS コマンドラインインターフェイス (AWS CLI)

  • cfn_nag

  • git-remote-codecommit

  • Node.js

アーキテクチャ

ターゲットテクノロジースタック

  • AWS CDK

  • AWS CloudFormation

  • AWS CodeCommit

  • AWS CodePipeline

ターゲット アーキテクチャ

パイプラインは、AWS CodeCommit リポジトリ () の変更によってトリガーされますSampleRepository。最初に、 はアーティファクトを CodePipeline ビルドし、それ自体を更新して、デプロイプロセスを開始します。作成されたパイプラインは、次の 3 つの独立した環境に解決策をデプロイします。

  • 開発 – アクティブな開発環境での 3 段階のコードチェック

  • テスト – 統合/リグレッションテスト環境

  • 本番 – 本番環境

開発段階には、リンティング、セキュリティ、ユニットテストの 3 つのステップが含まれます。これらの手順はプロセスを高速化するために並行して実行されます。パイプラインが動作するアーティファクトのみを提供するようにするため、プロセス内のステップが失敗するたびにパイプラインの実行が停止されます。開発段階のデプロイ後、パイプラインは検証テストを実行して結果を検証します。成功すると、パイプラインはデプロイ後の検証を含むテスト環境にアーティファクトをデプロイします。最後のステップは、アーティファクトを Prod 環境にデプロイすることです。

次の図は、 CodeCommit リポジトリから、 によって実行されるビルドおよび更新プロセスへのワークフロー CodePipeline、3 つの開発環境ステップ、および 3 つの環境のそれぞれでのその後のデプロイと検証を示しています。

開発環境には、リンティング、セキュリティ、ユニットテストが含まれ、すべてデプロイと検証が含まれます。

ツール

AWS サービス

  • AWS Cloud Development Kit (AWS CDK) は、AWS クラウドインフラストラクチャをコードで定義してプロビジョニングするのに役立つソフトウェア開発フレームワークです。

  • AWS CloudFormation は、AWS リソースをセットアップし、迅速かつ一貫したプロビジョニングを行い、AWS アカウントとリージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。このパターン CloudFormation テンプレートを使用すると、 CodeCommit リポジトリと CodePipeline CI/CD パイプラインを作成できます。

  • AWS CodeCommit は、独自のソース管理システムを管理することなく、Git リポジトリをプライベートに保存および管理できるバージョン管理サービスです。

  • AWS CodePipeline は、ソフトウェアリリースのさまざまな段階を迅速にモデル化して設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化する CI/CD サービスです。

  • AWS コマンドラインインターフェイス (AWS CLI)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

その他のツール

  • cfn_nag は、潜在的なセキュリティ問題を特定するために CloudFormation テンプレート内のパターンを検索するオープンソースツールです。

  • git-remote-codecommit は、Git を拡張して CodeCommit リポジトリからコードをプッシュおよびプルするためのユーティリティです。

  • Node.js は、スケーラブルなネットワークアプリケーションを構築するために設計されたイベント駆動型の JavaScript ランタイム環境です。

コード

このパターンのコードは、 GitHub CI/CD プラクティスリポジトリ CodePipeline を持つ AWS で使用できます。

ベストプラクティス

AWS Identity and Access Management (IAM) ポリシーなどのリソースを確認して、組織のベストプラクティスに沿っていることを確認します。

エピック

タスク説明必要なスキル

macOS または Linux にツールをインストールします。

macOS または Linux を使用している場合は、任意のターミナルで次のコマンドを実行するか、Homebrew for Linux を使用してツールをインストールできます。

brew install brew install git-remote-codecommit brew install ruby brew-gem brew-gem install cfn-nag
DevOps エンジニア

AWS Cloud9 を使用してツールをインストールします。

AWS Cloud9 を使用している場合は、次のコマンドを実行してツールをインストールします。

gem install cfn-nag

注: AWS Cloud9 には Node.js と npm がインストールされている必要があります。インストールまたはバージョンを確認するには、次のコマンドを実行します。

node -v npm -v
DevOps エンジニア

AWS CLI をセットアップします。

AWS CLI を設定するには、お使いのオペレーティングシステムの手順に従ってください。

DevOps エンジニア
タスク説明必要なスキル

コードをダウンロードまたはクローンします。

このパターンで使用されるコードを取得するには、以下のいずれかを実行します。

  • GitHub リポジトリのリリースから最新のソースコードをダウンロードし、ダウンロードしたファイルをフォルダに解凍します。

  • 次のコマンドを実行して、プロジェクトのクローンを作成します。

git clone --depth 1 https://github.com/aws-samples/aws-codepipeline-cicd.git

クローニングしたリポジトリから .git ディレクトリを削除します。

cd ./aws-codepipeline-cicd rm -rf ./.git

後で、新しく作成された AWS CodeCommit リポジトリをリモートオリジンとして使用します。

DevOps エンジニア

AWS アカウントに接続します。

一時的なセキュリティトークンまたはランディングゾーン認証を使用して接続できます。正しいアカウントと AWS リージョンを使用していることを確認するには、以下のコマンドを実行します。

AWS_REGION="eu-west-1" ACCOUNT_NUMBER=$(aws sts get-caller-identity --query Account --output text) echo "${ACCOUNT_NUMBER}"
DevOps エンジニア

環境を起動します。

AWS CDK 環境を起動するには、以下のコマンドを実行します。

npm install npm run cdk bootstrap "aws://${ACCOUNT_NUMBER}/${AWS_REGION}"

環境を正常に起動すると、次の出力が表示されるはずです。

⏳ Bootstrapping environment aws://{account}/{region}... ✅ Environment aws://{account}/{region} bootstrapped

AWS CDK 起動の詳細については、AWS CDK のドキュメントを参照してください。

DevOps エンジニア

テンプレートを合成します。

AWS CDK アプリケーションを合成するには、cdk synth コマンドを使用します。

npm run cdk synth

次のような出力が表示されます。

Successfully synthesized to <path-to-directory>/aws-codepipeline-cicd/cdk.out Supply a stack id (CodePipeline, Dev-MainStack) to display its template.
DevOps エンジニア

CodePipeline スタックをデプロイします。

テンプレートをブートストラップして合成したので CloudFormation 、デプロイできます。デプロイでは、 CodePipeline パイプラインと CodeCommit リポジトリが作成されます。これはパイプラインのソースとトリガーになります。

npm run cdk -- deploy CodePipeline --require-approval never

コマンドを実行すると、 CodePipeline スタックと出力情報が正常にデプロイされたことがわかります。CodePipeline.RepositoryName は、AWS アカウントの CodeCommit リポジトリの名前を提供します。

CodePipeline: deploying... CodePipeline: creating CloudFormation changeset... ✅ CodePipeline Outputs: CodePipeline.RepositoryName = SampleRepository Stack ARN: arn:aws:cloudformation:REGION:ACCOUNT-ID:stack/CodePipeline/STACK-ID
DevOps エンジニア

リモート CodeCommit リポジトリとブランチを設定します。

デプロイが成功 CodePipeline すると、 はパイプラインの最初の実行を開始します。これは AWS CodePipeline コンソール にあります。AWS CDK と はデフォルトのブランチを開始しない CodeCommit ため、この最初のパイプライン実行は失敗し、次のエラーメッセージが返されます。

The action failed because no branch named main was found in the selected AWS CodeCommit repository SampleRepository. Make sure you are using the correct branch name, and then try again. Error: null

このエラーを修正するには、リモートオリジンを SampleRepository として設定し、必要な main ブランチを作成します。

RepoName=$(aws cloudformation describe-stacks --stack-name CodePipeline --query "Stacks[0].Outputs[?OutputKey=='RepositoryName'].OutputValue" --output text) echo "${RepoName}" # git init git branch -m master main git remote add origin codecommit://${RepoName} git add . git commit -m "Initial commit" git push -u origin main
DevOps エンジニア
タスク説明必要なスキル

変更をコミットしてパイプラインを有効にします。

初期デプロイメントが成功すると、SampleRepositorymain ブランチをソースブランチとして持つ完全な CI/CD パイプラインが完成するはずです。main ブランチに変更をコミットするとすぐに、パイプラインは次の一連のアクションを開始して実行します。

  1. CodeCommit リポジトリからコードを取得します。

  2. コードをビルドします。

  3. パイプライン自体を更新します (UpdatePipeline)。

  4. リンティング、セキュリティ、ユニットテストのチェック用に 3 つのジョブをparallel して実行します。

  5. 成功した場合、パイプラインは Main スタックを ./lib/main-stack.ts から開発環境にデプロイします。

  6. デプロイされたリソースのデプロイ後チェックを実行します。 CodePipeline コンソールですべての CodePipeline 手順と結果を実行できます。

  7. 成功すると、パイプラインはテスト環境と Prod 環境のデプロイと検証を繰り返します。

DevOps エンジニア
タスク説明必要なスキル

Makefile を使用して開発プロセスを実行します。

make コマンドを使用してパイプライン全体をローカルで実行することも、個別のステップ (make linting など) を実行することもできます。

make を使用してテストするには、次のアクションを実行します。

  • ローカルパイプラインを実装: make

  • ユニットテストのみを実行: make unittest

  • 現在のアカウントにデプロイ: make deploy

  • 環境をクリーンアップ: make clean

アプリ開発者、 DevOps エンジニア
タスク説明必要なスキル

AWS CDK アプリケーションリソースを削除します。

AWS CDK アプリをクリーンアップするには、次のコマンドを実行します。

cdk destroy --all

起動中に作成された Amazon Simple Storage Service (Amazon S3) バケットは、自動的に削除されないことに注意してください。削除を許可する保持ポリシーが必要か、AWS アカウントで手動で削除する必要があります。

DevOps エンジニア

トラブルシューティング

問題ソリューション

テンプレートが期待どおりに動作しません。

何か問題が発生し、テンプレートが機能しない場合は、次があることを確認してください。

  • 適切なバージョンのツール。

  • ターゲット AWS アカウントへのアクセス (ネットワーク接続)。

  • ターゲット AWS アカウントへの十分なアクセス許可。

関連リソース