AWS CodePipelineのパイプラインレベルの変数をLambdaに渡す
はじめに
AWS CodePipelineのパイプラインタイプV2から、パイプラインレベルの変数を使えるようになりました。パイプラインレベルの変数は、パイプライン内のすべてのステージで利用できるため、パイプライン全体で共通の情報を扱う際に便利な機能です。
以下の記事も合わせてご参照ください。
この記事では、パイプラインレベルの変数をLambda関数に渡す方法について説明します。
Lambda関数にパイプラインレベルの変数を渡す
今回はパイプラインに以下のような変数を設定してみました。
変数を設定しただけではLambda関数には渡されません。 ユーザーパラメーター
として明示的に指定する必要があります。
Lambdaに渡す文字列ですが、パイプラインレベルの変数は variables
というような名前空間でアクセスできます。渡す変数が1つだけであれば、直接 #{variables.url}
といったように指定すれば良いのですが、複数ある場合は以下のようにJSON形式にしてあげると受け取った側で処理しやすくなります。
{
"url": "#{variables.url}",
"my_path": "#{variables.path}"
}
キーはもちろんですが、変数を指定しているバリューもそれぞれダブルクォートで囲むことを忘れないようにしてください。
この文字列を、Lambdaアクションの ユーザーパラメーター
に設定します。
これでパイプラインを実行すると、Lambda関数へパイプラインレベルの変数が渡されます。
変数を受け取るLambda関数のコード
変数を渡す側の準備ができたので、次は受け取る側のLambda関数のコードを書いていきます。
ユーザーパラメータは、eventオブジェクトの CodePipeline.job
に格納されています。以下のようにして取得できます。
user_params = json.loads(event["CodePipeline.job"]["data"]["actionConfiguration"]["configuration"]["UserParameters"])
print("url: " + user_params["url"])
print("path: " + user_params["my_path"])
CodePipeline.job
には、インプットアーティファクトなどの情報も格納されていますが、今回は説明を省きます。詳しくは公式ドキュメントもご参照ください。
関数の実行ログを見てみますと、以下のように変数が取得できていることが確認できます。
おわりに
CodePipelineからLambdaを呼び出す場合、パイプラインレベルの変数を用いればLambda関数をより汎用的に使うことができるようになります。
ただし、パイプラインレベルの変数は暗号化されていないため、機密情報を扱う際は十分注意が必要です。代わりに、CodeBuildやLambda関数内の環境変数を使うことで、より安全に機密情報を扱うことができます。