[アップデート] AWS CodePipeline がデプロイプロバイダーに「AWS Lambda」をサポートし CodeDeploy や CloudFormation を使わなくても直接 Lambda 関数がデプロイができるようになりました

[アップデート] AWS CodePipeline がデプロイプロバイダーに「AWS Lambda」をサポートし CodeDeploy や CloudFormation を使わなくても直接 Lambda 関数がデプロイができるようになりました

Clock Icon2025.05.18

いわさです。

AWS CodePipeline を使って Lambda 関数をデプロイする時、従来は CloudFormation デプロイアクションや CodeDeploy アクションを使ってリソースのデプロイやトラフィックの段階的な移行戦略を構成することが出来ましたが、先日のアップデートで CodePipeline アクションから直接 Lambda 関数をデプロイし、デプロイ戦略やアラームによるロールバックが構成できるようになりました。

https://aws.amazon.com/about-aws/whats-new/2025/05/aws-codepipeline-deploying-lambda-traffic-shifting/

また CodeDeploy を構成しなくて良くなりそうなアップデートですね。早速試してみましょう。
なお、本機能は V2 パイプラインでのみ利用が可能となっています。

設定する

今回は CodeCommit に適当なリポジトリを用意し、事前に Lambda 関数をデプロイしてある状態です。

E26668CB-0458-4972-8CFD-1D6E489BB53D.png

新しいパイプラインを作成します。ソースリポジトリに CodeCommit を選択し、デプロイステージで今回追加された「AWS Lambda」を選択します。
先日確認した際にはこのアクションは存在していなかったので、今回追加された項目だと思います。[1]

B1C15D8B-C68D-4957-977B-2633D7459C49.png

このアクションですが、公式リファレンスはこちらです。
関数を指定するだけなのですが、オプションでエイリアスを指定も可能です。

https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-LambdaDeploy.html

まずはシンプルに対象の Lambda 関数だけを指定しました。

A9A3B3E4-7579-46FE-AB2C-95104795DF5C.png

パイプライン作成後にコードを変更してみます。すると次のようにデプロイアクションが実行されました。

E208AF43-EEC8-4D67-A219-7C86A98CB17A.png

$LATESTのコードが更新したコードに変更されています。

4A53F526-DFEB-4744-A655-378688D6B96F.png

さらに、新しいバージョンが作成されていることも確認しました。
このデプロイアクションの挙動ですが、$LATESTを更新しつつ新しいバージョンをデプロイごとに作成する動きとなります。

C4BC9FCA-0796-4F1C-971F-C936388A3760.png

トラフィックシフト機能を試してみる

トラフィックシフトは CodeDeploy 時にも使うことが出来た機能で、Lambda 関数に新しいバージョンをデプロイした際に、エイリアスで設定するバージョン比率を徐々に新しいバージョンへ増やすことでカナリアリリース的なことができるようになります。

前提として Lambda 関数に既存のエリアスが必要になるので、こちらを先に作成しておきます。

F3395688-F6C3-4CAD-95A9-50FF26D8E512_4_5005_c.jpeg

その後パイプラインアクションを修正しエイリアスを選択します。
エイリアスを選択するとデプロイ戦略を選択することが出来ます。通常どおり一気にデプロイするほか、カナリアデプロイ/リニアデプロイがサポートされています。

3552949D-255C-4F1E-9CDB-7E7DE320F846.png

今回はカナリアデプロイを 50% - 5分 で設定しました。
対象の Lambda エイリアス全体実行のうち半分は新しいバージョン、もう半分は旧バージョンで実行されます。5 分経過すると全て新しいバージョンで実行されるようになります。なお、この待機時間は最大 2 日まで指定ができるようです。

デプロイしてみると、エイリアスに複数バージョンが設定され、指定した割合が設定されていました。

EC3B16C3-81BB-494E-9D68-CA1A7687B092.png

上記の時点ではまだパイプラインアクションは完了しておらず実行中の状態です。

9FE1D27F-8E20-4C4E-91D7-5487EAB2BCB3.png

設定した待機時間 5 分を経過するとパイプラインが完了しました。

AC2E30C4-6519-45D2-9384-BCE50EECD8B7.png

エイリアスを再度確認してみると、新しいバージョンのみに切り替わっていますね。

AAAB7CC2-7829-4A3C-8680-7A903DED0B61_4_5005_c.jpeg

アラームを使ったロールバック

この待機時間の間にエラーが発生した場合は旧バージョンへロールバックさせることが出来ます。
CloudWatch アラームを使う仕組みになっており、今回は Lambda エイリアスにおける Errors のカウントでチェックする CloudWatch アラームを作成し、パイプラインアクションで指定します。

5E638D08-AF32-4C23-B0AF-26C851DB5907.png

FA776286-029F-44F6-9543-A554584E5049.png

なお、アラームに対する読み取り権限が必要らしく、次のようなエラーが発生する場合があります。この場合はパイプラインのサービスロールにアラームの参照権限を追加する必要があります。

48CA83AB-9ECD-4A6B-BD68-337BCC09F0BB.png

95C44B9D-FD34-4132-9C5A-BF0E1FDEE741.png

次のようにコードを変更してデプロイしてみます。

E021ADCE-196E-45D7-A9C8-FA8F6570777D_4_5005_c.jpeg

デプロイしてみると先程と同じように複数バージョンを指すようにエイリアスが変更されました。

4B66DB4C-89E9-4EC0-ABF3-1B039FE9270B_4_5005_c.jpeg

このトラフィック移行期間中に Lambda 関数(対象エイリアス)を実行してみます。だいたい 50 % くらいの確率で Lambda 関数が失敗するはずです。

55C7C069-9394-4432-A082-556BE0CA4146.png

CloudWatch アラームのステータスがアラーム状態に遷移しました。

31A90810-3142-4A97-B79F-25E3AE3C3944_4_5005_c.jpeg

そうするとパイプラインのアクション上でロールバックされていることが確認できると思います。

3871EC53-8BA5-4AEE-9FC2-C314678CFCA9_4_5005_c.jpeg

Lambda 関数のエイリアス対象バージョンを確認してみると、デプロイ開始前の旧バージョンの戻っていることが確認出来ました。

BDC5DBF4-75D5-4F2D-9813-A61D0998E26B.png

さいごに

本日は AWS CodePipeline がデプロイプロバイダーに「AWS Lambda」をサポートし CodeDeploy を使わなくても直接トラフィックシフト付きの Lambda 関数デプロイができるようになったので使ってみました。

かなり簡単に Lambda 関数のデプロイとトラフィックシフトが設定できました。
先日の EC2 アクションもそうですが、今後 CodeDeploy を使わなくても良いケースがどんどん増えてきそうですね。[2]

脚注
  1. [アップデート] AWS CodePipeline から別の CodePipeline を呼び出すアクションが追加されました | DevelopersIO ↩︎

  2. [アップデート] AWS CodePipeline がデプロイプロバイダーに「EC2」をサポートし CodeDeploy を使わなくても直接デプロイできるようになりました | DevelopersIO ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.