概要
AWSのsam
を使っていると、結構わかりにくいエラーメッセージに悩まされることがある。
エラーメッセージが曖昧で、どこに何の問題があるのか特定できないからだ。
そんな場合の対処法のメモ。
エラーパターン例
1. Given input did not match expected format
具体的には、 sam deploy
した時に次のようなエラーが出る。
Error: Failed to create changeset for the stack: {your-stack-name}, ex: Waiter ChangeSetCreateComplete failed: Waiter encountered a terminal failure state: For expression "Status" we matched expected path: "FAILED" Status: FAILED. Reason: Given input did not match expected format
- 原因
parameter-overrides
のパラメーターと、プロンプト入力の改行のために書いたバックスラッシュ\
との間に半角スペース
がなかった。 - 対策
以下のように半角スペースを入れたところ直った。
# NG
$ sam deploy --config-file config/sassor_samconfig.toml \
--profile default-profile \
--parameter-overrides HOGE=hogehoge\ # <- ここがNG
USERNAME=user_name
# OK
$ sam deploy --config-file config/sassor_samconfig.toml \
--profile default-profile \
--parameter-overrides HOGE=hogehoge \ # <- これでOK
USERNAME=user_name
こんなん誰が気付くっていうんだ...(´^ω^`)ブフォ
プログラミングの世界では、=
の前後などにスペースがあってもなくても動く場合が結構あるけど、SAMでコマンド打つときのバックスラッシュの前後はダメらしい。
これで数十分無駄にしました\(^o^)/
このエラーについては、別の原因で発生することもあるようで、以下の記事にも対策が載っていました。
2. Incomplete list of function logical ids specified for '--image-repositories'.
次はこちらのエラー。
具体的には、 sam deploy
した時に次のようなエラーが出る。
Error: Incomplete list of function logical ids specified for '--image-repositories'. You can also add --resolve-image-repos to automatically create missing repositories.
エラーメッセージには、どのファイルのどこがまずいのかが書かれていない。。。
- 原因
SAMコンフィグとして使用しているtoml
ファイル内のimage_repositories
左辺の変更漏れ。
template.yaml
に記載している名前とtoml
ファイルに記載している名前が一致していないといけないが、template.yaml
だけを変更してしまうとこの事象が発生した。 - 対策
template.yaml
に記載している名前と、toml
ファイルに記載している名前とを完全に一致させる
事例サンプル
- 元々のファイルがこうだったとする
# ~~~.toml
image_repositories = [
"HogeFunction=123456123456.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-dev",
"HugaFunction=123456123456.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-dev",
]
# template.yaml
HogeFunction: # <- ここに注目
Type: AWS::Serverless::Function
Properties:
PackageType: Image
ImageConfig:
Command: ["hoge.app.lambda_handler"]
FunctionName: "hoge-lambda-xy01"
Events:
HogeEvent:
Type: Schedule
Properties:
Schedule: cron(30 */3 * * ? *)
# 以下略
HugaFunction:
Type: AWS::Serverless::Function
Properties:
PackageType: Image
ImageConfig:
Command: ["huga.app.lambda_handler"]
FunctionName: "hoge-lambda-xy02"
Events:
HogeEvent:
Type: Schedule
Properties:
Schedule: cron(30 */3 * * ? *)
# 以下略
これを次のように変更してしまうとNG
# ~~~.toml
image_repositories = [
"HogeFunction=123456123456.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-dev",
"HugaFunction=123456123456.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-dev",
] # tomlは変更していない
# template.yaml
RenamedFunction: # <- ここだけ名前が変わってる
Type: AWS::Serverless::Function
# 以下略
HugaFunction:
Type: AWS::Serverless::Function
# 以下略
そうではなく、以下のように、tomlとtemplate.yamlの表記を合わせればOK。
# ~~~.toml
image_repositories = [
"RenamedFunction=123456123456.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-dev", # <- HogeFunction => RenamedFunction に書き換え
"HugaFunction=123456123456.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-dev",
] # tomlも変更しよう
## template.yaml
RenamedFunction: # <- toml に書かれているのと同じ名前
Type: AWS::Serverless::Function
# 以下略
HugaFunction:
Type: AWS::Serverless::Function
# 以下略
コレもなかなか気付けない。(tomlの存在を忘れていた。)
補足
このエラーについては、名前の不一致だけでなく、
image_repositories
を使用するLambdaFunctionを、template.yaml
にのみ記載していた
ときにも発生しました。
参考になれば嬉しいです。
あとがき
こういう凡ミスの総集編みたいなのが、一つの記事に纏まってると便利なんだけどな。。。
とはいえ、なかなか全部に出くわす人はいないですよね。
いたらちょっとかわいそう(´;ω;`)