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](https://dev.classmethod.jp/articles/cdk-minimum-deploy-policy/)


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

aws s3 ls


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

cdk destroy

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

[AWS CloudFormationスタック強制削除ツール \- 365歩のテック](https://go-to-k.hatenablog.com/entry/delstack)


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

**lib/my-first-infra-stack.ts** に `removalPolicy: 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
01/19 17:02

edit