AWS
lambda
APIGateway

AWSでAPI GatewayのステージにLambdaのエイリアスを対応させた際にハマったこと&解決方法

AWSでAPI GatewayのステージにLambdaのエイリアスを対応させた際にハマったこと&解決方法

本題まで長いです。

API GatewayのステージにLambdaのエイリアスを対応させる

API Gatewayのステージとは?

APIをデプロイする際に設定できます。

APIデプロイ時のステージ設定

このステージをいい感じに設定することで、開発用と本番用の運用ができます。

例えば、開発用ではDevelopというステージにデプロイし、本番用ではProductというステージにデプロイすることで、開発者とユーザが使用するAPIを切り替えることができます。

Lambdaのエイリアスとは?

Lambdaでは任意の状態のスナップショットをバージョンとして発行することができます。
エイリアスとは、特定のバージョンに対して付与する名前のことです。(ポインタと表現されています。)

Gitみたいなモノですね。(考え方はGitで良いと思います。)

  • Lambdaのバージョン → Gitのコミットに相当
  • Lambdaのエイリアス → Gitのタグに相当

Lambdaのバージョンとエイリアス

以下のように、Lambdaの設定画面からバージョンとエイリアスを作成することができます。

Lambdaのバージョンとエイリアスの作成方法

対応させるとは?

API GatewayのステージLambdaのエイリアスを対応させることです。

つまり、以下のことが実現できます。

  • 開発用のAPI Gateway(ステージ:Develop)から、開発用のLambda(エイリアス:Develop)を実行できる
  • 本番用のAPI Gateway(ステージ:Product)から、本番用のLambda(エイリアス:Product)を実行できる

対応させる方法

以下を参照してください。

本題:ハマったこと

ようやく本題です。

API Gatewayのステージにaliasという変数を定義し、実行するLambda関数を以下のように設定します。

実行するLambda関数の設定

設定すると、以下のような画面が表示され、「このコマンドを実行してね」と表示されます。

実行すべきコマンドが表示される

このコマンドの${stageVariables.alias}の部分は、Lambdaのエイリアスに合わせて変更するため、TestAPIGateway:DevelopTestAPIGateway:Productにして2回実行します。(今回の例の場合です。Lambdaのエイリアスに合わせてください。)

なお、AWS CLIのインストールと設定は以下を参照してください。

ようやくハマったことです。このコマンドが失敗しました。

エラーメッセージ

An error occurred (ValidationException) when calling the AddPermission operation: 1 validation error detected: Value ''arn:aws:execute-api:ap-northeast-1:xxxxxxxx:yyyyyyyyyyy/TestAPIGateway'' at 'sourceArn' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:(aws|aws-us-gov):([a-zA-Z0-9\-])+:([a-z]{2}(-gov)?-[a-z]+-\d{1})?:(\d{12})?:(.*)

原因

--source-arnのあとに「'」が含まれているとNGでした。

解決方法

コマンドから「'」を取り除いて実行します。

NGのコマンド

aws lambda add-permission --function-name arn:aws:lambda:ap-northeast-1:xxxxxxxx:function:TestAPIGateway:Develop --source-arn 'arn:aws:execute-api:ap-northeast-1:xxxxxxxx:yyyyyyyyyyy/TestAPIGateway' --principal apigateway.amazonaws.com --statement-id zzzzzzzzzzzzzz --action lambda:InvokeFunction

OKのコマンド

aws lambda add-permission --function-name arn:aws:lambda:ap-northeast-1:xxxxxxxx:function:TestAPIGateway:Develop --source-arn arn:aws:execute-api:ap-northeast-1:xxxxxxxx:yyyyyyyyyyy/TestAPIGateway --principal apigateway.amazonaws.com --statement-id zzzzzzzzzzzzzz --action lambda:InvokeFunction

最後に

分かってしまえば単純な原因でしたが、解決するまで苦労しました。
同じ症状に遭遇した方の役に立てば幸いです。