diff --git a/examples/cloudflare-example/Pulumi.yaml b/examples/cloudflare-example/Pulumi.yaml new file mode 100644 index 00000000..0366cc3b --- /dev/null +++ b/examples/cloudflare-example/Pulumi.yaml @@ -0,0 +1,3 @@ +name: pulumi-aws-cdk-fargate +runtime: nodejs +description: Fargate example for CDK diff --git a/examples/cloudflare-example/app/Dockerfile b/examples/cloudflare-example/app/Dockerfile new file mode 100644 index 00000000..d0fb5db6 --- /dev/null +++ b/examples/cloudflare-example/app/Dockerfile @@ -0,0 +1,14 @@ +FROM node:lts AS builder + +WORKDIR /app + +COPY package.json yarn.lock ./ +COPY app ./ + +RUN yarn install --frozen-lockfile +RUN npx esbuild --bundle index.ts --target="node18" --platform="node" --outfile="index.js" + +FROM node:18-alpine +COPY --from=builder /app/index.js /app/index.js +EXPOSE 80 +CMD ["node", "/app/index.js"] diff --git a/examples/cloudflare-example/app/index.ts b/examples/cloudflare-example/app/index.ts new file mode 100644 index 00000000..84432a1a --- /dev/null +++ b/examples/cloudflare-example/app/index.ts @@ -0,0 +1,14 @@ +import express, { Request, Response } from 'express'; +const app = express(); + +app.get('/', async (_req: Request, res: Response) => { + res.status(200).send('Hello, world!'); +}); + +app.get('/health', (_req: Request, res: Response) => { + res.status(200).send(JSON.stringify({ message: 'OK' })); +}); + +app.listen(80, () => { + console.log('Listening on port 8080'); +}); diff --git a/examples/cloudflare-example/index.ts b/examples/cloudflare-example/index.ts new file mode 100644 index 00000000..bc063be0 --- /dev/null +++ b/examples/cloudflare-example/index.ts @@ -0,0 +1,57 @@ +import * as path from 'path'; +import * as pulumi from '@pulumi/pulumi'; +import * as pulumicdk from '@pulumi/cdk'; +import * as cloudflare from '@pulumi/cloudflare'; +import * as ecs_patterns from 'aws-cdk-lib/aws-ecs-patterns'; +import * as ecs from 'aws-cdk-lib/aws-ecs'; +import { Platform } from 'aws-cdk-lib/aws-ecr-assets'; + +const accountId = pulumi.secret(process.env['CLOUDFLARE_ACCOUNT_ID']!); +class CloudFlareStack extends pulumicdk.Stack { + public readonly nameservers: pulumi.Output<string[]>; + constructor(app: pulumicdk.App, id: string) { + super(app, id); + + const zone = cloudflare.getZoneOutput({ + accountId, + name: 'pulumi-cloudflare-demo.com', + }); + this.nameservers = zone.nameServers; + + const service = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'service', { + listenerPort: 80, + taskImageOptions: { + image: ecs.ContainerImage.fromAsset(path.join(__dirname, './'), { + file: 'app/Dockerfile', + exclude: ['cdk.out', 'node_modules'], + // assetName is now required and is used in the name of the ecr repository that is created + assetName: 'cdk-cloudflare-example', + platform: Platform.LINUX_AMD64, + }), + }, + }); + + new cloudflare.Record('alb', { + name: 'cdk-alb', + type: 'CNAME', + zoneId: zone.zoneId, + content: this.asOutput(service.loadBalancer.loadBalancerDnsName), + proxied: true, + }); + } +} + +class MyApp extends pulumicdk.App { + constructor() { + super('app', (scope: pulumicdk.App): pulumicdk.AppOutputs => { + const stack = new CloudFlareStack(scope, 'cloudflare'); + return { + nameservers: stack.nameservers, + }; + }); + } +} + +const app = new MyApp(); +export const dns = 'http://cdk-alb.pulumi-cloudflare-demo.com'; +export const nameservers = pulumi.unsecret(app.outputs['nameservers']); diff --git a/examples/cloudflare-example/package.json b/examples/cloudflare-example/package.json new file mode 100644 index 00000000..8140bf10 --- /dev/null +++ b/examples/cloudflare-example/package.json @@ -0,0 +1,20 @@ +{ + "name": "pulumi-aws-cdk", + "devDependencies": { + "@types/node": "^10.0.0" + }, + "dependencies": { + "@pulumi/aws": "^6.0.0", + "@pulumi/aws-native": "^1.9.0", + "@pulumi/cdk": "^0.5.0", + "@pulumi/cloudflare": "^5.43.1", + "@pulumi/docker-build": "^0.0.7", + "@pulumi/pulumi": "^3.0.0", + "@pulumi/tls": "^5.0.9", + "@types/express": "^5.0.0", + "aws-cdk-lib": "2.156.0", + "constructs": "10.3.0", + "esbuild": "^0.24.0", + "express": "^4.21.1" + } +} diff --git a/examples/cloudflare-example/tsconfig.json b/examples/cloudflare-example/tsconfig.json new file mode 100644 index 00000000..ab65afa6 --- /dev/null +++ b/examples/cloudflare-example/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "outDir": "bin", + "target": "es2016", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.ts" + ] +}