in src/AWS.Deploy.Recipes/CdkTemplates/AspNetAppEcsFargate/Generated/Recipe.cs [109:198]
private void ConfigureECSClusterAndService(IRecipeProps<Configuration> recipeConfiguration)
{
if (AppVpc == null)
throw new InvalidOperationException($"{nameof(AppVpc)} has not been set. The {nameof(ConfigureVpc)} method should be called before {nameof(ConfigureECSClusterAndService)}");
var settings = recipeConfiguration.Settings;
if (settings.ECSCluster.CreateNew)
{
EcsCluster = new Cluster(this, nameof(EcsCluster), InvokeCustomizeCDKPropsEvent(nameof(EcsCluster), this, new ClusterProps
{
Vpc = AppVpc,
ClusterName = settings.ECSCluster.NewClusterName
}));
}
else
{
EcsCluster = Cluster.FromClusterAttributes(this, nameof(EcsCluster), InvokeCustomizeCDKPropsEvent(nameof(EcsCluster), this, new ClusterAttributes
{
ClusterArn = settings.ECSCluster.ClusterArn,
ClusterName = ECSFargateUtilities.GetClusterNameFromArn(settings.ECSCluster.ClusterArn),
SecurityGroups = new ISecurityGroup[0],
Vpc = AppVpc
}));
}
AppTaskDefinition = new FargateTaskDefinition(this, nameof(AppTaskDefinition), InvokeCustomizeCDKPropsEvent(nameof(AppTaskDefinition), this, new FargateTaskDefinitionProps
{
TaskRole = AppIAMTaskRole,
Cpu = settings.TaskCpu,
MemoryLimitMiB = settings.TaskMemory,
RuntimePlatform = new RuntimePlatform
{
CpuArchitecture = CpuArchitecture.Of(recipeConfiguration.EnvironmentArchitecture ?? string.Empty)
}
}));
AppLogging = new AwsLogDriver(InvokeCustomizeCDKPropsEvent(nameof(AppLogging), this, new AwsLogDriverProps
{
StreamPrefix = recipeConfiguration.StackName
}));
if (string.IsNullOrEmpty(recipeConfiguration.ECRRepositoryName))
throw new InvalidOrMissingConfigurationException("The provided ECR Repository Name is null or empty.");
EcrRepository = Repository.FromRepositoryName(this, nameof(EcrRepository), recipeConfiguration.ECRRepositoryName);
AppContainerDefinition = AppTaskDefinition.AddContainer(nameof(AppContainerDefinition), InvokeCustomizeCDKPropsEvent(nameof(AppContainerDefinition), this, new ContainerDefinitionOptions
{
Image = ContainerImage.FromEcrRepository(EcrRepository, recipeConfiguration.ECRImageTag),
Logging = AppLogging,
Environment = settings.ECSEnvironmentVariables,
MemoryLimitMiB = settings.TaskMemory
}));
AppContainerDefinition.AddPortMappings(new PortMapping
{
ContainerPort = settings.Port,
Protocol = Amazon.CDK.AWS.ECS.Protocol.TCP
});
WebAccessSecurityGroup = new SecurityGroup(this, nameof(WebAccessSecurityGroup), InvokeCustomizeCDKPropsEvent(nameof(WebAccessSecurityGroup), this, new SecurityGroupProps
{
Vpc = AppVpc,
SecurityGroupName = $"{recipeConfiguration.StackName}-ECSService"
}));
EcsServiceSecurityGroups = new List<ISecurityGroup>();
EcsServiceSecurityGroups.Add(WebAccessSecurityGroup);
if (settings.AdditionalECSServiceSecurityGroups.Any())
{
var count = 1;
foreach (var securityGroupId in settings.AdditionalECSServiceSecurityGroups)
{
EcsServiceSecurityGroups.Add(SecurityGroup.FromSecurityGroupId(this, $"AdditionalGroup-{count++}", securityGroupId.Trim(), new SecurityGroupImportOptions
{
Mutable = false
}));
}
}
AppFargateService = new FargateService(this, nameof(AppFargateService), InvokeCustomizeCDKPropsEvent(nameof(AppFargateService), this, new FargateServiceProps
{
Cluster = EcsCluster,
TaskDefinition = AppTaskDefinition,
DesiredCount = settings.DesiredCount,
ServiceName = settings.ECSServiceName,
AssignPublicIp = settings.Vpc.IsDefault,
SecurityGroups = EcsServiceSecurityGroups.ToArray()
}));
}