GitHub ActionsでAWS CDKが動かなくてハマった話

# 書いてあること
GitHub ActionsでAWSのCDKを使ってデプロイの差分を取得しようとしたらエラーが出て解決に数日かかってしまった。
ネットで調べても解決策がヒットせず、色々試行錯誤してようやく解決した。
もし同じような問題が起きて困っている人は参考にしてほしい。

# エラーが出るCIのファイル
```yaml:ci.yml
name: CI

on:
  pull_request:
    branches: [main]

jobs:
  diff:
    name: Diff
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18.x'

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: diff
        working-directory: ./
        run : |
          npm ci
          npm run cdk-diff
```

# 実際に出たエラー
上記CIを動かすと、このエラーが出る。yarnのインストールに失敗？そんなことある？
エラーメッセージでググっても良い解決策が見つからない。
```
#5 [ 2/10] RUN npm install --global yarn@1.22.5
#5 0.214 exec /bin/sh: exec format error
#5 ERROR: process "/bin/sh -c npm install --global yarn@1.22.5" did not complete successfully: exit code: 1
------
 > [ 2/10] RUN npm install --global yarn@1.22.5:
0.214 exec /bin/sh: exec format error
------
Dockerfile:7
--------------------
   5 |     
   6 |     # Install yarn
   7 | >>> RUN npm install --global yarn@1.22.5
   8 |     
   9 |     # Install pnpm
--------------------
ERROR: failed to solve: process "/bin/sh -c npm install --global yarn@1.22.5" did not complete successfully: exit code: 1
/home/runner/work/hoge/hoge/node_modules/aws-cdk-lib/core/lib/private/asset-staging.js:2
`).map((line,idx)=>`${idx===0?firstLine:padding}${line}`)};const reason=proc.signal!=null?`signal ${proc.signal}`:`status ${proc.status}`,command=[prog,...args.map(arg=>/[^a-z0-9_-]/i.test(arg)?JSON.stringify(arg):arg)].join(" ");throw new Error([`${prog} exited with ${reason}`,...prependLines("--> STDOUT:  ",proc.stdout)??[],...prependLines("--> STDERR:  ",proc.stderr)??[],`--> Command: ${command}`].join(`
                                                                                                                                                                                                                                            ^
Error: docker exited with status 1
--> Command: docker build -t cdk-e4d4c769de205f6558dd8adc010a0a517a8ae893f27262ab6dbe3fed349afb5e --platform "linux/arm64" --build-arg "IMAGE=public.ecr.aws/sam/build-nodejs18.x" --build-arg "ESBUILD_VERSION=0" "/home/runner/work/hoge/hoge/node_modules/aws-cdk-lib/aws-lambda-nodejs/lib"
    at dockerExec (/home/runner/work/hoge/hoge/node_modules/aws-cdk-lib/core/lib/private/asset-staging.js:2:237)
    at Function.fromBuild (/home/runner/work/hoge/hoge/node_modules/aws-cdk-lib/core/lib/bundling.js:1:4364)
    at new Bundling (/home/runner/work/hoge/hoge/node_modules/aws-cdk-lib/aws-lambda-nodejs/lib/bundling.js:1:3393)
    at Function.bundle (/home/runner/work/hoge/hoge/node_modules/aws-cdk-lib/aws-lambda-nodejs/lib/bundling.js:1:605)
    at new NodejsFunction (/home/runner/work/hoge/hoge/node_modules/aws-cdk-lib/aws-lambda-nodejs/lib/function.js:1:1273)
    at new HogeCdkStack (/home/runner/work/hoge/hoge/lib/hoge-cdk-stack.ts:114:28)
    at Object.<anonymous> (/home/runner/work/hoge/hoge/bin/hoge-cdk.ts:23:23)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Module.m._compile (/home/runner/work/hoge/hoge/node_modules/ts-node/src/index.ts:1618:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
[06:13:43] Notices refreshed
[06:13:43] Failed to store notices in the cache: Error: ENOENT: no such file or directory, open '/home/runner/.cdk/cache/notices.json'

Subprocess exited with error 1
[06:13:43] Error: Subprocess exited with error 1
    at ChildProcess.<anonymous> (/opt/hostedtoolcache/node/18.17.1/x64/lib/node_modules/aws-cdk/lib/index.js:445:50448)
    at ChildProcess.emit (node:events:514:28)
    at ChildProcess.emit (node:domain:489:12)
    at ChildProcess._handle.onexit (node:internal/child_process:291:12)
Error: Process completed with exit code 1.
```

# 解決策
``ci.yml``にこれを追加した
```yaml
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
        with:
          platforms: linux/arm64
```

```yaml:ci.yml
name: CI

on:
  pull_request:
    branches: [main]

jobs:
  diff:
    name: Diff
    runs-on: ubuntu-latest

    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
        with:
          platforms: linux/arm64
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18.x'

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: diff
        working-directory: ./
        run : |
          npm ci
          npm run cdk-diff
```

これでようやくCIが通った。3，4日悩んだけど解決した。