CodePipelineでシンプルなパイプラインを構築してみた 【CodeFamily Practices 4/7】
概念
DevOpsのワークフローをモデル化。ソフトウェアのリリースを自動化する、継続的デリバリーのマネージドサービス。

-
仕組み
ステージごとに環境を作成し、アーティファクトに対してビルドやデプロイを実行。ステージのアクションは、サードパーティのツールの呼び出し、手動の承認なども可能。
パイプラインはステージとトランジションの組み合わせにより成り立ち、リリースプロセスを可視化。ステージとトランジションは、追加と削除を自在に設定することが可能。
一つずつステージを実行。処理期間はステージをロック。エラーなどで失敗すると実行を停止し、ロックを解除後に再試行が可能。
パイプラインの実行結果をSNSで通知可能。 -
アクション
ソース、ビルド、テスト、デプロイ、承認、Invokeがあり、それぞれプロバイダーもしくは手動を設定。
ステージを作成する前に、CodeBuildのビルドプロジェクト、CodeDeployのデプロイグループなどのアクションを予め作成。
アクションは一つのステージで並列処理することが可能。 -
ステージ
アクションを実行する環境の単位。トランジションで繋げてパイプラインを形成。
使用方法
S3とCodeDployを使用して2台のEC2へアプリケーションをデプロイするパイプラインを構築。
構築後、ステージの追加と削除を実践。
※公式ドキュメントチュートリアル

アプリケーションバンドルのアップロード
CodePipelineと連携するバケットを作成。
アプリケーションバンドルの内容変えて更新をした場合にバージョンとして認識されるように、バージョニングを有効化して作成。

バケットへアプリケーションバンドルをアップロード。
バンドルはappspec.ymlを含み、Zipファイル形式。

IAMロールの作成
インスタンスプロファイル用のロールを作成。
IAMロール作成画面で、信頼されたエンティティタイプはAWSのサービス、ユースケースはEC2を選択。

AmazonEC2RoleforAWSCodeDeployで検索し、選択。

AmazonSSMManagedInstanceCoreで検索し、選択。

任意のロール名を付与。

EC2の起動
ウィンドウズを使用して作成したアプリケーションのサーバーを起動するため、
マシンイメージは、Windowsを選択。

インスタンスプロファイルに、先ほど作成したロールを選択。
インスタンスは、2機で起動。

CodeDeployの設定
IAMロールの作成
信頼されたエンティティタイプをAWSのサービス、ユースケースをCodeDeployを選択。

AWSCodeDeployRoleで検索し、選択。

任意のロール名を付与。

アプリケーションとデプロイグループの作成。
CodeDeployへ移動し、アプリケーションの作成を選択。

アプリケーション名を入力し、コンピューティングプラットフォームはEC2/オンプレミスを選択。

デプロイグループの作成を選択。

以下を入力。
| サービスロール | デプロイタイプ | 環境設定 | エージェントのインストール | デプロイ設定 | ロードバランサー |
|---|---|---|---|---|---|
| 前述のロール | インプレース | インスタンス名(Name:タグ名) | 今すぐ更新し、 更新をスケジュール |
OneAtTime | なし |

作成内容の確認。

CodePipelineの設定
CodePipelineへ移動し、パイプラインを作成するを選択。

新しいサービスロールを選択。ロール名が自動的に入力される。

ソースステージの追加。 アプリケーションパッケージの場所を指定する。
| ソースプロバイダー | バケット | S3オブジェクトキー | 提出オプションを変更する |
|---|---|---|---|
| Amazon S3 | アプリケーションzipファイルをアップロードしたバケット | zipファイル名 | Amazon CloudWatch Events |
EventBridgeを消してオプションに選択することで、アプリケーションファイルのバージョンをアップロードをトリガーにし、自動的にパイプラインがデプロイを実行。

CodeBuildを使用しないためスキップ。

| デプロイプロバイダー | リージョン | アプリケーション名 | デプロイグループ |
|---|---|---|---|
| CodeDeploy | 東京 | 前述で作成したアプリケーション | 前述で作成したデプロイグループ |

内容の確認。

パイプラインの完成と同時にデプロイを開始。

実行状況を可視化。

すべてのステージが成功すると完了。

実行履歴で、それぞれのステージの実行結果の詳細を確認可能。

CodeDeployのデプロイと画面から、各リソースのデプロイステータスを確認可能。

EC2へアクセスすると、サンプルアプリケーションが呼び出され無事デプロイが完了したことを表示。

別のステージをパイプラインに追加
CodeDeployへ移り、デプロイグループの作成を選択。

デプロイグループ名のみ変更し、残りは前述で作成した内容と同一。

作成内容を確認。

CodePipelineへ移動。

編集ボタンをクリック。

追加するステージのステージ名を入力。

保存を選択。

内容に変更がなければ完了を選択。

新しいステージが追加されるので、保存を選択。

変更をリリースするを選択。

すでにEC2にアプリケーションがデプロイされているため、わざとエラーを表示。

エラーの確認。

ステージ間の移行を無効
CodePipelineへ移動。

パイプラインを表示。
移行を無効にするを選択。

理由を入力し、無効にするを選択。

無効にしても、ステージは表示されたままになる。

まとめ
シンプルなパイプラインの構築と、追加・削除を実践。
サードパーティのツールと組み合わせて使用したり、パイプライン自体をInfrastructure as Codeで構築してみるなど、課題はまだ多い。
構築系のハンズオンと併用して、習得していきたい。
合わせて読みたい👀👉CodeFamily Practicesの記事
CodeCommitとローカル環境の連携 【CodeFamily Practices 1/7】
CodeBuildでビルドプロジェクトを作ってみよう 【CodeFamily Practices 2/7】
CodeDeployでEC2にアプリケーションをデプロイ 【CodeFamily Practices 3/7】
CodePipelineとCloudformationで、API Gatewayをビルド【CodeFamily Practices 5/7】
CodePipelineとServerless Frameworkでビルド【CodeFamily Practices 6/7】
CodePipelineとTerraformで、API Gatewayをビルド【CodeFamily Practices 7/7】
Discussion