[SAM / SecretsManager] Could not find a value associated with JSONKey in SecretString発生

英語でしか解決策が見つからず、対処に時間がかかったので記事にしておきました。

# 症状

AWSコンソールを開いて`SecretsManager`上で環境変数をいじった後
`$ sam deploy`
をしたところ、
`Could not find a value associated with JSONKey in SecretString`
というerrorが発生してdeployに失敗した。

<details><summary>エラー詳細はこちら</summary><div>

```bash
% sam deploy --config-env dev --config-file config/samconfig.toml

# (略)

yyyy-mm-dd HH:MM:SS - Waiting for stack create/update to complete

CloudFormation events from stack operations
-----------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                     ResourceType                       LogicalResourceId                  ResourceStatusReason             
-----------------------------------------------------------------------------------------------------------------------------------------
UPDATE_FAILED                      AWS::Lambda::Function              HogeFunction                       Could not find a value           
                                                                                                         associated with JSONKey in       
                                                                                                         SecretString                     
UPDATE_ROLLBACK_IN_PROGRESS        AWS::CloudFormation::Stack         HogeStack                          The following resource(s) failed 
                                                                                                         to update: [Hoge2Function,        
                                                                                                         HogeFunction].                 
UPDATE_FAILED                      AWS::Lambda::Function              Hoge2Function                      Resource update cancelled        
UPDATE_COMPLETE                    AWS::Lambda::Function              HogeFunction.                      -                                
UPDATE_COMPLETE                    AWS::Lambda::Function              Hoge2Function                      -                                
UPDATE_ROLLBACK_COMPLETE_CLEANUP   AWS::CloudFormation::Stack         HogeStack                          -                                
_IN_PROGRESS                                                                                                                              
UPDATE_ROLLBACK_COMPLETE           AWS::CloudFormation::Stack         HogeStack                          -                                
-----------------------------------------------------------------------------------------------------------------------------------------
Error: Failed to create/update the stack: HogeStack, Waiter StackUpdateComplete failed: Waiter encountered a terminal failure state: For expression "Stacks[].StackStatus" we matched expected path: "UPDATE_ROLLBACK_COMPLETE" at least once
```

</div></details>

# 解決策

## 概要

このissueコメントに記載されている対策をとったところ、問題を解消できました。

https://github.com/aws/aws-sam-cli/issues/2153

リンク先には以下の対処法が記載されています。

> The right way to do it is:
>
> - Add new Secret keys or change values if needed
> - Run your update
> - Remove now unused Secret keys

「英語でおk」な人は、上記リンクを読めば解決すると思います。

## 原因

元々deployする際に必要としていたSecretsManager上のシークレットキーを、削除(またはキー名を変更)してしまったことが原因。
どうやらSAM(sam-cli)は、前回のdeploy時に必要だったシークレットキーを、その次のdeploy時も参照しようとするようだ。

そして、前回に必要だったキーがなくなっていると、~~「うわあああああああん！ないよぉおおぉお！(´；ω；｀)ﾌﾞﾜｯ」と言わんばかりに混乱してしまい、~~もう作業をしてくれない。
そのキー、もう必要ないんだけどね。うふふ|q •̤ᴗ•̤ )…♡

温かい目で見守りながら対処してあげましょう。

## 対策

1. 前回存在していたシークレットキーをもう一度設定してあげる
1. デプロイする  
    ※この「2.」によって、「1.」のシークレットキーはもう必要ない状態にする
1. 「1.」のシークレットキーを削除する

### 具体的には、、、

以前存在していた（必要だった）シークレットキーが`HogeHuga=hogehuga`だったとすると、

1. SecretsManager上に再度`HogeHuga`を設定してあげる
1. もう`HogeHuga`が必要ないような`template.yaml`になっていることを確認した上で、`sam deploy`する
1. SecretsManager上の`HogeHuga`を削除する

これで無事、SecretsManager上の不要な環境変数（シークレットキー）を消すことができました^^

# 参考記事

https://github.com/aws/aws-sam-cli/issues/2153