Open9

AWS CDKメモ

lightkunlightkun
$ cdk init app --language typescript

$ cdk bootstrap

でCDKToolkitっていうCloudFormationスタックが作成されるらしい。

lightkunlightkun

chatGPTで調べたs3バケットの作成方法

src/bin/hello-cdk.ts
import * as cdk from 'aws-cdk-lib';
import { HelloCdkStack } from '../lib/hello-cdk-stack';

const app = new cdk.App();
new HelloCdkStack(app, 'HelloCdkStack', {
    env: { region: 'us-east-1' },
});
src/cdk.json
-  "app": "npx ts-node --prefer-ts-exts bin/src.ts",
+  "app": "npx ts-node --prefer-ts-exts bin/hello-cdk.ts",
src/lib/hello-cdk-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

export class HelloCdkStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
        new s3.Bucket(this, 'MyBucket', {
            bucketName: 'ここに作成したいバケット名を入れる',
        });
    }
}

テンプレート確認

$ cdk synth

デプロイ

$ cdk deploy
lightkunlightkun

Error: Cannot retrieve value from context provider vpc-provider since account/region are not specified at the stack level. Configure "env" with an account and region when you define your stack.エラー

src/lib/hello-cdk-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
-import * as s3 from 'aws-cdk-lib/aws-s3';
+import * as ec2 from 'aws-cdk-lib/aws-ec2';

export class HelloCdkStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
+        const vpc = ec2.Vpc.fromLookup(this, 'MyExistingVpc', {
+            vpcId: [既存VPCID]',
+        });
    }
}

で既存VPCを参照しようとして、cdk diffするとエラーに。
~/.aws/configのaccountとregionを読み込むにはprocess.env.CDK_DEFAULT_ACCOUNTprocess.env.CDK_DEFAULT_REGIONと書けばいいらしい。
https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/environments.html

accountだけ参照したかったので、こうした。

src/bin/hello-cdk-stack.ts
import * as cdk from 'aws-cdk-lib';
import { HelloCdkStack } from '../lib/hello-cdk-stack';

const app = new cdk.App();
new HelloCdkStack(app, 'HelloCdkStack', {
    env: {
+       account: process.env.CDK_DEFAULT_ACCOUNT,// 
        region: 'us-east-1'
    },
});

そしたらcdk diffして、cdk deployできた

lightkunlightkun

手動変更の差分を取り込む方法
https://tech.excite.co.jp/entry/2023/03/14/081516
https://dev.classmethod.jp/articles/cloudformation-support-drift-detection/

cdk diffはコードとcloudformationのスタックの差分を見るだけであって、実際のリソースを見ていない

  • AWSコンソールからドリフトで差分検出
  • 差分があれば詳細確認してコード側修正
  • cdk diffでチェックしてcdk deploy

terraformよりは面倒である。

ちなみにリソースに差分があるままcdk deployすると

  • cdkとcloudformation間で差分がなし → 何も変更なし
  • 関係のないリソースをcdkでアレコレする → 何も変更なし
  • 該当のリソースをcdkでちょい変更 → 何事もなかったかのようにcdkのコードで上書き(エラーとか出ない)

ということがわかった。怖いねぇ手動変更