Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for nyankotaro

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