From af3c39edccd8dff8ebfd7134e4f270a66e01ac46 Mon Sep 17 00:00:00 2001 From: Luke Hoban Date: Tue, 16 Jun 2020 13:47:03 -0700 Subject: [PATCH] Add a Lambda + EFS example (#709) --- aws-ts-lambda-efs/Pulumi.yaml | 8 ++ aws-ts-lambda-efs/README.md | 142 ++++++++++++++++++++++++++++++++ aws-ts-lambda-efs/index.ts | 118 ++++++++++++++++++++++++++ aws-ts-lambda-efs/lambdaefs.png | Bin 0 -> 49008 bytes aws-ts-lambda-efs/package.json | 9 ++ aws-ts-lambda-efs/tsconfig.json | 19 +++++ 6 files changed, 296 insertions(+) create mode 100644 aws-ts-lambda-efs/Pulumi.yaml create mode 100644 aws-ts-lambda-efs/README.md create mode 100644 aws-ts-lambda-efs/index.ts create mode 100644 aws-ts-lambda-efs/lambdaefs.png create mode 100644 aws-ts-lambda-efs/package.json create mode 100644 aws-ts-lambda-efs/tsconfig.json diff --git a/aws-ts-lambda-efs/Pulumi.yaml b/aws-ts-lambda-efs/Pulumi.yaml new file mode 100644 index 000000000..91cb2160c --- /dev/null +++ b/aws-ts-lambda-efs/Pulumi.yaml @@ -0,0 +1,8 @@ +name: aws-ts-lambda-efs +runtime: nodejs +description: Examples of using Lambda + EFS +template: + config: + aws:region: + description: The AWS region to deploy into + default: us-east-2 diff --git a/aws-ts-lambda-efs/README.md b/aws-ts-lambda-efs/README.md new file mode 100644 index 000000000..e8abf675b --- /dev/null +++ b/aws-ts-lambda-efs/README.md @@ -0,0 +1,142 @@ +[![Deploy](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new) + +# Using Amazon EFS with AWS Lambda + +This example shows how to use Amazon EFS with AWS Lambda in Pulumi. See the [Using AWS Lambda with Amazon Elastic File System (EFS)](https://www.pulumi.com/blog/aws-lambda-efs) blog post for a detailed walkthrough of this example. + +![Architecture Diagram](./lambdaefs.png) + +## Prerequisites + +- [Node.js](https://nodejs.org/en/download/) +- [Download and install the Pulumi CLI](https://www.pulumi.com/docs/get-started/install/) +- [Connect Pulumi with your AWS account](https://www.pulumi.com/docs/intro/cloud-providers/aws/setup/) (if your AWS CLI is configured, no further changes are required) + +## Running the Example + +After cloning this repo, `cd` into it and run these commands: + +1. Create a new stack, which is an isolated deployment target for this example: + + ```bash + $ pulumi stack init dev + ``` + +2. Set your desired AWS region: + + ```bash + $ pulumi config set aws:region us-east-1 # any valid AWS region will work + ``` + +3. Deploy everything with a single `pulumi up` command. This will show you a preview of changes first, which + includes all of the required AWS resources (clusters, services, and the like). Don't worry if it's more than + you expected -- this is one of the benefits of Pulumi, it configures everything so that so you don't need to! + + ```bash + $ pulumi up + ``` + + After being prompted and selecting "yes", your deployment will begin. It'll complete in a few minutes: + + ``` + Updating (demo): + Type Name Status + + pulumi:pulumi:Stack aws-ts-lambda-efs-demo created + + ├─ awsx:x:ec2:Vpc vpc created + + │ ├─ aws:ec2:Vpc vpc created + + │ ├─ awsx:x:ec2:Subnet vpc-public-0 created + + │ │ ├─ aws:ec2:Subnet vpc-public-0 created + + │ │ ├─ aws:ec2:RouteTable vpc-public-0 created + + │ │ ├─ aws:ec2:Route vpc-public-0-ig created + + │ │ └─ aws:ec2:RouteTableAssociation vpc-public-0 created + + │ ├─ awsx:x:ec2:Subnet vpc-public-1 created + + │ │ ├─ aws:ec2:RouteTable vpc-public-1 created + + │ │ ├─ aws:ec2:Subnet vpc-public-1 created + + │ │ ├─ aws:ec2:RouteTableAssociation vpc-public-1 created + + │ │ └─ aws:ec2:Route vpc-public-1-ig created + + │ ├─ awsx:x:ec2:NatGateway vpc-1 created + + │ │ ├─ aws:ec2:Eip vpc-1 created + + │ │ └─ aws:ec2:NatGateway vpc-1 created + + │ ├─ awsx:x:ec2:Subnet vpc-private-0 created + + │ │ ├─ aws:ec2:RouteTable vpc-private-0 created + + │ │ ├─ aws:ec2:Subnet vpc-private-0 created + + │ │ ├─ aws:ec2:RouteTableAssociation vpc-private-0 created + + │ │ └─ aws:ec2:Route vpc-private-0-nat-0 created + + │ ├─ awsx:x:ec2:InternetGateway vpc created + + │ │ └─ aws:ec2:InternetGateway vpc created + + │ ├─ awsx:x:ec2:Subnet vpc-private-1 created + + │ │ ├─ aws:ec2:RouteTable vpc-private-1 created + + │ │ ├─ aws:ec2:Subnet vpc-private-1 created + + │ │ ├─ aws:ec2:RouteTableAssociation vpc-private-1 created + + │ │ └─ aws:ec2:Route vpc-private-1-nat-1 created + + │ └─ awsx:x:ec2:NatGateway vpc-0 created + + │ ├─ aws:ec2:Eip vpc-0 created + + │ └─ aws:ec2:NatGateway vpc-0 created + + ├─ aws:apigateway:x:API api created + + │ ├─ aws:apigateway:RestApi api created + + │ ├─ aws:apigateway:Deployment api created + + │ ├─ aws:lambda:Permission api-2c087c3e created + + │ ├─ aws:lambda:Permission api-c171fd88 created + + │ ├─ aws:lambda:Permission api-7857d17d created + + │ └─ aws:apigateway:Stage api created + + ├─ awsx:x:ecs:FargateService nginx created + + │ └─ aws:ecs:Service nginx created + + ├─ awsx:x:ecs:FargateTaskDefinition nginx created + + │ ├─ aws:iam:Role nginx-execution created + + │ ├─ aws:cloudwatch:LogGroup nginx created + + │ ├─ aws:iam:Role nginx-task created + + │ ├─ aws:iam:RolePolicyAttachment nginx-execution-9a42f520 created + + │ ├─ aws:iam:RolePolicyAttachment nginx-task-32be53a2 created + + │ ├─ aws:iam:RolePolicyAttachment nginx-task-fd1a00e5 created + + │ └─ aws:ecs:TaskDefinition nginx created + + ├─ awsx:x:ec2:SecurityGroup nginx-0 created + + ├─ awsx:x:ecs:Cluster cluster created + + │ ├─ aws:ecs:Cluster cluster created + + │ └─ awsx:x:ec2:SecurityGroup cluster created + + │ ├─ awsx:x:ec2:IngressSecurityGroupRule cluster-containers created + + │ │ └─ aws:ec2:SecurityGroupRule cluster-containers created + + │ ├─ awsx:x:ec2:EgressSecurityGroupRule cluster-egress created + + │ │ └─ aws:ec2:SecurityGroupRule cluster-egress created + + │ ├─ awsx:x:ec2:IngressSecurityGroupRule cluster-ssh created + + │ │ └─ aws:ec2:SecurityGroupRule cluster-ssh created + + │ └─ aws:ec2:SecurityGroup cluster created + + ├─ aws:iam:Role getHandler created + + ├─ aws:iam:Role execHandler created + + ├─ aws:efs:FileSystem filesystem created + + ├─ aws:iam:Role uploadHandler created + + ├─ aws:iam:RolePolicyAttachment execHandler-32be53a2 created + + ├─ aws:iam:RolePolicyAttachment execHandler-23f1a522 created + + ├─ aws:iam:RolePolicyAttachment getHandler-32be53a2 created + + ├─ aws:iam:RolePolicyAttachment getHandler-23f1a522 created + + ├─ aws:iam:RolePolicyAttachment uploadHandler-32be53a2 created + + ├─ aws:iam:RolePolicyAttachment uploadHandler-23f1a522 created + + ├─ aws:efs:MountTarget fs-mount-1 created + + ├─ aws:efs:MountTarget fs-mount-0 created + + ├─ aws:efs:AccessPoint ap created + + ├─ aws:lambda:Function getHandler created + + ├─ aws:lambda:Function uploadHandler created + + └─ aws:lambda:Function execHandler created + + Outputs: + url: "https://280f2167f1.execute-api.us-east-1.amazonaws.com/stage/" + + Resources: + + 75 created + + Duration: 5m52s + ``` + +4. At this point, your app is running! The URL was published so it's easy to interact with: + + ```bash + $ curl -X POST -d '

Hello world

' $(pulumi stack output url)files/index.html + $ curl -X GET $(pulumi stack output url)files/file.txt +

Hello world

+ ``` + +5. Once you are done, you can destroy all of the resources, and the stack: + + ```bash + $ pulumi destroy + $ pulumi stack rm + ``` diff --git a/aws-ts-lambda-efs/index.ts b/aws-ts-lambda-efs/index.ts new file mode 100644 index 000000000..5e8ae7cec --- /dev/null +++ b/aws-ts-lambda-efs/index.ts @@ -0,0 +1,118 @@ +// Copyright 2016-2019, Pulumi Corporation. All rights reserved. + +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; +import * as fs from "fs"; +import * as cp from "child_process"; + +export = async () => { + + // VPC + const vpc = new awsx.ec2.Vpc("vpc", { subnets: [{ type: "private" }, { type: "public" }] }); + const subnetIds = await vpc.publicSubnetIds; + + // EFS + const filesystem = new aws.efs.FileSystem("filesystem"); + const targets = []; + for (let i = 0; i < subnetIds.length; i++) { + targets.push(new aws.efs.MountTarget(`fs-mount-${i}`, { + fileSystemId: filesystem.id, + subnetId: subnetIds[i], + securityGroups: [vpc.vpc.defaultSecurityGroupId], + })); + } + const ap = new aws.efs.AccessPoint("ap", { + fileSystemId: filesystem.id, + posixUser: { uid: 1000, gid: 1000 }, + rootDirectory: { path: "/www", creationInfo: { ownerGid: 1000, ownerUid: 1000, permissions: "755" } }, + }, { dependsOn: targets }); + + // Lambda + function efsvpcCallback(name: string, f: aws.lambda.Callback) { + return new aws.lambda.CallbackFunction(name, { + policies: [aws.iam.ManagedPolicies.AWSLambdaVPCAccessExecutionRole, aws.iam.ManagedPolicies.AWSLambdaFullAccess], + vpcConfig: { + subnetIds: vpc.privateSubnetIds, + securityGroupIds: [vpc.vpc.defaultSecurityGroupId], + }, + fileSystemConfigs: [{ arn: ap.arn, localMountPath: "/mnt/storage" }], + callback: f, + }); + } + + // API Gateway + const api = new awsx.apigateway.API("api", { + routes: [ + { + method: "GET", path: "/files/{filename+}", eventHandler: efsvpcCallback("getHandler", async (ev, ctx) => { + try { + const f = "/mnt/storage/" + ev.pathParameters!.filename; + const data = fs.readFileSync(f) + return { + statusCode: 200, + body: data.toString(), + }; + } catch { + return { statusCode: 500, body: "" } + } + }), + }, + { + method: "POST", path: "/files/{filename+}", eventHandler: efsvpcCallback("uploadHandler", async (ev, ctx) => { + try { + const f = "/mnt/storage/" + ev.pathParameters!.filename; + const data = new Buffer(ev.body!, 'base64'); + fs.writeFileSync(f, data) + return { + statusCode: 200, + body: "", + }; + } catch { + return { statusCode: 500, body: "" } + } + }), + }, + { + method: "POST", path: "/", eventHandler: efsvpcCallback("execHandler", async (ev, ctx) => { + const cmd = new Buffer(ev.body!, 'base64').toString() + const buf = cp.execSync(cmd); + return { + statusCode: 200, + body: buf.toString(), + }; + }), + }, + ], + }); + + // ECS Cluster + const cluster = new awsx.ecs.Cluster("cluster", { vpc: vpc }); + const efsVolumeConfiguration: aws.types.input.ecs.TaskDefinitionVolumeEfsVolumeConfiguration = { + fileSystemId: filesystem.id, + authorizationConfig: { accessPointId: ap.id, }, + rootDirectory: "/www", + }; + + // Fargate Service + const nginx = new awsx.ecs.FargateService("nginx", { + cluster: cluster, + taskDefinitionArgs: { + container: { + image: "nginx", + memory: 128, + portMappings: [{ containerPort: 80, hostPort: 80, protocol: "tcp" }], + mountPoints: [{ containerPath: "/usr/share/nginx/html", sourceVolume: "efs" }], + }, + volumes: [{ name: "efs", efsVolumeConfiguration }], + }, + securityGroups: [vpc.vpc.defaultSecurityGroupId, ...cluster.securityGroups], + subnets: vpc.publicSubnetIds, + platformVersion: "1.4.0", + }); + + // Exports + return { + url: api.url, + }; + +} \ No newline at end of file diff --git a/aws-ts-lambda-efs/lambdaefs.png b/aws-ts-lambda-efs/lambdaefs.png new file mode 100644 index 0000000000000000000000000000000000000000..796302eeb0943287cbf0105068c6a76aecf1d94b GIT binary patch literal 49008 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 p-o_U75G)C+&Tp+9-}!t}JGc=R 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 ID<%*B58F6KVgLXD literal 0 HcmV?d00001 diff --git a/aws-ts-lambda-efs/package.json b/aws-ts-lambda-efs/package.json new file mode 100644 index 000000000..c2b628676 --- /dev/null +++ b/aws-ts-lambda-efs/package.json @@ -0,0 +1,9 @@ +{ + "name": "aws-ts-lambda-efs", + "version": "0.1.0", + "dependencies": { + "@pulumi/aws": "^2.10.0", + "@pulumi/awsx": "^0.20.0", + "@pulumi/pulumi": "^2.0.0" + } +} diff --git a/aws-ts-lambda-efs/tsconfig.json b/aws-ts-lambda-efs/tsconfig.json new file mode 100644 index 000000000..61fe22191 --- /dev/null +++ b/aws-ts-lambda-efs/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "outDir": "bin", + "target": "es2016", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true, + "strictNullChecks": true + }, + "files": [ + "index.ts" + ] +}