AWS CDKで"Error: spawnSync docker ENOENT"エラーが出た時の解決策

# エラー

```shell-session
$ cdk bootstrap
Error: spawnSync docker ENOENT
    at Object.spawnSync (node:internal/child_process:1110:20)
    at Object.spawnSync (node:child_process:871:24)
    at dockerExec (/example-app/node_modules/aws-cdk-lib/core/lib/bundling.ts:498:16)
    at Function.fromBuild (/example-app/node_modules/aws-cdk-lib/core/lib/bundling.ts:279:5)
    at new Bundling (/example-app/node_modules/@aws-cdk/aws-lambda-go-alpha/lib/bundling.ts:120:46)
    at Function.bundle (/example-app/node_modules/@aws-cdk/aws-lambda-go-alpha/lib/bundling.ts:71:22)
    at new GoFunction (/example-app/node_modules/@aws-cdk/aws-lambda-go-alpha/lib/function.ts:109:22)
    at new Notification (/example-app/lib/notification.ts:27:21)
    at new ExampleStack (/example-app/lib/example-app-stack.ts:31:26)
    at /example-app/bin/example-app.ts:61:3

Subprocess exited with error 1
```

# 解決策

dockerをインストールしました。

```shell-session
$ sudo dnf install docker
```

<details><summary>（CDK実行ユーザーがdockerを触れるように権限設定もしました。）</summary>

docker psして以下のようなエラーが出て無ければOK
```shell-session
## NG
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

## OK
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

```shell-session
$ sudo gpasswd -a $(whoami) docker
$ sudo chgrp docker /var/run/docker.sock
$ sudo systemctl restart docker
```

↑でダメだったら。ここまですれば流石に行けると思います。

```shell-session
$ sudo chown root:ec2-user /var/run/docker.sock
$ sudo systemctl restart docker
```

</details>


# 原因
>このモジュールを使用するには、Goがインストールされているか（go1.11以降）、Dockerがインストールされている必要があります。
[@aws-cdk-lib.aws_lambda_nodejs module](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-lambda-go-alpha-readme.html#local-bundling)


因みに、エラー文で調べるとesbuildをインストールすると解決できると記載の記事は複数ありますが、goではなくnodejsのモジュールを使用している場合の解決策（ローカルバンドル方法）のようでした。
>利用可能な場合は、esbuild環境内でコードをバンドルするために使用されます。 それ以外の場合、バンドルは、Lambda 関数のターゲット アーキテクチャに基づいて、Lambda互換の Docker コンテナと Docker プラットフォームで行われます。
[@aws-cdk/aws-lambda-nodejs module](https://docs.aws.amazon.com/cdk/api/v1/docs/aws-lambda-nodejs-readme.html#local-bundling)

dockerを使うとかなり時間がかかる可能性はありますが、どちらもエラーは解消出来そうです。


# ローカル環境情報

```shell-session
$ ec2-metadata --ami-id
ami-id: ami-08c84d37db8aafe00

$ cat /etc/system-release
Amazon Linux release 2023 (Amazon Linux)

$ uname -a
Linux example.ap-northeast-1.compute.internal 6.1.38-59.109.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Jul 11 23:51:29 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

$ aws --v
aws-cli/2.9.19 Python/3.9.16 Linux/6.1.38-59.109.amzn2023.x86_64 source/x86_64.amzn.2023 prompt/off

$ node -v
v18.17.0

$ go version
bash: go: command not found

$ cdk --version
2.89.0 (build 2ad6683)
```


# 参考
https://maku.blog/p/cj9i4m3/

https://docs.aws.amazon.com/cdk/api/v1/docs/aws-lambda-nodejs-readme.html

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-lambda-go-alpha-readme.html


https://tech.librastudio.co.jp/entry/index.php/2018/07/14/post-1924/

https://qiita.com/berukokoko/items/57cdcb668cf4e2bed292