LoginSignup
0
0

More than 1 year has passed since last update.

[AWS / SAM] build / deploy失敗パターン

Posted at

概要

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

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。

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にのみ記載していた

ときにも発生しました。
参考になれば嬉しいです。

あとがき

こういう凡ミスの総集編みたいなのが、一つの記事に纏まってると便利なんだけどな。。。

とはいえ、なかなか全部に出くわす人はいないですよね。
いたらちょっとかわいそう(´;ω;`)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0