こんにちは。 ディベロップメントサービス1課の山本です。
AWS Serverless Application Model (以降、SAM) を利用する際
空白を含む文字列でパラメータを上書きする場合の注意点を説明します。
この記事の対象者は?
- SAM を使ったデプロイを検討・利用されている方
パラメータの上書きについて
以下、2種類の方法にて
CloudFormation 内のパラメータ値をデプロイ時に上書きすることが可能です。
--parameter-overrides
を deploy 時の引数に設定する- AWS SAM CLI 設定ファイル にて、parameter-overrides の記載をする
AWS SAM CLI 設定ファイル - AWS Serverless Application Model
空白を含む文字列がパラメータに含まれる場合のエラー
過去のブログにて、パラメータに cron スケジュールを設定しました。
【NAT Gateway】簡単節約術!Lambda を使って自動起動・削除してみた - サーバーワークスエンジニアブログ
最初に作った AWS SAM CLI 設定ファイル。
問題です。
どの箇所でエラーが出ると思いますか?
version = 0.1 [default.deploy.parameters] stack_name = "auto-nat-gateway-stack" capabilities = "CAPABILITY_NAMED_IAM" region = "ap-northeast-1" s3_bucket = "sam-resource-xxx" parameter_overrides = [ "SystemName=dev", # システム名 "SubnetId=subnet-xxxxxxxxxxxxxx", # NAT Gateway を設置するサブネット "RouteTableId=rtb-xxxxxxxxxxxxxx", # NAT Gateway に向けるルートテーブル "StartCronExpression=cron(0 9 ? * MON-FRI *)", # NAT Gateway 起動時間(JST) "StopCronExpression=cron(0 18 ? * MON-FRI *)" # NAT Gateway 終了時間(JST) ]
答え。
cronスケジュールが途中で切れて、エラーとなります。
Resource handler returned message: "Invalid request provided: Invalid Schedule Expression cron(0
エラーの原因
AWS SAM CLI 設定ファイル は文字通り CLI で送信する引数をファイルで管理しているだけなので、実際は以下の通りのコマンドで送信されます。
sam deploy --parameter_overrides SystemName=dev SubnetId=subnet-xxxxxxxxxxxxxx RouteTableId=rtb-xxxxxxxxxxxxxx StartCronExpression=cron(0 9 ? * MON-FRI *) StopCronExpression=cron(0 18 ? * MON-FRI *)
そうです。
パラメータの区切りを空白で管理しているため
StartCronExpression=cron(0
までがパラメータとして処理されます。
対策
'
と "
で囲って、空白を含む文字列をきちんと文字列化しましょう。
version = 0.1 [default.deploy.parameters] stack_name = "auto-nat-gateway-stack" capabilities = "CAPABILITY_NAMED_IAM" region = "ap-northeast-1" s3_bucket = "{SAM リソースを保管する S3 バケット名}" parameter_overrides = [ "SystemName=dev", # システム名 "SubnetId=subnet-xxxxxxxxxxxxxx", # NAT Gateway を設置するサブネット "RouteTableId=rtb-xxxxxxxxxxxxxx", # NAT Gateway に向けるルートテーブル 'StartCronExpression="cron(0 9 ? * MON-FRI *)"', # NAT Gateway 起動時間(JST) 'StopCronExpression="cron(0 18 ? * MON-FRI *)"' # NAT Gateway 終了時間(JST) ]
まとめ
- AWS SAM CLI 設定ファイル は あくまで CLI で送信するコマンド管理ファイル
- 最終的にはコマンド上で展開されることを考えて、空白の処理などはきちんとしましょう
さいごに
単純だけどなかなか気づかない話。
本ブログがどなかたのお役に立てれば幸いです。