[アップデート] AWS CodePipeline がデプロイプロバイダーに「AWS Lambda」をサポートし CodeDeploy や CloudFormation を使わなくても直接 Lambda 関数がデプロイができるようになりました
いわさです。
AWS CodePipeline を使って Lambda 関数をデプロイする時、従来は CloudFormation デプロイアクションや CodeDeploy アクションを使ってリソースのデプロイやトラフィックの段階的な移行戦略を構成することが出来ましたが、先日のアップデートで CodePipeline アクションから直接 Lambda 関数をデプロイし、デプロイ戦略やアラームによるロールバックが構成できるようになりました。
また CodeDeploy を構成しなくて良くなりそうなアップデートですね。早速試してみましょう。
なお、本機能は V2 パイプラインでのみ利用が可能となっています。
設定する
今回は CodeCommit に適当なリポジトリを用意し、事前に Lambda 関数をデプロイしてある状態です。
新しいパイプラインを作成します。ソースリポジトリに CodeCommit を選択し、デプロイステージで今回追加された「AWS Lambda」を選択します。
先日確認した際にはこのアクションは存在していなかったので、今回追加された項目だと思います。[1]
このアクションですが、公式リファレンスはこちらです。
関数を指定するだけなのですが、オプションでエイリアスを指定も可能です。
まずはシンプルに対象の Lambda 関数だけを指定しました。
パイプライン作成後にコードを変更してみます。すると次のようにデプロイアクションが実行されました。
$LATEST
のコードが更新したコードに変更されています。
さらに、新しいバージョンが作成されていることも確認しました。
このデプロイアクションの挙動ですが、$LATEST
を更新しつつ新しいバージョンをデプロイごとに作成する動きとなります。
トラフィックシフト機能を試してみる
トラフィックシフトは CodeDeploy 時にも使うことが出来た機能で、Lambda 関数に新しいバージョンをデプロイした際に、エイリアスで設定するバージョン比率を徐々に新しいバージョンへ増やすことでカナリアリリース的なことができるようになります。
前提として Lambda 関数に既存のエリアスが必要になるので、こちらを先に作成しておきます。
その後パイプラインアクションを修正しエイリアスを選択します。
エイリアスを選択するとデプロイ戦略を選択することが出来ます。通常どおり一気にデプロイするほか、カナリアデプロイ/リニアデプロイがサポートされています。
今回はカナリアデプロイを 50% - 5分 で設定しました。
対象の Lambda エイリアス全体実行のうち半分は新しいバージョン、もう半分は旧バージョンで実行されます。5 分経過すると全て新しいバージョンで実行されるようになります。なお、この待機時間は最大 2 日まで指定ができるようです。
デプロイしてみると、エイリアスに複数バージョンが設定され、指定した割合が設定されていました。
上記の時点ではまだパイプラインアクションは完了しておらず実行中の状態です。
設定した待機時間 5 分を経過するとパイプラインが完了しました。
エイリアスを再度確認してみると、新しいバージョンのみに切り替わっていますね。
アラームを使ったロールバック
この待機時間の間にエラーが発生した場合は旧バージョンへロールバックさせることが出来ます。
CloudWatch アラームを使う仕組みになっており、今回は Lambda エイリアスにおける Errors のカウントでチェックする CloudWatch アラームを作成し、パイプラインアクションで指定します。
なお、アラームに対する読み取り権限が必要らしく、次のようなエラーが発生する場合があります。この場合はパイプラインのサービスロールにアラームの参照権限を追加する必要があります。
次のようにコードを変更してデプロイしてみます。
デプロイしてみると先程と同じように複数バージョンを指すようにエイリアスが変更されました。
このトラフィック移行期間中に Lambda 関数(対象エイリアス)を実行してみます。だいたい 50 % くらいの確率で Lambda 関数が失敗するはずです。
CloudWatch アラームのステータスがアラーム状態に遷移しました。
そうするとパイプラインのアクション上でロールバックされていることが確認できると思います。
Lambda 関数のエイリアス対象バージョンを確認してみると、デプロイ開始前の旧バージョンの戻っていることが確認出来ました。
さいごに
本日は AWS CodePipeline がデプロイプロバイダーに「AWS Lambda」をサポートし CodeDeploy を使わなくても直接トラフィックシフト付きの Lambda 関数デプロイができるようになったので使ってみました。
かなり簡単に Lambda 関数のデプロイとトラフィックシフトが設定できました。
先日の EC2 アクションもそうですが、今後 CodeDeploy を使わなくても良いケースがどんどん増えてきそうですね。[2]