Skip to content

Commit 393e96c

Browse files
committed
feat(cdk): build all container images in CodeBuild via ContainerImageBuild
Migrate async-job and dsql-migrator from DockerImageCode.fromImageAsset (local Docker build) to ContainerImageBuild from @cdklabs/deploy-time-build, matching the pattern already used by webapp. Also migrate the package from deploy-time-build to @cdklabs/deploy-time-build (the official cdklabs-scoped successor). This removes Docker from deployment prerequisites, eliminating Windows Docker Desktop setup friction and CI Docker-in-Docker requirements. All three images are built natively on ARM64 CodeBuild (general1.small) during cdk deploy. Trade-off: no Docker layer cache (full rebuild each deploy) and CodeBuild ARM/Small concurrent build quota defaults to 1 (builds queue sequentially; adjustable via Service Quotas).
1 parent ee2609c commit 393e96c

9 files changed

Lines changed: 780 additions & 49 deletions

File tree

.serverless-full-stack-webapp-starter-kit/docs/v3.0.0/design.ja.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,19 @@ DSQL 非互換パターンをコーディング時とマイグレーション時
206206

207207
選定理由は [ADR-002](adr-002-pnpm-workspaces.ja.md) を参照。以下は実装上の制約と対処。
208208

209+
### ContainerImageBuild によるリモートビルド
210+
211+
全コンテナイメージ(webapp、async-job、dsql-migrator)を `@cdklabs/deploy-time-build``ContainerImageBuild` でビルドする。`DockerImageCode.fromImageAsset`(ローカル Docker ビルド)は使用しない。
212+
213+
動機: デプロイ時のローカル Docker 依存を排除する。Windows での Docker Desktop セットアップや CI 環境での Docker-in-Docker が不要になり、Prerequisites から Docker を削除できる。
214+
215+
仕組み: `cdk deploy` 時に CloudFormation カスタムリソースが CodeBuild(ARM/Small)でイメージをビルドし ECR にプッシュする。同一スタック・同一アーキテクチャの `ContainerImageBuild``SingletonProject` により1つの CodeBuild プロジェクトを共有する。
216+
217+
トレードオフ:
218+
219+
- Docker レイヤーキャッシュが効かない(毎回フルビルド)
220+
- CodeBuild ARM/Small の同時実行クォータがデフォルト1のため、複数ビルドはキューイングされ直列実行になる。Service Quotas で引き上げ可能
221+
209222
### スクリプト規約
210223

211224
各サブパッケージが定型タスク名(`dev``build``test:unit``lint``check:ci` 等)を自身の `package.json` に定義し、ルートからは `pnpm -r run <task>` で一括実行する。ルート `package.json` にはタスクのエイリアススクリプトを置かない — 各パッケージが自身のスクリプトを持つため冗長であり、`--if-present` 付きの間接呼び出しはデバッグを困難にする。

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ Fully serverless — no VPC required, high cost efficiency, scalability, and min
5252
Prerequisites:
5353
* [Node.js](https://nodejs.org/) (>= v22)
5454
* [pnpm](https://pnpm.io/) (>= v10)
55-
* [Docker](https://docs.docker.com/get-docker/)
5655
* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) with a configured IAM profile
5756

5857
### 1. Copy the kit

apps/cdk/lib/constructs/async-job.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { Construct } from 'constructs';
22
import { CfnOutput, Duration, IgnoreMode, RemovalPolicy, TimeZone } from 'aws-cdk-lib';
33
import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs';
4-
import { Architecture, DockerImageCode, DockerImageFunction, IFunction } from 'aws-cdk-lib/aws-lambda';
4+
import { Architecture, DockerImageFunction, IFunction } from 'aws-cdk-lib/aws-lambda';
55
import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
66
import { Database } from './database';
77
import { EventBus } from './event-bus';
88
import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
99
import { join } from 'path';
1010
import { Schedule, ScheduleExpression, ScheduleTargetInput } from 'aws-cdk-lib/aws-scheduler';
1111
import { LambdaInvoke } from 'aws-cdk-lib/aws-scheduler-targets';
12+
import { ContainerImageBuild } from '@cdklabs/deploy-time-build';
1213

1314
export interface AsyncJobProps {
1415
readonly database: Database;
@@ -22,13 +23,15 @@ export class AsyncJob extends Construct {
2223
super(scope, id);
2324
const { database, eventBus } = props;
2425

26+
const image = new ContainerImageBuild(this, 'Build', {
27+
directory: join('..', '..'),
28+
platform: Platform.LINUX_ARM64,
29+
file: 'apps/async-job/Dockerfile',
30+
ignoreMode: IgnoreMode.DOCKER,
31+
});
32+
2533
const handler = new DockerImageFunction(this, 'Handler', {
26-
code: DockerImageCode.fromImageAsset(join('..', '..'), {
27-
cmd: ['handler.handler'],
28-
platform: Platform.LINUX_ARM64,
29-
file: 'apps/async-job/Dockerfile',
30-
ignoreMode: IgnoreMode.DOCKER,
31-
}),
34+
code: image.toLambdaDockerImageCode(),
3235
memorySize: 256,
3336
timeout: Duration.minutes(10),
3437
architecture: Architecture.ARM_64,

apps/cdk/lib/constructs/dsql-migrator/index.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { CfnOutput, Duration, IgnoreMode, RemovalPolicy, Stack } from 'aws-cdk-lib';
22
import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs';
33
import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
4-
import { DockerImageFunction, DockerImageCode, Architecture } from 'aws-cdk-lib/aws-lambda';
4+
import { DockerImageFunction, Architecture } from 'aws-cdk-lib/aws-lambda';
55
import { Construct } from 'constructs';
66
import { Trigger } from 'aws-cdk-lib/triggers';
77
import { Database } from '../database';
88
import { join } from 'path';
9+
import { ContainerImageBuild } from '@cdklabs/deploy-time-build';
910

1011
export interface DsqlMigratorProps {
1112
readonly database: Database;
@@ -17,12 +18,15 @@ export class DsqlMigrator extends Construct {
1718

1819
const { database } = props;
1920

21+
const image = new ContainerImageBuild(this, 'Build', {
22+
directory: join(__dirname, '..', '..', '..', '..', '..'),
23+
platform: Platform.LINUX_ARM64,
24+
file: 'apps/cdk/lib/constructs/dsql-migrator/Dockerfile',
25+
ignoreMode: IgnoreMode.DOCKER,
26+
});
27+
2028
const migrationRunner = new DockerImageFunction(this, 'Handler', {
21-
code: DockerImageCode.fromImageAsset(join(__dirname, '..', '..', '..', '..', '..'), {
22-
platform: Platform.LINUX_ARM64,
23-
file: 'apps/cdk/lib/constructs/dsql-migrator/Dockerfile',
24-
ignoreMode: IgnoreMode.DOCKER,
25-
}),
29+
code: image.toLambdaDockerImageCode(),
2630
architecture: Architecture.ARM_64,
2731
timeout: Duration.minutes(15),
2832
environment: database.getLambdaEnvironment(),

apps/cdk/lib/constructs/webapp.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Database } from './database';
1010
import { EdgeFunction } from './cf-lambda-furl-service/edge-function';
1111
import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager';
1212
import { Auth } from './auth/';
13-
import { ContainerImageBuild } from 'deploy-time-build';
13+
import { ContainerImageBuild } from '@cdklabs/deploy-time-build';
1414
import { join } from 'path';
1515
import { EventBus } from './event-bus/';
1616
import { AsyncJob } from './async-job';

apps/cdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
"dependencies": {
1818
"@aws-appsync/utils": "^1.12.0",
1919
"@aws-sdk/client-cognito-identity-provider": "^3.987.0",
20+
"@cdklabs/deploy-time-build": "^0.1.1",
2021
"@types/aws-lambda": "^8.10.149",
2122
"aws-cdk-lib": "^2.189.1",
2223
"cdk-nag": "^2.14.29",
2324
"constructs": "^10.0.0",
24-
"deploy-time-build": "^0.3.32",
2525
"source-map-support": "^0.5.21"
2626
},
2727
"devDependencies": {

0 commit comments

Comments
 (0)