AWSでAPI GatewayのステージにLambdaのエイリアスを対応させた際にハマったこと&解決方法
本題まで長いです。
API GatewayのステージにLambdaのエイリアスを対応させる
API Gatewayのステージとは?
APIをデプロイする際に設定できます。
このステージをいい感じに設定することで、開発用と本番用の運用ができます。
例えば、開発用ではDevelop
というステージにデプロイし、本番用ではProduct
というステージにデプロイすることで、開発者とユーザが使用するAPIを切り替えることができます。
Lambdaのエイリアスとは?
Lambdaでは任意の状態のスナップショットをバージョンとして発行することができます。
エイリアスとは、特定のバージョンに対して付与する名前のことです。(ポインタと表現されています。)
Gitみたいなモノですね。(考え方はGitで良いと思います。)
- Lambdaのバージョン → Gitのコミットに相当
- Lambdaのエイリアス → Gitのタグに相当
以下のように、Lambdaの設定画面からバージョンとエイリアスを作成することができます。
対応させるとは?
API Gatewayのステージ
とLambdaのエイリアス
を対応させることです。
つまり、以下のことが実現できます。
- 開発用のAPI Gateway(ステージ:Develop)から、開発用のLambda(エイリアス:Develop)を実行できる
- 本番用のAPI Gateway(ステージ:Product)から、本番用のLambda(エイリアス:Product)を実行できる
対応させる方法
以下を参照してください。
- http://blog.serverworks.co.jp/tech/2017/02/01/apigateway-lambda-cloudwatchlogs/
- https://qiita.com/szk3/items/298dfc8bb86ba802617f
本題:ハマったこと
ようやく本題です。
API Gatewayのステージにalias
という変数を定義し、実行するLambda関数を以下のように設定します。
設定すると、以下のような画面が表示され、「このコマンドを実行してね」と表示されます。
このコマンドの${stageVariables.alias}
の部分は、Lambdaのエイリアスに合わせて変更するため、TestAPIGateway:Develop
とTestAPIGateway: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
最後に
分かってしまえば単純な原因でしたが、解決するまで苦労しました。
同じ症状に遭遇した方の役に立てば幸いです。