目次
背景
Chalice(+CI/CDパイプライン)を利用したAPI開発において、APIGatewayやLambdaに対する追加設定で chalice の configファイルが対応していない点があります。
個人的に遭遇した物で例えば、EFSマウント や APIGatewayのログ出力設定、カスタムレスポンス等です。
デプロイする度にEFSマウントが外れてしまう等悲しい思いをしないようにするため、スマートに対処できる、Chalice の CloudFormation Support (Template Merge) 機能について記載します。
AWS Chalice の AWS CloudFormation Support
https://aws.github.io/chalice/topics/cfn.html
参考: Chaliceに対する EFS Supportのリクエスト新機能チケット(進捗無し)
https://aws.github.io/chalice/topics/configfile.html
実装
上記、AWS Chalice の AWS CloudFormation Supportの先の例では下記のようにDynamoDB Tableの作成やLambda環境変数追加がサンプルとして取り上げられています。
DynamoDB Tableの作成はそもそもCDK側で実施した方が...等の話もあると思いますので設計はさておきChalice Prjだけで完結できるという事は、ありがたい場合もあると思います。
Chaliceドキュメント上のサンプル
chalice packageコマンドに merge-template オプションを指定
$ chalice package --merge-template extras.json out
マージするテンプレート内で、DynamoDB Table作成、作成したTable名をLambda環境変数に追加するサンプル
https://aws.github.io/chalice/topics/cfn.html
extras.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
{ "Resources" : { "MusicTable" : { "Type" : "AWS::DynamoDB::Table", "Properties" : { "TableName" : "MusicData", "AttributeDefinitions" : [ { "AttributeName" : "Album", "AttributeType" : "S" }, { "AttributeName" : "Artist", "AttributeType" : "S" } ], "KeySchema" : [ { "AttributeName" : "Album", "KeyType" : "HASH" }, { "AttributeName" : "Artist", "KeyType" : "RANGE" } ], "ProvisionedThroughput" : { "ReadCapacityUnits" : "5", "WriteCapacityUnits" : "5" } } }, "APIHandler": { "Properties": { "Environment": { "Variables": { "MUSIC_TABLE": {"Ref": "MusicTable"} } } } } } } |
EFSマウントの実現
本題のEFSマウントですが、下記のような形で extras.json を用意し chalice package時に引き渡し、chaliceが生成したテンプレートにマージします。
(一度Localなりで、生成されるテンプレートを確認し、リソース名をしっかり合わせてからマージしましょう!)
extras.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Resources" : { "APIHandler": { "Properties": { "FileSystemConfigs": [ { "Arn": "arn:aws:elasticfilesystem:ap-northeast-1:YOUR_ACCOUNT_ID:access-point/fsap-XXXX", "LocalMountPath": "/mnt/xxxx" } ] } } } } |
APIGatewayのログ吐き出し設定と共にバージョン
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
{ "Resources" : { "APIHandler": { "Properties": { "FileSystemConfigs": [ { "Arn": "arn:aws:elasticfilesystem:ap-northeast-1:YOUR_ACCOUNT_ID:access-point/fsap-XXXX", "LocalMountPath": "/mnt/xxxx" } ] } }, "RestAPI" : { "Properties": { "MethodSettings": [ { "ResourcePath": "/*", "HttpMethod": "*", "LoggingLevel": "INFO", "DataTraceEnabled": false, "MetricsEnabled": false } ] } } } } |
CodeBuild内でchalice package、生成されたSAM Template生成をするケースも多いと思いますので、その場合にはソースコードとは同一で、CodeBuild環境変数に ENVIRONMENT_NAME を定義し、環境別でファイルを分ける等で対応します。
CodeBuild Config
chalice package --stage ${ENVIRONMENT_NAME} --merge-template .chalice/extras-${ENVIRONMENT_NAME}.json ./package
まとめ
非常に便利な AWS Chalice で通常は .chalice/config.json で事足りますが、痒い所に手が届かない場合はmerge-template機能を利用しつつ、 config内での対応を期待しましょう!