AWS ChaliceでEFSマウントを実施する(merge-template機能)

目次

背景

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

{
  "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

{
  "Resources" : {
    "APIHandler": {
      "Properties": {
        "FileSystemConfigs": [
          {
            "Arn": "arn:aws:elasticfilesystem:ap-northeast-1:YOUR_ACCOUNT_ID:access-point/fsap-XXXX",
            "LocalMountPath": "/mnt/xxxx"
          }
        ]
      }
    }
  }
}

APIGatewayのログ吐き出し設定と共にバージョン

{
  "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内での対応を期待しましょう!

投稿者プロフィール

takashi
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。
個人ブログではRaspberryPiを利用したシステムやロボット作成も
実施しております。

スカイアーチネットワークスで一緒に働きましょう!

ABOUTこの記事をかいた人

開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。 個人ブログではRaspberryPiを利用したシステムやロボット作成も 実施しております。 スカイアーチネットワークスで一緒に働きましょう!