9

I am trying to provision lambda concurrency via CDK. I have a couple of CfnFunctions and I need to provision them.

Provisioning can be done on aliases only. Hence, when I add autoPublishAlias to the CfnFunction, the APIG trigger does not work.

How can the provisioning be achieved (configured) via CDK?

Thanks, Vinod.

John Rotenstein
  • 241,921
  • 22
  • 380
  • 470
user7365614
  • 469
  • 2
  • 4
  • 14

3 Answers3

5

Here is an example in Typescript:

On this site there is an example in typescript: https://github.com/iph/lambda-experiments/blob/master/pc-asg/lib/pc-asg-stack.ts#L33

  1. First create your lambda function;
  2. Create your alias (the version must be recovered from your lambda, through the currentVersion property);
  3. Create a ScalableTarget, in this step you will use information created in the previous steps (functionName and aliasName);
  4. It's very important that you include this line in the target.node.addDependency(alias) code, without that you will get an error, for some reason the cdk when trying to create the ScalableTarget doesn't wait until the alias is created, this line makes it wait for the alias to be created for then, create the ScalableTarget;
  5. Finally configure scaleToTrackMetric with the data to make the provisioned concurrency scale automatically;
  • Thanks man. I had allot of issues to get this to work. target.node.addDependency(alias) was the issue solver. – E. Fortes Nov 25 '20 at 13:13
  • 1
    The OP is asking for provisioned concurrency. Your answer is about autoscaling. These are two different things. – Mehran Jul 18 '22 at 04:45
4

I think I got it:

Java code

package YOURPACKAGENAMEHERE;

import software.amazon.awscdk.core.Construct;
import software.amazon.awscdk.core.Stack;
import java.util.UUID;
import software.amazon.awscdk.core.Duration;
import software.amazon.awscdk.services.lambda.Alias;
import software.amazon.awscdk.services.lambda.AliasProps;
import software.amazon.awscdk.services.lambda.Code;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.lambda.IFunction;
import software.amazon.awscdk.services.lambda.Runtime;
import software.amazon.awscdk.services.lambda.SingletonFunction;
import software.amazon.awscdk.services.lambda.Version;
import software.amazon.awscdk.services.lambda.VersionProps;
import software.amazon.awscdk.services.iam.Role;

public class JavacdexampleStack extends Stack {

    public JavacdexampleStack(final Construct scope, final String id) {
        super(scope, id);

        //create Lambda function
        SingletonFunction lambdaFunction =
        SingletonFunction.Builder.create(this, "cdk-lambda-example")
            .description("Lambda which prints \"I'm running\"")
            .code(Code.fromInline("def main(event, context):\n" + "    print(\"I'm running!\")\n"))
            .handler("index.main")
            .timeout(Duration.seconds(300))
            .runtime(Runtime.PYTHON_3_7)
            .uuid(UUID.randomUUID().toString())
            .role(Role.fromRoleArn(this, "roleId", "arn:aws:iam::111122223333:role/116CD745-C8DA-4569-8058-828EFA93E6D7"))//replace with your execution role or create one in cdk
            .build();

        IFunction lambda = Function.fromFunctionArn(this, "functionId", lambdaFunction.getFunctionArn());

        //create version for alias to be assigned to
        VersionProps versionprop = new VersionProps.Builder()
            .lambda(lambda)
        //assign version which the alias points to with provisioned concurrency
            .provisionedConcurrentExecutions(5)
            .build();

        Version version = new Version(this, "versionId", versionprop);

        //create alias
        AliasProps aliasprops = new AliasProps.Builder()
            .aliasName("YourAliasNameHere")
            .version(version)
            .build();
        Alias alias = new Alias(this,"aliasId", aliasprops);

    }
}

OUTPUT:

provisionedConcurrencyImage

preliminary steps taken

# assumes npm and mvn are installed
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
npm install -g aws-cdk
cdk --version
    # pasting here for visability on which version I used
    1.22.0 (build 309ac1b)

mkdir javacdkexample
cd javacdkexample 
cdk init --language java

# recommended to run after creating the project from docs
# https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_update
mvn versions:use-latest-versions

pom.xml

<dependencies>
    <!-- AWS Cloud Development Kit -->
    <dependency>
        <groupId>software.amazon.awscdk</groupId>
        <artifactId>core</artifactId>
        <version>1.22.0</version>
    </dependency>

    <dependency>
        <groupId>software.amazon.awscdk</groupId>
        <artifactId>lambda</artifactId>
        <version>1.22.0</version>
    </dependency>

    <dependency>
        <groupId>software.amazon.awscdk</groupId>
        <artifactId>events-targets</artifactId>
        <version>1.22.0</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>
</dependencies>
jmp
  • 2,175
  • 2
  • 17
  • 16
1

this is from the official doc: https://docs.aws.amazon.com/cdk/api/latest/docs/aws-lambda-readme.html#autoscaling

cn123h
  • 2,302
  • 1
  • 21
  • 16