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

# 概要

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`のパラメーターと、プロンプト入力の改行のために書いたバックスラッシュ`\`との間に **`半角スペース`がなかった**。
- 対策
以下のように半角スペースを入れたところ直った。

```bash:例
# 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^)／

このエラーについては、別の原因で発生することもあるようで、以下の記事にも対策が載っていました。

https://dev.classmethod.jp/articles/cfn-githubtoken-secretsmanager/

## 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`ファイルに記載している名前とを完全に一致させる

### 事例サンプル

- 元々のファイルがこうだったとする

```yaml:変更前
# ~~~.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

```yaml: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。

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

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

# あとがき

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

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