【AWS SAM】空白を含む文字列でパラメータを上書きする時の注意点

記事タイトルとURLをコピーする

こんにちは。 ディベロップメントサービス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 で送信するコマンド管理ファイル
  • 最終的にはコマンド上で展開されることを考えて、空白の処理などはきちんとしましょう

さいごに

単純だけどなかなか気づかない話。

本ブログがどなかたのお役に立てれば幸いです。

山本 真大(執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス1課

2023年8月入社。カピバラさんが好き。