aws CDK

● mac へ aws-cdk のインストール

・1. aws cli コマンドのインストールまた更新

https://awscli.amazonaws.com/AWSCLIV2.pkg

・2. aws cli コマンドの確認

バージョン確認
which aws
aws --version

例えば以下のように返ってきます

/usr/local/bin/aws
aws-cli/2.11.21 Python/3.11.3 Darwin/22.3.0 exe/x86_64 prompt/off

・3. aws cdk コマンドのインストール

npm install -g aws-cdk

・4. aws cdk コマンドの確認

バージョン確認
cdk --version

例えば以下のように返ってきます

2.80.0 (build bbdb16a)

● aws のユーザーを確認する

printenv | grep AWS
aws sts get-caller-identity
cat ~/.aws/config 

新しいプロファイルを作成する場合は次のコマンドを実行します
<プロファイル名>のところは IAM ユーザー名にしておくとわかりやすいと思います

aws configure --profile <プロファイル名>

プロファイルを変更するには

export AWS_PROFILE=<プロファイル名>

● aws-cdk を init する

言語: typescript で initします

mkdir my-first-infra && cd my-first-infra
cdk init --language typescript

● cdk コマンド

・CDK App のリスト表示

cdk ls

● cdk に S3を追加する

・1. S3 の追加

lib/my-first-infra-stack.ts

以下の内容に修正します

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

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

    // S3 を追加する
    const bucket = new s3.Bucket(this, 'CreateBucket', {
      bucketName: "test-bucket-2023-05-24",
      versioned: true
    });
  }
}

・2. シンセサイズ

npm run build
cdk synth

・3. cdk bootstrap の実行

最初に1度必要です(CDKに必要な権限を作成します。)

cdk bootstrap aws://<12桁のアカウント番号>/<リージョン名>

✅ Environment aws://<12桁のアカウント番号>/<リージョン名> bootstrapped.
と出ればokです。

・4. デプロイ

npm run build
cdk deploy

● cdk deployするのに必要な権限とは?

デプロイするには AdministratorAccess が必要ですが、直接 IAMユーザーの権限には持たせないで、assume role できるようにしておくと良いでしょう。手順としては次のとおりです。
・IAM ユーザーを作成する
・ポリシー AdministratorAccess を持つ IAM ロールを作成する
 ・IAMユーザーに次のようなポリシーを許可する
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "sts:AssumeRole",
			"Resource": "arn:<IAMロールのarnをコピペで貼り付ける>"
		}
	]
}

AWS CDK でデプロイするときの最小権限について考えてみる | DevelopersIO

・5. 追加されたことを確認する

aws s3 ls

・5. CloudFormation から スタックを 削除

cdk destroy

削除すると CloudFormation から対象のスタックを削除します。 なお、S3 バケットなどは残ります。

AWS CloudFormationスタック強制削除ツール - 365歩のテック

・6. CloudFormation から スタックを 削除時に 空のS3 バケットを削除する設定

lib/my-first-infra-stack.tsremovalPolicy: RemovalPolicy.DESTROY を追加します。

import * as cdk from 'aws-cdk-lib';
import {RemovalPolicy} from 'aws-cdk-lib';
import {Construct} from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

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

    // S3 を追加する
    new s3.Bucket(this, 'my-second-bucket', {
      versioned: true,
      removalPolicy: RemovalPolicy.DESTROY,
  });
  }
}

● DynamoDB と ロールを追加するスタックのサンプル

MySampleTable と MySampleRole を追加します。

import * as cdk from "aws-cdk-lib"
import { RemovalPolicy } from "aws-cdk-lib"
import * as dynamodb from "aws-cdk-lib/aws-dynamodb"
import * as iam from "aws-cdk-lib/aws-iam"
import { Construct } from "constructs"

export class InfrastructureStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    // DynamoDB
    const table = new dynamodb.Table(this, "MySampleTable", {
      partitionKey: { name: "id", type: dynamodb.AttributeType.STRING },
      tableName: "my-sample-table",
      removalPolicy: RemovalPolicy.DESTROY,
    })

    // role
    const role = new iam.Role(this, "MySampleRole", {
      assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
    })
    role.addToPolicy(
      new iam.PolicyStatement({
        resources: [table.tableArn],
        actions: [
          "dynamodb:GetItem",
          "dynamodb:PutItem",
          "dynamodb:UpdateItem",
          "dynamodb:DeleteItem",
        ],
      }),
    )
  }
}
No.2352
07/29 13:45

edit