aws-cdk v2でsam-beta-cdkを使ってみたメモ

## 概要
cdk v2で[sam-beta-cdk](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-cdk.html)が動くか試してみる。

[ソースコード](https://github.com/hibohiboo/aws-cdk-v2/tree/74b0be2ee4611e6967782657cff8ff048f962705)

## 構成

```
- cdk
  - bin
    - cdk.ts
  - lib
    - cdk-stack.ts
  - cdk.json
- src
  - handler
    - api
      - hello.ts
```

<details><summary>スタック・Lambdaファイル抜粋</summary><div>

```ts:cdk-stack.ts
import { Stack, StackProps } from 'aws-cdk-lib';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Construct } from 'constructs';
import { LambdaIntegration, RestApi } from 'aws-cdk-lib/aws-apigateway';

export class CdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const helloLambda = new NodejsFunction(this, 'test', {
      runtime: lambda.Runtime.NODEJS_14_X,
      entry: `../src/handler/api/hello.ts`,
    });
    const api = new RestApi(this, 'ServerlessRestApi', { cloudWatchRole: false });
    api.root.addResource('hello').addMethod('GET', new LambdaIntegration(helloLambda));
  }
}
```

```ts:hello.ts
import { APIGatewayProxyHandler } from 'aws-lambda';

export const handler: APIGatewayProxyHandler = async (event) => {

  return {
    'statusCode': 200,
    'body': JSON.stringify({
      message: 'hello world',
    })
  };
};
```


</div>


## インストール
直接windowsに入れることにした。
[Getting started with AWS SAM and the AWS CDK](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-cdk-getting-started.html)からmsiのインストーラを使ってインストール。
gitbashを使ってコマンドを確認したかったので、インストール先のbinフォルダに以下のファイルを作成

```sh:sam-beta-cdk
#!/bin/bash
current_dir=$(cd $(dirname $0) && pwd)

$current_dir/../runtime/python.exe -m samcli "$@"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/954e63c4-c58e-dda4-c179-f592030ec72d.png)

確認できた。

```
$sam-beta-cdk --version 
SAM CLI, version 1.29.0.dev202108311500
```

<details><summary>最初はDockerとかVagrantでやろうとしたがエラーになったので断念</summary><div>

直接windowsに入れるのは憚られた。
dockerにsam-beta-cdkを入れようとも思ったが、sam-beta-cdkがdockerを立ち上げるので断念（dockerからdockerは立ち上がらない)。
`throw new Error(Failed to bundle asset ${this.node.path}, bundle output is located at ${bundleErrorDir}: ${err});`
[ソースコード](https://github.com/hibohiboo/aws-cdk-v2/tree/2914632d844aff2562d1a02797fa3149aa9a320e)



Vagrant上で行おうと思ったが、すでにwindows上でnode_modulesが作成されていたからか、以下のようなエラーが発生。
`Error: The package "esbuild-linux-64" could not be found, and is needed by esbuild. `

</div></details>

## エラーの対応

cdkリポジトリで動作確認をしようとしたら以下のエラー。

```
KeyError:
```

[issue](https://github.com/aws/aws-sam-cli/issues/2849)が出ていたので、その通りに対応.
`core:newStyleStackSynthesis`はtrueにすると、CDK Pipelinesが動作するために必要な、新しい（1.46.0 以降の）ものに切り替えられるらしい([参考](https://aws.amazon.com/jp/blogs/news/cdk-pipelines-continuous-delivery-for-aws-cdk-applications/))。sam-beta-cdkが未対応のようなので、`false`にする。


```diff:/cdk/cdk.json
{
  "app": "npx ts-node --prefer-ts-exts bin/cdk.ts",
  "context": {
    "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true,
    "@aws-cdk/core:stackRelativeExports": true,
    "@aws-cdk/aws-rds:lowercaseDbIdentifier": true,
    "@aws-cdk/aws-lambda:recognizeVersionProps": true,
    "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true,
+    "@aws-cdk/core:newStyleStackSynthesis": false
  }
}
```

## 動作確認 

```
GET  http://127.0.0.1:3000/hello HTTP/1.1
```




## 参考
[Docker で十全に gcloud や aws コマンドなどを使う方法](https://qiita.com/mumoshu/items/3db46bd1acfc8e392b68)
[cdk getting started](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-cdk-getting-started.html)
[sam-beta-cdkのlambdaのローカル実行をWindows10+Vagrant+VirtualBox+Ubuntuで試してみたメモ](https://qiita.com/hibohiboo/items/942cd4192523d82faf0f)
[issue](https://github.com/aws/aws-sam-cli/issues/2849)