internal CdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var vpc = new Vpc(this, "MyVpc", new VpcProps { MaxAzs = 2 // Default is all AZs in region }); var cluster = new Cluster(this, "MyCluster", new ClusterProps { Vpc = vpc }); // Create a load-balanced Fargate service and make it public new ApplicationLoadBalancedFargateService(this, "MyFargateService", new ApplicationLoadBalancedFargateServiceProps { Cluster = cluster, // Required DesiredCount = 2, // Default is 1 TaskImageOptions = new ApplicationLoadBalancedTaskImageOptions { Image = ContainerImage.FromAsset(".") }, MemoryLimitMiB = 1024, // Default is 256 PublicLoadBalancer = true // Default is false } ); }
public FargateStack(Construct scope, string id, FargateStackProps props = null) : base(scope, id, props) { var cluster = new Cluster(this, "WhatDayOfWeekCluster", new ClusterProps { Vpc = props.Vpc }); var logging = new AwsLogDriver(new AwsLogDriverProps() { StreamPrefix = "WhatDayOfWeek", LogRetention = Amazon.CDK.AWS.Logs.RetentionDays.ONE_DAY }); //container /* * var repo = Repository.FromRepositoryName(this, "myrepo","MyRepositoryName"); * * var containerOptions = new ContainerDefinitionOptions * { * Image = ContainerImage.FromEcrRepository(repo) * }; */ // to build the container image from the app in the local folder, replace lines 29-35 with //var rootDirectory = Directory.GetCurrentDirectory(); //var path = Path.GetFullPath(Path.Combine(rootDirectory, @"App/WhatDayOfWeek")); var containerOptions = new ContainerDefinitionOptions { Image = ContainerImage.FromAsset(@"App/WhatDayOfWeek"), Logging = logging }; var portMapping = new PortMapping() { ContainerPort = 80, HostPort = 80 }; var taskDef = new FargateTaskDefinition(this, "WhatDayOfWeekTaskDefinition"); taskDef.AddContainer("WhatDayOfWeekContainer", containerOptions).AddPortMappings(portMapping); var serviceProps = new ApplicationLoadBalancedFargateServiceProps() { ServiceName = "WhatDayOfWeekService", MemoryLimitMiB = 512, Cpu = 256, TaskDefinition = taskDef, Cluster = cluster }; ApplicationLoadBalancedFargateService service = new ApplicationLoadBalancedFargateService(this, "WhatDayOfWeekService", serviceProps); }
public PingPongServices(Construct scope, string id, PingPongServicesProps props) : base(scope, id) { var pingImage = ContainerImage.FromAsset($"ping-service"); var pongImage = ContainerImage.FromAsset($"pong-service"); var envoyImage = ContainerImage.FromRegistry($"840364872350.dkr.ecr.{props.Env.Region}.amazonaws.com/aws-appmesh-envoy:v1.12.3.0-prod"); // TODO: Maybe just create this role here as part of the stack. I think it gets created with the ECS cluster automatically. var taskExecRole = Role.FromRoleArn(this, "task-execution-role", $"arn:aws:iam::{props.Env.Account}:role/ecsTaskExecutionRole"); var pingService = new PingPongServiceConstruct(this, $"{id}_ping-master", new PingPongServiceConstructProps() { ServiceContainerImage = pingImage, EnvoyImage = envoyImage, TaskExecutionRole = taskExecRole, ServiceName = "ping", Branch = "master", Mesh = props.Mesh, CloudmapNamespace = props.CloudmapNamespace, VirturalNodeName = $"ping-service-master-node", Cluster = props.Cluster, Vpc = props.Vpc, Backends = new VirtualService[] { props.PongVirtualService }, VirtualRouter = props.PingVirtualRouter, RoutePriority = 0 }); var pongMasterService = new PingPongServiceConstruct(this, $"{id}_pong-master", new PingPongServiceConstructProps() { ServiceContainerImage = pongImage, EnvoyImage = envoyImage, TaskExecutionRole = taskExecRole, ServiceName = "pong", Branch = "master", Mesh = props.Mesh, CloudmapNamespace = props.CloudmapNamespace, VirturalNodeName = $"pong-service-master-node", Cluster = props.Cluster, Vpc = props.Vpc, Backends = new VirtualService[] { }, VirtualRouter = props.PongVirtualRouter, RoutePriority = 2 }); var pongBranchService = new PingPongServiceConstruct(this, $"{id}_pong-testbranch", new PingPongServiceConstructProps() { ServiceContainerImage = pongImage, EnvoyImage = envoyImage, TaskExecutionRole = taskExecRole, ServiceName = "pong", Branch = "testbranch", Mesh = props.Mesh, CloudmapNamespace = props.CloudmapNamespace, VirturalNodeName = $"pong-service-testbranch-node", Cluster = props.Cluster, Vpc = props.Vpc, Backends = new VirtualService[] { }, VirtualRouter = props.PongVirtualRouter, RoutePriority = 1 }); }
public ContainersStack(Construct parent, string id, IStackProps props) : base(parent, id, props) { var vpc = Vpc.FromLookup(this, id = "DefaultVpc", new VpcLookupOptions { IsDefault = true }); if (vpc == null) { throw new System.NullReferenceException($"Unable to determine default VPC in region {this.Region}"); } var cluster = new Cluster(this, "Cluster", new ClusterProps { Vpc = vpc }); var taskDef = new FargateTaskDefinition(this, "FargateTaskDefinition"); var currentDir = Directory.GetCurrentDirectory(); var path = Path.GetFullPath(Path.Combine(currentDir, @"dotnetapp/")); var containerOptions = new ContainerDefinitionOptions { Image = ContainerImage.FromAsset("dotnetapp") }; var portMapping = new PortMapping() { ContainerPort = 80, HostPort = 80 }; taskDef.AddContainer("Container", containerOptions).AddPortMappings(portMapping); var serviceProps = new ApplicationLoadBalancedFargateServiceProps() { MemoryLimitMiB = 512, Cpu = 256, TaskDefinition = taskDef }; ApplicationLoadBalancedFargateService service = new ApplicationLoadBalancedFargateService(this, "DotnetFargateApp", serviceProps); }
internal FargateStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Create VPC var vpc = new Vpc(this, "SampleVpc", new VpcProps { MaxAzs = 2 }); // Create ECS cluster var cluster = new Cluster(this, "SampleCluster", new ClusterProps { Vpc = vpc }); var taskDef = new FargateTaskDefinition(this, "FargateTaskDefinition"); // Build container image from local assets var containerOptions = new ContainerDefinitionOptions { Image = ContainerImage.FromAsset("webapp") }; var portMapping = new PortMapping() { ContainerPort = 80, HostPort = 80 }; taskDef .AddContainer("Container", containerOptions) .AddPortMappings(portMapping); // Create Fargate Service behind Application Load Balancer new ApplicationLoadBalancedFargateService(this, "DotnetFargateSampleApp", new ApplicationLoadBalancedFargateServiceProps() { Cluster = cluster, MemoryLimitMiB = 512, Cpu = 256, TaskDefinition = taskDef }); }
public AppStack(Construct parent, string id, IStackProps props) : base(parent, id, props) { var cluster = new Cluster(this, "AppCluster", new ClusterProps { Vpc = Vpc.FromLookup(this, "DefaultVpc", new VpcLookupOptions() { IsDefault = true }), }); new ApplicationLoadBalancedFargateService(this, "AppService", new ApplicationLoadBalancedFargateServiceProps { Cluster = cluster, DesiredCount = 1, TaskImageOptions = new ApplicationLoadBalancedTaskImageOptions { Image = ContainerImage.FromAsset(DockerFolderBuilder.GetBuildFolder(), new AssetImageProps() { File = Path.Combine("DockerProject1", "Dockerfile") }), TaskRole = new Role(this, "AppRole", new RoleProps() { RoleName = "AppRole", AssumedBy = new ServicePrincipal("ecs-tasks.amazonaws.com"), ManagedPolicies = new IManagedPolicy[] { ManagedPolicy.FromAwsManagedPolicyName("TranslateFullAccess"), ManagedPolicy.FromAwsManagedPolicyName("AmazonS3FullAccess"), } }) }, MemoryLimitMiB = 2048, // Default is 256 PublicLoadBalancer = true, // Default is false AssignPublicIp = true, } ); }
public ContainersStack(Construct parent, string id, IStackProps props) : base(parent, id, props) { // The code that defines your stack goes here var vpc = new Vpc(this, "VPC"); var cluster = new Cluster(this, "Cluster", new ClusterProps { Vpc = vpc }); var taskDef = new FargateTaskDefinition(this, "FargateTaskDefinition"); var rootDirectory = Directory.GetCurrentDirectory(); var path = Path.GetFullPath(Path.Combine(rootDirectory, @"dotnetapp/")); var containerOptions = new ContainerDefinitionOptions { Image = ContainerImage.FromAsset("dotnetapp") }; var portMapping = new PortMapping() { ContainerPort = 80, HostPort = 80 }; taskDef.AddContainer("Container", containerOptions).AddPortMappings(portMapping); var serviceProps = new ApplicationLoadBalancedFargateServiceProps() { MemoryLimitMiB = 512, Cpu = 256, TaskDefinition = taskDef }; ApplicationLoadBalancedFargateService service = new ApplicationLoadBalancedFargateService(this, "DotnetFargateApp", serviceProps); }
internal Example3Stack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var vpcStack = new VpcStack(this, "someTestVpc"); var cluster = new Cluster(this, "WhatDayOfWeekCluster", new ClusterProps { Vpc = vpcStack.Vpc }); var taskDef = new FargateTaskDefinition(this, "WhatDayOfWeekTaskDefinition"); var rootDirectory = Directory.GetCurrentDirectory(); var path = Path.GetFullPath(Path.Combine(rootDirectory, @"App/WhatDayOfWeek")); var containerOptions = new ContainerDefinitionOptions { Image = ContainerImage.FromAsset("App/WhatDayOfWeek") }; var portMapping = new PortMapping() { ContainerPort = 80, HostPort = 80 }; taskDef.AddContainer("WhatDayOfWeekContainer", containerOptions).AddPortMappings(portMapping); var serviceProps = new ApplicationLoadBalancedFargateServiceProps() { MemoryLimitMiB = 512, Cpu = 256, TaskDefinition = taskDef }; ApplicationLoadBalancedFargateService service = new ApplicationLoadBalancedFargateService(this, "WhatDayOfWeekApp", serviceProps); }
internal CdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var vpc = new Vpc(this, "api-vpc", new VpcProps { MaxAzs = 3 // Default is all AZs in region }); var cluster = new Cluster(this, "api-ecs-cluster", new ClusterProps { Vpc = vpc, }); var task = new FargateTaskDefinition(this, "api-fargate-task", new FargateTaskDefinitionProps() { Cpu = 256, MemoryLimitMiB = 512 }); var logGroup = new LogGroup(this, "loggroup-containers", new LogGroupProps() { Retention = RetentionDays.ONE_MONTH }); var nginxContainer = new ContainerDefinition(this, "container-nginx", new ContainerDefinitionProps() { TaskDefinition = task, Image = ContainerImage.FromAsset("../Web/Nginx", new AssetImageProps() { File = "Nginx.Dockerfile" }), PortMappings = new[] { new PortMapping() { HostPort = 80, ContainerPort = 80, Protocol = Protocol.TCP } }, Essential = true, Environment = new Dictionary<string, string>() { { "WEB_HOST", "127.0.0.1" } }, Logging = new AwsLogDriver(new AwsLogDriverProps() { LogGroup = logGroup, StreamPrefix = "nginx" }) }); var apiContainer = new ContainerDefinition(this, "container-api", new ContainerDefinitionProps() { TaskDefinition = task, Image = ContainerImage.FromAsset("../Web/Mvc", new AssetImageProps() { File = "Mvc.Dockerfile" }), PortMappings = new[] { new PortMapping() { HostPort = 5000, ContainerPort = 5000, Protocol = Protocol.TCP } }, Essential = true, Logging = new AwsLogDriver(new AwsLogDriverProps() { LogGroup = logGroup, StreamPrefix = "web" }) }); // Create a load-balanced Fargate service and make it public new ApplicationLoadBalancedFargateService(this, "api-fargate-loadbalancer", new ApplicationLoadBalancedFargateServiceProps { Cluster = cluster, // Required // DesiredCount = 6, // Default is 1 // TaskDefinition or TaskImageOptions must be specified, but not both. TaskDefinition = task, // MemoryLimitMiB = 2048, // Default is 256 PublicLoadBalancer = true // Default is false } ); }
internal CreditoWebApiStack(Construct scope, string id, CustomStackProps props = null) : base(scope, id, props) { var vpc = props.Vpc; var creditoWebApiTargetGroup = new ApplicationTargetGroup(this, "CreditoWebApiTargetGroup", new ApplicationTargetGroupProps { Protocol = ApplicationProtocol.HTTP, Port = 80, Vpc = vpc, TargetType = TargetType.IP, DeregistrationDelay = Duration.Seconds(60), HealthCheck = new Amazon.CDK.AWS.ElasticLoadBalancingV2.HealthCheck { Enabled = true, Path = "/api/credito/_monitor/shallow", Protocol = Amazon.CDK.AWS.ElasticLoadBalancingV2.Protocol.HTTP, Port = "traffic-port", UnhealthyThresholdCount = 2, Interval = Duration.Seconds(60), HealthyThresholdCount = 5, Timeout = Duration.Seconds(5), HealthyHttpCodes = "200" } }); var webApiServiceSecurityGroup = SecurityGroup.FromSecurityGroupId(this, "WebApiServiceSecurityGroup", Fn.ImportValue(Globals.GetDeployEnvironment(this).PutEnvNamePrefixWithDash("WebApiServiceSecurityGroupId"))); var appListener = ApplicationListener.FromApplicationListenerAttributes(this, "AppListener", new ApplicationListenerAttributes { ListenerArn = Fn.ImportValue(Globals.GetDeployEnvironment(this).PutEnvNamePrefixWithDash("AppListenerArn")), SecurityGroup = webApiServiceSecurityGroup }); appListener.AddTargetGroups("CreditoWebApiTargetGroup", new AddApplicationTargetGroupsProps { Conditions = new ListenerCondition[] { ListenerCondition.PathPatterns(new string[] { "/api/credito*" }) }, Priority = 100, TargetGroups = new ApplicationTargetGroup[] { creditoWebApiTargetGroup } }); var creditoWebApiLogGroup = new LogGroup(this, "CreditoWebApiContainerLogGroup", new LogGroupProps { LogGroupName = $"/ecs/{Globals.GetDeployEnvironment(this).EnvName}/credito/web-api", Retention = RetentionDays.FIVE_DAYS, RemovalPolicy = RemovalPolicy.SNAPSHOT }); var creditoWebApiTaskDefinition = new FargateTaskDefinition(this, "CreditoWebApiTaskDefinition", new FargateTaskDefinitionProps { MemoryLimitMiB = 512, Cpu = 256 }); var creditoWebApiLogging = new AwsLogDriver( new AwsLogDriverProps { StreamPrefix = "ecs", LogGroup = creditoWebApiLogGroup }); var creditoWebApiContainer = creditoWebApiTaskDefinition.AddContainer("CreditoWebApiContainer", new ContainerDefinitionOptions { Image = ContainerImage.FromAsset( Directory.GetCurrentDirectory(), new AssetImageProps { File = "src/Credito.WebApi/Dockerfile" }), Logging = creditoWebApiLogging, Environment = new Dictionary <string, string>() { ["CreditoDatabase__ConnectionString"] = StringParameter.ValueFromLookup( this, $"/{Globals.GetDeployEnvironment(this).EnvName}/credito/web-api/db/connection-string"), ["CreditoDatabase__DatabaseName"] = StringParameter.ValueFromLookup( this, $"/{Globals.GetDeployEnvironment(this).EnvName}/credito/web-api/db/database-name") } }); creditoWebApiContainer.AddPortMappings( new PortMapping { ContainerPort = 80, HostPort = 80, Protocol = Amazon.CDK.AWS.ECS.Protocol.TCP }); var cluster = Cluster.FromClusterAttributes(this, "Cluster", new ClusterAttributes { ClusterName = Fn.ImportValue(Globals.GetDeployEnvironment(this).PutEnvNamePrefixWithDash("ClusterName")), Vpc = vpc, SecurityGroups = new SecurityGroup[] { } }); var creditoWebApiService = new FargateService(this, "CreditoWebApiService", new FargateServiceProps { Cluster = cluster, TaskDefinition = creditoWebApiTaskDefinition, DesiredCount = 1, CircuitBreaker = new DeploymentCircuitBreaker { Rollback = true }, AssignPublicIp = false, HealthCheckGracePeriod = Duration.Seconds(60), SecurityGroups = new ISecurityGroup[] { webApiServiceSecurityGroup }, VpcSubnets = new SubnetSelection { SubnetType = SubnetType.PRIVATE } }); creditoWebApiService.AttachToApplicationTargetGroup(creditoWebApiTargetGroup); }
internal CdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // The code that defines your stack goes here var vpc = new Vpc(this, "api-vpc", new VpcProps { MaxAzs = 3 // Default is all AZs in region }); //https://garbe.io/blog/2019/09/20/hey-cdk-how-to-use-existing-resources/ // const vpc = Vpc.fromLookup(this, 'MyExistingVPC', { isDefault: true }); // new cdk.CfnOutput(this, "MyVpc", {value: vpc.vpcId }); var cluster = new Cluster(this, "api-ecs-cluster", new ClusterProps { Vpc = vpc }); var task = new FargateTaskDefinition(this, "api-fargate-task", new FargateTaskDefinitionProps() { Cpu = 256, MemoryLimitMiB = 512 }); var logGroup = new LogGroup(this, "loggroup-containers", new LogGroupProps() { Retention = RetentionDays.ONE_MONTH }); var nginxContainer = new ContainerDefinition(this, "container-nginx", new ContainerDefinitionProps() { TaskDefinition = task, Image = ContainerImage.FromAsset("../Api/Nginx", new AssetImageProps() { File = "Nginx.Dockerfile" }), PortMappings = new[] { new PortMapping() { HostPort = 80, ContainerPort = 80, Protocol = Protocol.TCP } }, Essential = true, Environment = new Dictionary <string, string>() { { "API_HOST", "127.0.0.1" } }, Logging = new AwsLogDriver(new AwsLogDriverProps() { LogGroup = logGroup, StreamPrefix = "nginx" }) }); var apiContainer = new ContainerDefinition(this, "container-api", new ContainerDefinitionProps() { TaskDefinition = task, Image = ContainerImage.FromAsset("../Api/Api", new AssetImageProps() { File = "Api.Dockerfile" }), PortMappings = new[] { new PortMapping() { HostPort = 5000, ContainerPort = 5000, Protocol = Protocol.TCP } }, Essential = true, Logging = new AwsLogDriver(new AwsLogDriverProps() { LogGroup = logGroup, StreamPrefix = "api" }) }); // Create a load-balanced Fargate service and make it public new ApplicationLoadBalancedFargateService(this, "api-fargate-loadbalancer", new ApplicationLoadBalancedFargateServiceProps { Cluster = cluster, // Required // DesiredCount = 6, // Default is 1 // TaskDefinition or TaskImageOptions must be specified, but not both. TaskDefinition = task, // MemoryLimitMiB = 2048, // Default is 256 PublicLoadBalancer = true // Default is false } ); }
public DevStack(Construct parent, string id, IStackProps props) : base(parent, id, props) { var cluster = new Cluster(this, "AppCluster", new ClusterProps { Vpc = Vpc.FromLookup(this, "DefaultVpc", new VpcLookupOptions() { IsDefault = true }), }); FargateTaskDefinition taskDef = new FargateTaskDefinition(this, "DevStackTaskDef", new FargateTaskDefinitionProps() { }); var mysqlContainer = taskDef.AddContainer("mysql", new ContainerDefinitionProps() { Image = ContainerImage.FromAsset(DockerFolderBuilder.GetBuildFolder(), new AssetImageProps() { File = Path.Combine("LocalStack", "Dockerfile.mysql") }) }); mysqlContainer.AddPortMappings(new PortMapping() { HostPort = 3306, ContainerPort = 3306, Protocol = Amazon.CDK.AWS.ECS.Protocol.TCP }); var mongoContainer = taskDef.AddContainer("mongodb", new ContainerDefinitionProps() { Image = ContainerImage.FromAsset(DockerFolderBuilder.GetBuildFolder(), new AssetImageProps() { File = Path.Combine("LocalStack", "Dockerfile.mongo") }) }); mongoContainer.AddPortMappings(new PortMapping() { HostPort = 27017, ContainerPort = 27017, Protocol = Amazon.CDK.AWS.ECS.Protocol.TCP }); var localStackContainer = taskDef.AddContainer("localstack", new ContainerDefinitionProps() { Image = ContainerImage.FromAsset(DockerFolderBuilder.GetBuildFolder(), new AssetImageProps() { File = Path.Combine("LocalStack", "Dockerfile.localstack") }) }); localStackContainer.AddPortMappings(new PortMapping() { HostPort = 4572, ContainerPort = 4572, Protocol = Amazon.CDK.AWS.ECS.Protocol.TCP }); localStackContainer.AddPortMappings(new PortMapping() { HostPort = 4576, ContainerPort = 4576, Protocol = Amazon.CDK.AWS.ECS.Protocol.TCP }); localStackContainer.AddPortMappings(new PortMapping() { HostPort = 4584, ContainerPort = 4584, Protocol = Amazon.CDK.AWS.ECS.Protocol.TCP }); var schemabuilder = taskDef.AddContainer("schemaBuilder", new ContainerDefinitionProps() { Image = ContainerImage.FromAsset(DockerFolderBuilder.GetBuildFolder(), new AssetImageProps() { File = Path.Combine("LocalStack", "Dockerfile") }) }); schemabuilder.AddContainerDependencies(new ContainerDependency[] { new ContainerDependency() { Container = mysqlContainer, Condition = ContainerDependencyCondition.START }, new ContainerDependency() { Container = mongoContainer, Condition = ContainerDependencyCondition.START }, new ContainerDependency() { Container = localStackContainer, Condition = ContainerDependencyCondition.START } }); // Create a load-balanced Fargate service and make it public new ApplicationLoadBalancedFargateService(this, "DevStackService", new ApplicationLoadBalancedFargateServiceProps { Cluster = cluster, // Required DesiredCount = 1, TaskDefinition = taskDef, MemoryLimitMiB = 2048, // Default is 256 PublicLoadBalancer = true, // Default is false AssignPublicIp = true } ); }
internal StepFunctionDemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { Bucket stepFunctionDemoBucket = new Bucket(this, "StepFunctionDemoBucket", new BucketProps { Encryption = BucketEncryption.S3_MANAGED, RemovalPolicy = RemovalPolicy.RETAIN }); Table stepFunctionDemoTable = new Table(this, "StepFunctionDemoTable", new TableProps { BillingMode = BillingMode.PROVISIONED, PartitionKey = new Amazon.CDK.AWS.DynamoDB.Attribute { Name = "Id", Type = AttributeType.STRING }, RemovalPolicy = RemovalPolicy.DESTROY }); //Step Function invoking Lambda function Function invokeOddEvenStepFunction = new Function(this, "InvokeOddEvenStepFunction", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::InvokeOddEvenStepFunction", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Lambda Function that invokes the Demo Step Function", }); //Function to calculate Odd or Even Function oddOrEvenFunction = new Function(this, "OddOrEvenFunction", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::OddOrEvenFunction", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Lambda Function that calculates odd or even", }); //Demo Lambda to perform Process 1 Function process1Function = new Function(this, "Process1Function", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::Process1Function", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Demo Lambda Function that runs process1", }); Function processAFunction = new Function(this, "ProcessAFunction", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::Process1Function", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Demo Lambda Function that runs process1", }); //Demo Lambda to perform Process 2 Function process2Function = new Function(this, "Process2Function", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::Process2Function", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Demo Lambda Function that runs process2", }); //Demo Lambda to perform Process 1 Function process11Function = new Function(this, "Process11Function", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::Process11Function", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Demo Lambda Function that runs job process1", }); //Demo Lambda to perform Process 2 Function process12Function = new Function(this, "Process12Function", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::Process12Function", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Demo Lambda Function that runs job process2", }); Function taskTokenExecutorFunction = new Function(this, "TaskTokenExecutorFunction", new FunctionProps { Runtime = Runtime.DOTNET_CORE_3_1, Code = Code.FromAsset("src/Demo.Services.Lambda/bin/Release/netcoreapp3.1/Demo.Services.Lambda.zip"), Handler = "Demo.Services.Lambda::Demo.Services.Lambda.Functions::TaskTokenExecutor", Timeout = Duration.Minutes(5), MemorySize = 512, Description = "Demo Lambda Function that executes Task Token Step", Environment = new Dictionary <string, string>() { ["STEP_FUNCTION_DEMO_BUCKET"] = stepFunctionDemoBucket.BucketName } }); stepFunctionDemoBucket.GrantReadWrite(taskTokenExecutorFunction); var oddEvenFunction = new Task(this, "OddEvenFunction", new TaskProps { Task = new InvokeFunction(oddOrEvenFunction.LatestVersion) }); var process1 = new Task(this, "Process1", new TaskProps { Task = new InvokeFunction(process1Function.LatestVersion) }); var processA = new Task(this, "ProcessA", new TaskProps { Task = new InvokeFunction(processAFunction.LatestVersion) }); var process2 = new Task(this, "Process2", new TaskProps { Task = new InvokeFunction(process2Function.LatestVersion) }); var process11 = new Task(this, "Process11", new TaskProps { Task = new InvokeFunction(process11Function.LatestVersion), ResultPath = "$.Resolved" }); var process12 = new Task(this, "Process12", new TaskProps { Task = new InvokeFunction(process12Function.LatestVersion) }); var taskTokenExecutor = new Task(this, "TaskTokenExecutor", new TaskProps { Task = new RunLambdaTask(taskTokenExecutorFunction.LatestVersion, new RunLambdaTaskProps() { IntegrationPattern = ServiceIntegrationPattern.WAIT_FOR_TASK_TOKEN, Payload = TaskInput.FromContextAt("$$.Task.Token") }), Parameters = new Dictionary <string, object> { ["Payload"] = new Dictionary <string, object> { ["TaskToken.$"] = "$$.Task.Token", ["State.$"] = "$" } } }); //Choice to go to Process 1 or Process 2 based on input number is odd or even. var isEven = new Choice(this, "Is the number Even?"); var isResolvedOrOverriden = new Choice(this, "Is Resolved Or Overriden?"); //var chain1 = Chain.Start(oddEvenFunction) // .Next(isEven // .When( // Condition.StringEquals("$.Result", "Even"), // Chain.Start(process1) // .Next(process11) // .Next(isResolvedOrOverriden // .When( // Condition.Or( // new[] // { // Condition.BooleanEquals("$.Resolved", true), // Condition.BooleanEquals("$.Override", true) // }), process12) // .Otherwise(process2))) // .When(Condition.StringEquals("$.Result", "Odd"), process2)); var chain1 = Chain.Start(oddEvenFunction) .Next(isEven .When( Condition.StringEquals("$.Result", "Even"), Chain.Start(process1) .Next(taskTokenExecutor) .Next(isResolvedOrOverriden .When( Condition.Or( new[] { Condition.BooleanEquals("$.Resolved", true), Condition.BooleanEquals("$.Override", true) }), process12) .Otherwise(process2))) .When(Condition.StringEquals("$.Result", "Odd"), process2)); //State Machine var stateMachine = new StateMachine(this, "JobDemoStateMachine", new StateMachineProps { StateMachineName = "JobDemoStateMachine", Timeout = Duration.Minutes(5), Definition = chain1 }); stateMachine.Role?.AddManagedPolicy(ManagedPolicy.FromManagedPolicyArn(this, "DynamoDBFullAccessForStepFunction", "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess")); stateMachine.Role?.AddManagedPolicy(ManagedPolicy.FromManagedPolicyArn(this, "LambdaFullAccessForStepFunction", "arn:aws:iam::aws:policy/AWSLambdaFullAccess")); var demofargateTask1 = new FargateTaskDefinition(this, "demoECSTask1Definition", new FargateTaskDefinitionProps { MemoryLimitMiB = 4096, Cpu = 2048 }); var demofargateTask2 = new FargateTaskDefinition(this, "demoECSTask2Definition", new FargateTaskDefinitionProps { MemoryLimitMiB = 4096, Cpu = 2048 }); stepFunctionDemoBucket.GrantReadWrite(demofargateTask2.TaskRole); IVpc publicVpc = Vpc.FromLookup(this, "PublicVPC", new VpcLookupOptions { Tags = new Dictionary <string, string> { ["Paces:VpcType"] = "Public" } }); var cluster = Cluster.FromClusterAttributes(this, "PublicCluster", new ClusterAttributes { ClusterName = "OHC-PACES", Vpc = publicVpc, SecurityGroups = new[] { SecurityGroup.FromSecurityGroupId(this, "SecurityGroup", "sg-0a1bab8166d8fb715") } }); var container1 = demofargateTask1.AddContainer("app", new ContainerDefinitionOptions { Image = ContainerImage.FromAsset(".", new AssetImageProps { File = "Dockerfile" }), Logging = LogDriver.AwsLogs(new AwsLogDriverProps { LogGroup = new LogGroup(this, "demoECSTask1LogGroup", new LogGroupProps { LogGroupName = "/ecs/demoECSTask1-" + RandomString.Generate(10, StackId), }), StreamPrefix = "logs" }), }); var container2 = demofargateTask2.AddContainer("app", new ContainerDefinitionOptions { Image = ContainerImage.FromAsset(".", new AssetImageProps { File = "Dockerfile.1" }), Environment = new Dictionary <string, string> { ["STEP_FUNCTION_DEMO_BUCKET"] = stepFunctionDemoBucket.BucketName }, Logging = LogDriver.AwsLogs(new AwsLogDriverProps { LogGroup = new LogGroup(this, "demoECSTask2LogGroup", new LogGroupProps { LogGroupName = $"/ecs/demoECSTask2-{RandomString.Generate(10, StackId)}", }), StreamPrefix = "logs" }) }); Rule rule = new Rule(this, "DemoJobRule", new RuleProps { Schedule = Schedule.Cron(new CronOptions { Day = "*", Hour = "*", Minute = "1", Month = "*", Year = "*" }), Description = "Runs demo job fargate task", Targets = new IRuleTarget[] { new EcsTask( new EcsTaskProps { Cluster = cluster, TaskDefinition = demofargateTask2, SubnetSelection = new SubnetSelection { OnePerAz = true } }) } }); //var ecsTask1 = new Task(this, "ecsTask1", new TaskProps //{ // InputPath = "$", // Task = new CustomTask(new RunEcsFargateTaskProps // { // Cluster = Cluster.FromClusterAttributes(this, "PublicCluster", new ClusterAttributes // { // ClusterName = "OHC-PACES", // Vpc = publicVpc, // SecurityGroups = new[] { SecurityGroup.FromSecurityGroupId(this, "SecurityGroup", "sg-0a1bab8166d8fb715") } // }), // TaskDefinition = fargateTask1, // ContainerOverrides = new[] // { // new ContainerOverride // { // ContainerDefinition = container, // Command = new []{"$.Data"} // }, // } // }) //}); var ecsTask1 = new Task(this, "EcsTask1", new TaskProps { InputPath = "$", Task = new RunEcsFargateTask(new RunEcsFargateTaskProps { Cluster = cluster, TaskDefinition = demofargateTask1, //ContainerOverrides = new[] //{ // new ContainerOverride // { // ContainerDefinition = container, // // }, //} }), Parameters = new Dictionary <string, object> { ["Overrides"] = new Dictionary <string, object> { ["ContainerOverrides"] = new Dictionary <string, string>[] { new Dictionary <string, string> { ["Name"] = "app", ["Command.$"] = "$.ECSPayload" } } } } }); var chain2 = Chain.Start(processA).Next(ecsTask1); var stateMachineWithTask = new StateMachine(this, "JobDemoStateMachine-1", new StateMachineProps { StateMachineName = "JobDemoStateMachine-1", Timeout = Duration.Minutes(15), Definition = chain2, Role = Role.FromRoleArn(this, "StateMachineWithTaskRole", "arn:aws:iam::342600918501:role/service-role/PacesEdi274DefaultStateMachineRole") }); //All Policies // 1. Invoke function policies invokeOddEvenStepFunction.Role?.AddManagedPolicy(ManagedPolicy.FromManagedPolicyArn(this, "InvokeLambdaPolicy", "arn:aws:iam::aws:policy/AWSLambdaFullAccess")); var policyStatement = new PolicyStatement { Sid = "CanInvokeStepFunctions", Effect = Effect.ALLOW }; policyStatement.AddActions(new[] { "states:StartExecution" }); invokeOddEvenStepFunction.AddToRolePolicy(policyStatement); policyStatement.AddResources(stateMachine.StateMachineArn); invokeOddEvenStepFunction.AddEnvironment(Functions.StateMachineArnKey, stateMachine.StateMachineArn); process12Function.AddEnvironment(Functions.StepFunctionDemoBucketKey, stepFunctionDemoBucket.BucketName); stepFunctionDemoBucket.GrantReadWrite(process12Function); var policyStatementDemofargateTask2 = new PolicyStatement { Sid = "CanNotifyStepFunction", Effect = Effect.ALLOW }; policyStatementDemofargateTask2.AddActions(new[] { "states:SendTask*" }); demofargateTask2.AddToExecutionRolePolicy(policyStatementDemofargateTask2); demofargateTask2.AddToTaskRolePolicy(policyStatementDemofargateTask2); policyStatementDemofargateTask2.AddAllResources(); }