Slide 1

Slide 1 text

AWS CDKで お手軽インフラ構築 2022/10/25 株式会社Relic watanabe

Slide 2

Slide 2 text

自己紹介 ● watanabe yukari ● RelicのTPF所属 ○ PJ横断する何でも屋の部署 ● バックエンドエンジニア ● CDKは初心者

Slide 3

Slide 3 text

概要 ● AWS CDKとは何か ● CDKをどうして使うのか ● Relicでの活用例

Slide 4

Slide 4 text

AWS CDKとは ● AWS Cloud Development Kit、AWS クラウド開発キット ● プログラミング言語を使用してクラウドアプリケーションリソースを定義する ための開発フレームワーク ○ いわゆるIaC ● OSSで開発されている ○ https://github.com/aws/aws-cdk

Slide 5

Slide 5 text

AWS CDKとは ● CDKで使える言語 ○ JavaScript、TypeScript、Python、Java、C# が一般公開、Goはプレビュー ● CDKの利用は無料 ○ CDKにより作成したリソースには料金がかかる

Slide 6

Slide 6 text

なぜCDKを使うのか ● CDKを使っても最終的にはCloudFormationのテンプレートを出力している ○ 最終的にスタックでリソースを管理する部分も同じ ● CloudFormationのテンプレートを直に作成すればいいのでは???

Slide 7

Slide 7 text

なぜCDKを使うのか ● CDKでリソースを定義してCloudFormationのテンプレートを作る方が便利 ○ 使い慣れた言語でリソースの定義ができる ■ 変数やループなどが使える ■ CFでもSubやマクロで可能だがより簡単にできる ○ cdk.jsonまたは--contextオプションなどで共通の値を設定可能 ■ CFだと環境名などは個別に設定していたものを共通化できる ○ 更新時の差分がCFより詳細に分かる

Slide 8

Slide 8 text

こんなシステム作りたいとき ● 複数のバケットを作りたい ○ 1つのスタックで管理する ○ バケットは同じ設定

Slide 9

Slide 9 text

CDKのコード← →CFテンプレート S3を3つ作りたいときのコード { "Resources": { "bucket065CC0256": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { "ServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }, "BucketName": "bucket-0", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", "Metadata": { "aws:cdk:path": "watanabe-s3-stack/bucket-0/Resource" } }, "bucket136091DF3": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { "ServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }, "BucketName": "bucket-1", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", "Metadata": { "aws:cdk:path": "watanabe-s3-stack/bucket-1/Resource" } }, "bucket2584811F3": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { "ServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }, "BucketName": "bucket-2", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", "Metadata": { "aws:cdk:path": "watanabe-s3-stack/bucket-2/Resource" } }, }, import * as cdk from 'aws-cdk-lib'; import * as s3 from 'aws-cdk-lib/aws-s3' import { Construct } from 'constructs'; export class S3Stack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); for(let i=0; i<3; i++){ const bucket = new s3.Bucket(this, `bucket-${i}`, { bucketName: `bucket-${i}`, encryption: s3.BucketEncryption.S3_MANAGED, blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, removalPolicy: cdk.RemovalPolicy.DESTROY }) } } }

Slide 10

Slide 10 text

更新時の差分の確認 CDKのコードで更新 CFテンプレートで更新

Slide 11

Slide 11 text

Relicでの実用例 ● Relicでは新規事業に関する開発が多くある ○ 非機能要件部分の質を均一化したい ● よくあるWebサービスの雛形を用意したプロジェクトProject nullを実装・ 運用している

Slide 12

Slide 12 text

Relicでの実用例 ● 雛形プロジェクトProject nullに合わせてAWSのインフラ構築が可能な CDKプロジェクトを実装・運用 ● Project nullは複数のシステムからなるプロジェクト ○ 追加システムの設定をcdk.jsonに追記しdeployすると、追加システムの リソー スが自動で構築される

Slide 13

Slide 13 text

CDK on Docker ● AWSのドキュメントだとDockerのドの字も出てきませんがCDK on Docker はできます、Relicでもやってます ● 複数人のプロジェクトなら環境構築はDockerでやりたい ○ ベースイメージがpythonだとAWS CLIもCDKも入れやすいので 個人 的におすすめです

Slide 14

Slide 14 text

CDK on Docker ● docker-compose.ymlでマウントの設定を ~/.aws:/root/.aws とすると ● ホスト側の認証設定ファイルをコンテナ内のAWS CLIで使えるので便利で す ○ credentialsがそのままマウントされてしまうので注意

Slide 15

Slide 15 text

いざcdk init on Dockerの罠 ● docker compose run cdk cdk init app --language typescript _人人人人人人人人人人人人人人人人人人人人人人人人人人_ > cdk init cannot be run in a non-empty directory! <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ ● コンテナ内で空ディレクトリを作成してその中で cdk initを実行しましょう… ● cdk init実行後のファイルをコンテナ作業ディレクトリに移動・管理すると後々便利 ○ 他にいい方法あれば教えてください …

Slide 16

Slide 16 text

まとめ ● AWS CDKは使い慣れた言語でリソース定義できる便利な開発キット! ● CDKは差分が細かく見れて嬉しい! ● Relicで活用してます!

Slide 17

Slide 17 text

ご清聴ありがとうございました