$30 off During Our Annual Pro Sale. View Details »

CDKを使って爆速でナレッジサイトを公開した話

 CDKを使って爆速でナレッジサイトを公開した話

nyankotaro

May 20, 2023
Tweet

More Decks by nyankotaro

Other Decks in Technology

Transcript

  1. 2 自己紹介 高山晃太朗(@nyan_kotaroo) 所属 : AWS事業本部コンサルティング 趣味 : ねこ、筋トレ 経歴

    : 金融系インフラSE4年 -> クラスメソッド ロール : 技術コンサル、ナレッジサイトの運用
  2. 10 Construct L1 Construct : “CFn”で始まるCloudFormationに 対応するライブラリ L2 Construct :

    複数のリソースからなる抽象化された ライブラリ(メインで使う) L3 Construct : 特定のユースケースのパターンが記載された ハイレベルで抽象化されたライブラリ
  3. 11 L2が対応してないパラメータがあったとき L2 Constructが用意されていればL2で問題なし! L2で触れないパラメータはあとからL1で上書き可能 const bucket = new s3.Bucket(this,

    'Bucket', { blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, bucketKeyEnabled: true, ... }); // L1コンストラクトでAWS::S3::Bucket ReplicationConfigurationを設定する const cfnBucket = bucket.node.defaultChild as s3.CfnBucket; cfnBucket.addOverride('Properties.ReplicationConfiguration', { Role: replicationRole.roleArn, Rules: [ { DeleteMarkerReplication: { Status: 'Disabled', }, Destination: { AccessControlTranslation: { Owner: 'Destination', }, ... }, }, ], });
  4. 20 ホットスワップ機能(--hotswap) CloudFormationを変更せず、リソースを直接更新するオプション 対応リソース Lambda コード/タグ/説明/環境変数/バージョン/エイリアス Step Functions ステートマシン定義 ECS

    コンテナアセット S3 静的ホスティングリソース CodeBuild プロジェクト/ソース AppSync VTLマッピングテンプレート ※本番環境での利用は非推奨
  5. 21 ホットスワップ機能(--hotswap) CloudFormationを変更せず、リソースを直接更新するオプション 対応リソース Lambda コード/タグ/説明/環境変数/バージョン/エイリアス Step Functions ステートマシン定義 ECS

    コンテナアセット S3 静的ホスティングリソース CodeBuild プロジェクト/ソース AppSync VTLマッピングテンプレート cdk deploy cdk deploy --hotswap ※本番環境での利用は非推奨 約50秒削減
  6. 24 contextによる環境分離 { "app": "npx ts-node --prefer-ts-exts bin/test.ts", ... "context":

    { "projectName": "testproject", "dev": { "accountId": "111122223333", "envName": "dev", "region": "ap-northeast-1" }, "stg": { "accountId": "111122223333", "envName": "dev", "region": "ap-northeast-1" }, "prd": { "accountId": "444455556666", "envName": "prd", "region": "ap-northeast-1" }, ... } } cdk.json const app = new cdk.App(); const projectName = app.node.tryGetContext('projectName'); const envKey = app.node.tryGetContext('env'); const envValues = app.node.tryGetContext(envKey); const env = { account: envValues.accountId, region: envValues.region, }; new TestStack(app, `${projectName}-${envValues.envName}-stack`, { projectName: projectName, envName: envValues.envName, env, }); bin/test.ts export interface props extends cdk.StackProps { projectName: string; envName: string; } export class TestStack extends cdk.Stack { constructor(scope: Construct, id: string, props: props) { super(scope, id, props); new ec2.Vpc(this, 'Vpc', { vpcName: `${props.projectName}-${props.envName}-vpc`, }); } } lib/test-stack.ts > cdk deploy –c env=dev envValuesでdevのオブジェクトを扱える
  7. 25 contextによる環境分離 { "app": "npx ts-node --prefer-ts-exts bin/test.ts", ... "context":

    { "projectName": "testproject", "dev": { "accountId": "111122223333", "envName": "dev", "region": "ap-northeast-1" }, "stg": { "accountId": "111122223333", "envName": "dev", "region": "ap-northeast-1" }, "prd": { "accountId": "444455556666", "envName": "prd", "region": "ap-northeast-1" }, ... } } cdk.json const app = new cdk.App(); const projectName = app.node.tryGetContext('projectName'); const envKey = app.node.tryGetContext('env'); const envValues = app.node.tryGetContext(envKey); const env = { account: envValues.accountId, region: envValues.region, }; new TestStack(app, `${projectName}-${envValues.envName}-stack`, { projectName: projectName, envName: envValues.envName, env, }); bin/test.ts export interface props extends cdk.StackProps { projectName: string; envName: string; } export class TestStack extends cdk.Stack { constructor(scope: Construct, id: string, props: props) { super(scope, id, props); new ec2.Vpc(this, 'Vpc', { vpcName: `${props.projectName}-${props.envName}-vpc`, }); } } lib/test-stack.ts > cdk deploy –c env=dev > cdk deploy –c env=stg -c env=devのリソース -c env=stgのリソース
  8. 26 contextによる環境分離 export interface props extends cdk.StackProps { projectName: string;

    envName: string; } export class TestStack extends cdk.Stack { constructor(scope: Construct, id: string, props: props) { super(scope, id, props); if (props.envName === 'demo') { new StaticSite(this, 'StaticSite’, { projectName: props.projectName, envName: props.envName, }); } else { const authentication = new Authentication(this, 'Authentication', { projectName: props.projectName, envName: props.envName, }); new StaticSite(this, 'StaticSite', { projectName: props.projectName, envName: props.envName, authApi: authentication.authApi, }); } } } test-stack.ts 機能ごとにカスタムconstructを作成し、contextを使った条件分岐でconstructを 組み変えることで、同一ソース内で環境ごとに構成の違うStackを作成することができる demo環境では認証機能はデプロイしないような例
  9. 30