From caa84be50d4bb12d01ad2404a176527a2264db87 Mon Sep 17 00:00:00 2001 From: aws-sdk-dotnet-automation Date: Tue, 5 Jul 2022 17:50:36 +0000 Subject: [PATCH 01/14] build: version bump to 1.1 --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 3d784fe69..ea546f012 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "1.0", + "version": "1.1", "publicReleaseRefSpec": [ ".*" ], From 8e21755545fac2f69a4a0eb2ff71377dba755f51 Mon Sep 17 00:00:00 2001 From: Alex Shovlin Date: Sun, 10 Jul 2022 19:36:55 -0400 Subject: [PATCH 02/14] docs: Remove placeholders for future content --- site/content/docs/cicd.md | 4 ---- site/content/docs/project.md | 7 ++----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/site/content/docs/cicd.md b/site/content/docs/cicd.md index 08d14d46d..e49292bf3 100644 --- a/site/content/docs/cicd.md +++ b/site/content/docs/cicd.md @@ -14,10 +14,6 @@ To specify the services to deploy and their configurations for your environment, Storing deployment settings in a JSON file also allows those settings to be version controlled. -This section defines the JSON definitions and syntax that you construct and use a deployment settings file. - -TODO - ### Invoking from CI/CD The `--apply` switch on deploy command allows you to specify a deployment settings file. diff --git a/site/content/docs/project.md b/site/content/docs/project.md index 6a6ca2422..487c4ccf9 100644 --- a/site/content/docs/project.md +++ b/site/content/docs/project.md @@ -29,14 +29,11 @@ The `AppStack class` is the recommended place to add new AWS resources or custom > Note: Most of the code is located in the generated folder. We don’t recommend you edit the files in there directly, and instead use it for reference. If you want to take updates from the original recipe the deployment project was created from, you can just copy the code into the generated folder. -In the example below, we’ll show you how to add a DynamoDB table.... - -TODO ### Customizing deployment settings -You can also add new settings that will be presented to the user during deployment. +You can also add new settings that will be presented to the user during deployment. Modify the generated `.recipe` file to correspond to the changes you made to the CDK project. -TODO +The schema for the recipe file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json). ### Specifying external project From 180259f8daecfd763bcf1b2b8f61c8fb66e5a8bc Mon Sep 17 00:00:00 2001 From: Alex Shovlin Date: Mon, 11 Jul 2022 18:11:35 -0400 Subject: [PATCH 03/14] docs: Remove tutorial placeholders for now --- mkdocs.yml | 21 ------------------- .../docs/tutorials/automate-deployments.md | 1 - .../docs/tutorials/delete-deployment.md | 1 - .../docs/tutorials/deploy-blazorapp.md | 1 - .../docs/tutorials/deploy-console-service.md | 1 - .../docs/tutorials/deploy-console-task.md | 1 - site/content/docs/tutorials/deploy-webapp.md | 1 - .../docs/tutorials/list-deployments.md | 1 - site/content/docs/tutorials/push-image-ecr.md | 1 - 9 files changed, 29 deletions(-) delete mode 100644 site/content/docs/tutorials/automate-deployments.md delete mode 100644 site/content/docs/tutorials/delete-deployment.md delete mode 100644 site/content/docs/tutorials/deploy-blazorapp.md delete mode 100644 site/content/docs/tutorials/deploy-console-service.md delete mode 100644 site/content/docs/tutorials/deploy-console-task.md delete mode 100644 site/content/docs/tutorials/deploy-webapp.md delete mode 100644 site/content/docs/tutorials/list-deployments.md delete mode 100644 site/content/docs/tutorials/push-image-ecr.md diff --git a/mkdocs.yml b/mkdocs.yml index b75b360b1..38e7b4762 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,12 +18,6 @@ nav: - Set up custom workspace: docs/getting-started/custom-workspace.md - Deploy "Hello World": docs/getting-started/run-tool.md - Support matrix: docs/support.md - # - Supported deployments: - # - Support matrix: docs/aws-computes/matrix.md - # - Amazon ECS: docs/aws-computes/ecs.md - # - AWS Elastic Beanstalk: docs/aws-computes/beanstalk.md - # - AWS App Runner: docs/aws-computes/app-runner.md - # - Amazon S3 and Amazon CloudFront: docs/aws-computes/s3.md - Commands: - deploy: docs/commands/deploy.md - list-deployments: docs/commands/list.md @@ -35,22 +29,7 @@ nav: - Publishing a Docker image: docs/docker/publish-image.md - Deployment recipes: docs/recipe.md - Deployment projects: docs/project.md - # - Generating CDK project: docs/projects/overview.md - # - Customizing CDK project: docs/projects/custom-project.md - Integrating with CI/CD: docs/cicd.md - # - Overview: docs/cicd/overview.md - # - Suppress prompts with --silent: docs/cicd/silent.md - # - Deployment settings file: docs/cicd/settings.md - - #- Tutorials: - # - Deploying ASP.NET Core Application: docs/tutorials/deploy-webapp.md - # - Deploying Blazor WebAssembly Application: docs/tutorials/deploy-blazorapp.md - # - Deploying Console Service: docs/tutorials/deploy-console-service.md - # - Deploying Console Task: docs/tutorials/deploy-console-task.md - # - Pushing Image to ECS: docs/tutorials/push-image-ecr.md - # - Automating Deployments: docs/tutorials/automate-deployments.md - # - Listing Deployments: docs/tutorials/list-deployments.md - # - Deleting Deployment: docs/tutorials/delete-deployment.md - Troubleshooting Guide: - troubleshooting-guide/index.md - Missing Dependencies: troubleshooting-guide/missing-dependencies.md diff --git a/site/content/docs/tutorials/automate-deployments.md b/site/content/docs/tutorials/automate-deployments.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/automate-deployments.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file diff --git a/site/content/docs/tutorials/delete-deployment.md b/site/content/docs/tutorials/delete-deployment.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/delete-deployment.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file diff --git a/site/content/docs/tutorials/deploy-blazorapp.md b/site/content/docs/tutorials/deploy-blazorapp.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/deploy-blazorapp.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file diff --git a/site/content/docs/tutorials/deploy-console-service.md b/site/content/docs/tutorials/deploy-console-service.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/deploy-console-service.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file diff --git a/site/content/docs/tutorials/deploy-console-task.md b/site/content/docs/tutorials/deploy-console-task.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/deploy-console-task.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file diff --git a/site/content/docs/tutorials/deploy-webapp.md b/site/content/docs/tutorials/deploy-webapp.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/deploy-webapp.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file diff --git a/site/content/docs/tutorials/list-deployments.md b/site/content/docs/tutorials/list-deployments.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/list-deployments.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file diff --git a/site/content/docs/tutorials/push-image-ecr.md b/site/content/docs/tutorials/push-image-ecr.md deleted file mode 100644 index 85a4aa015..000000000 --- a/site/content/docs/tutorials/push-image-ecr.md +++ /dev/null @@ -1 +0,0 @@ -### TODO \ No newline at end of file From 0c51a8715c2baf0df7f9fafe6aa5ac18b8171de6 Mon Sep 17 00:00:00 2001 From: Alex Shovlin Date: Fri, 15 Jul 2022 12:32:58 -0400 Subject: [PATCH 04/14] ci: No longer republish GitHub Pages documentation upon merge to dev --- .github/workflows/doc-builder.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/doc-builder.yml b/.github/workflows/doc-builder.yml index c2239ccfb..6ef8917ad 100644 --- a/.github/workflows/doc-builder.yml +++ b/.github/workflows/doc-builder.yml @@ -3,7 +3,6 @@ on: push: branches: - main - - dev # Allow the workflow to be triggered also manually. workflow_dispatch: From 86fb2150ee169a72f218bed77aad8e540b0a5380 Mon Sep 17 00:00:00 2001 From: Daniel Pinheiro Date: Tue, 5 Jul 2022 12:44:54 -0400 Subject: [PATCH 05/14] ci: Add default encryption for CodeBuild bucket --- buildtools/ci.template.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildtools/ci.template.yml b/buildtools/ci.template.yml index f967cf09d..99753b884 100644 --- a/buildtools/ci.template.yml +++ b/buildtools/ci.template.yml @@ -161,6 +161,10 @@ Resources: DeletionPolicy: Retain Properties: BucketName: !Ref CodeBuildArtifactsBucketName + BucketEncryption: + ServerSideEncryptionConfiguration: + - ServerSideEncryptionByDefault: + SSEAlgorithm: AES256 Outputs: OidcRole: From a94733e6f87709bdc1c10be1351f31cf9c717831 Mon Sep 17 00:00:00 2001 From: Daniel Pinheiro Date: Thu, 7 Jul 2022 12:36:16 -0400 Subject: [PATCH 06/14] chore: Remove unused bucket --- buildtools/ci.template.yml | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/buildtools/ci.template.yml b/buildtools/ci.template.yml index 99753b884..33a371849 100644 --- a/buildtools/ci.template.yml +++ b/buildtools/ci.template.yml @@ -15,10 +15,6 @@ Parameters: Description: Name of the CodeBuild project. Default: "aws-dotnet-deploy-ci" Type: String - CodeBuildArtifactsBucketName: - Description: Name of the buckets where the CodeBuild artifacts will be stored. - Default: "aws-dotnet-deploy-codebuild-artifacts" - Type: String TestRunnerRoleArn: Description: Role to assume when running tests. This role must already exsit. Role can be a different account. Example arn:aws:iam:112233445566::role/awsdotnet-deploy-ci-test-runner Default: "" @@ -67,12 +63,6 @@ Resources: - logs:GetLogEvents Resource: - !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/${CodeBuildProjectName}:* - - Effect: Allow - Action: - - s3:GetObject - - s3:GetObjectVersion - Resource: - - !Sub "${CodeBuildArtifactsBucket.Arn}/*" GithubOidc: Type: AWS::IAM::OIDCProvider @@ -105,11 +95,7 @@ Resources: Location: !Sub https://github.com/${GitHubOrg}/${GitHubRepositoryName} BuildSpec: buildtools/ci.buildspec.yml Artifacts: - Type: S3 - Packaging: ZIP - Location: !GetAtt CodeBuildArtifactsBucket.Arn - OverrideArtifactName: true - + Type: NO_ARTIFACTS CodeBuildProjectRole: Type: AWS::IAM::Role @@ -150,21 +136,6 @@ Resources: Effect: Allow Resource: - !Sub arn:aws:codebuild:${AWS::Region}:${AWS::AccountId}:report-group/* - - Action: - - 's3:PutObject' - Effect: Allow - Resource: - - !Sub "${CodeBuildArtifactsBucket.Arn}/*" - - CodeBuildArtifactsBucket: - Type: 'AWS::S3::Bucket' - DeletionPolicy: Retain - Properties: - BucketName: !Ref CodeBuildArtifactsBucketName - BucketEncryption: - ServerSideEncryptionConfiguration: - - ServerSideEncryptionByDefault: - SSEAlgorithm: AES256 Outputs: OidcRole: From 075682a30a1c3c14a390f07c31b024c0ab759214 Mon Sep 17 00:00:00 2001 From: Philippe El Asmar Date: Tue, 2 Aug 2022 16:44:02 -0400 Subject: [PATCH 07/14] chore: update CDK bootstrap template version to 14 --- src/AWS.Deploy.Orchestration/CDK/CDKBootstrapTemplate.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/AWS.Deploy.Orchestration/CDK/CDKBootstrapTemplate.yaml b/src/AWS.Deploy.Orchestration/CDK/CDKBootstrapTemplate.yaml index 46a61726e..a24888f21 100644 --- a/src/AWS.Deploy.Orchestration/CDK/CDKBootstrapTemplate.yaml +++ b/src/AWS.Deploy.Orchestration/CDK/CDKBootstrapTemplate.yaml @@ -198,8 +198,6 @@ Resources: Type: AWS::ECR::Repository Properties: ImageTagMutability: IMMUTABLE - ImageScanningConfiguration: - ScanOnPush: true RepositoryName: Fn::If: - HasCustomContainerAssetsRepositoryName @@ -490,7 +488,7 @@ Resources: Type: String Name: Fn::Sub: /cdk-bootstrap/${Qualifier}/version - Value: "13" + Value: "14" Outputs: BucketName: Description: The name of the S3 bucket owned by the CDK toolkit stack @@ -521,3 +519,4 @@ Outputs: - CdkBootstrapVersion - Value + \ No newline at end of file From 49124221066e4feca950c0e6099659182dd19081 Mon Sep 17 00:00:00 2001 From: Philippe El Asmar Date: Thu, 28 Jul 2022 10:11:49 -0400 Subject: [PATCH 08/14] fix: deployments created in preview version don't work in GA version --- src/AWS.Deploy.Common/Exceptions.cs | 11 ++- .../OptionSettingItem.ValueOverride.cs | 68 +++++++++++-------- src/AWS.Deploy.Orchestration/Orchestrator.cs | 12 +++- .../ApplyPreviousSettingsTests.cs | 29 +++++++- .../SetOptionSettingTests.cs | 2 +- 5 files changed, 89 insertions(+), 33 deletions(-) diff --git a/src/AWS.Deploy.Common/Exceptions.cs b/src/AWS.Deploy.Common/Exceptions.cs index f5c0a1a23..085a69f7e 100644 --- a/src/AWS.Deploy.Common/Exceptions.cs +++ b/src/AWS.Deploy.Common/Exceptions.cs @@ -123,7 +123,8 @@ public enum DeployToolErrorCode FailedToCreateDeepCopy = 10010100, FailedToGetOptionSettingValue = 10010200, ECRRepositoryNameIsNull = 10010300, - FailedToReadCdkBootstrapVersion = 10010400 + FailedToReadCdkBootstrapVersion = 10010400, + UnsupportedOptionSettingType = 10010500 } public class ProjectFileNotFoundException : DeployToolException @@ -220,6 +221,14 @@ public class ValidationFailedException : DeployToolException public ValidationFailedException(DeployToolErrorCode errorCode, string message, Exception? innerException = null) : base(errorCode, message, innerException) { } } + /// + /// Thrown if is setting a value with an incompatible type. + /// + public class UnsupportedOptionSettingType : DeployToolException + { + public UnsupportedOptionSettingType(DeployToolErrorCode errorCode, string message, Exception? innerException = null) : base(errorCode, message, innerException) { } + } + /// /// Thrown if Option Setting Item Validator has missing or invalid configuration. /// diff --git a/src/AWS.Deploy.Common/Recipes/OptionSettingItem.ValueOverride.cs b/src/AWS.Deploy.Common/Recipes/OptionSettingItem.ValueOverride.cs index 92ec8bac9..6b4697b47 100644 --- a/src/AWS.Deploy.Common/Recipes/OptionSettingItem.ValueOverride.cs +++ b/src/AWS.Deploy.Common/Recipes/OptionSettingItem.ValueOverride.cs @@ -125,45 +125,57 @@ public async Task SetValue(IOptionSettingHandler optionSettingHandler, object va Validation.ValidationMessage = string.Empty; Validation.InvalidValue = null; - if (valueOverride is bool || valueOverride is int || valueOverride is long || valueOverride is double || valueOverride is Dictionary || valueOverride is SortedSet) + try { - _value = valueOverride; - } - else if (Type.Equals(OptionSettingValueType.KeyValue)) - { - var deserialized = JsonConvert.DeserializeObject>(valueOverride?.ToString() ?? ""); - _value = deserialized; - } - else if (Type.Equals(OptionSettingValueType.List)) - { - var deserialized = JsonConvert.DeserializeObject>(valueOverride?.ToString() ?? ""); - _value = deserialized; - } - else if (valueOverride is string valueOverrideString) - { - if (bool.TryParse(valueOverrideString, out var valueOverrideBool)) + if (valueOverride is bool || valueOverride is int || valueOverride is long || valueOverride is double || valueOverride is Dictionary || valueOverride is SortedSet) { - _value = valueOverrideBool; + _value = valueOverride; } - else if (int.TryParse(valueOverrideString, out var valueOverrideInt)) + else if (Type.Equals(OptionSettingValueType.KeyValue)) { - _value = valueOverrideInt; + var deserialized = JsonConvert.DeserializeObject>(valueOverride?.ToString() ?? ""); + _value = deserialized; } - else + else if (Type.Equals(OptionSettingValueType.List)) { - _value = valueOverrideString; + var deserialized = JsonConvert.DeserializeObject>(valueOverride?.ToString() ?? ""); + _value = deserialized; } - } - else - { - var deserialized = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(valueOverride)); - foreach (var childOptionSetting in ChildOptionSettings) + else if (valueOverride is string valueOverrideString) { - if (deserialized?.TryGetValue(childOptionSetting.Id, out var childValueOverride) ?? false) + if (bool.TryParse(valueOverrideString, out var valueOverrideBool)) + { + _value = valueOverrideBool; + } + else if (int.TryParse(valueOverrideString, out var valueOverrideInt)) { - await optionSettingHandler.SetOptionSettingValue(recommendation, childOptionSetting, childValueOverride, skipValidation: skipValidation); + _value = valueOverrideInt; + } + else + { + _value = valueOverrideString; } } + else + { + var deserialized = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(valueOverride)); + foreach (var childOptionSetting in ChildOptionSettings) + { + if (deserialized?.TryGetValue(childOptionSetting.Id, out var childValueOverride) ?? false) + { + await optionSettingHandler.SetOptionSettingValue(recommendation, childOptionSetting, childValueOverride, skipValidation: skipValidation); + } + } + } + } + catch (JsonReaderException ex) + { + Validation.ValidationStatus = ValidationStatus.Invalid; + Validation.ValidationMessage = $"The value you are trying to set is invalid."; + Validation.InvalidValue = valueOverride; + throw new UnsupportedOptionSettingType(DeployToolErrorCode.UnsupportedOptionSettingType, + $"The value you are trying to set for the option setting '{Name}' is invalid.", + ex); } } diff --git a/src/AWS.Deploy.Orchestration/Orchestrator.cs b/src/AWS.Deploy.Orchestration/Orchestrator.cs index f97e3c020..0237c48e0 100644 --- a/src/AWS.Deploy.Orchestration/Orchestrator.cs +++ b/src/AWS.Deploy.Orchestration/Orchestrator.cs @@ -151,6 +151,8 @@ public async Task ApplyRecommendationPreviousSettings(Recommenda { if (_optionSettingHandler == null) throw new InvalidOperationException($"{nameof(_optionSettingHandler)} is null as part of the orchestartor object"); + if (_interactiveService == null) + throw new InvalidOperationException($"{nameof(_interactiveService)} is null as part of the orchestrator object"); var recommendationCopy = recommendation.DeepCopy(); recommendationCopy.IsExistingCloudApplication = true; @@ -159,7 +161,15 @@ public async Task ApplyRecommendationPreviousSettings(Recommenda { if (previousSettings.TryGetValue(optionSetting.Id, out var value)) { - await _optionSettingHandler.SetOptionSettingValue(recommendationCopy, optionSetting, value, skipValidation: true); + try + { + await _optionSettingHandler.SetOptionSettingValue(recommendationCopy, optionSetting, value, skipValidation: true); + } + catch (UnsupportedOptionSettingType ex) + { + _interactiveService.LogErrorMessage($"Unable to retrieve value of '{optionSetting.Name}' from previous deployment. Make sure to set it again prior to redeployment."); + _interactiveService.LogDebugMessage(ex.Message); + } } } diff --git a/test/AWS.Deploy.CLI.UnitTests/ApplyPreviousSettingsTests.cs b/test/AWS.Deploy.CLI.UnitTests/ApplyPreviousSettingsTests.cs index 0adf317aa..19b8dd508 100644 --- a/test/AWS.Deploy.CLI.UnitTests/ApplyPreviousSettingsTests.cs +++ b/test/AWS.Deploy.CLI.UnitTests/ApplyPreviousSettingsTests.cs @@ -33,7 +33,7 @@ public class ApplyPreviousSettingsTests private readonly Orchestrator _orchestrator; private readonly Mock _serviceProvider; private readonly IDeploymentManifestEngine _deploymentManifestEngine; - private readonly IOrchestratorInteractiveService _orchestratorInteractiveService; + private readonly TestToolOrchestratorInteractiveService _orchestratorInteractiveService; private readonly IDirectoryManager _directoryManager; private readonly IFileManager _fileManager; private readonly IRecipeHandler _recipeHandler; @@ -55,7 +55,7 @@ public ApplyPreviousSettingsTests() var optionSettingHandler = new OptionSettingHandler(validatorFactory); _recipeHandler = new RecipeHandler(_deploymentManifestEngine, _orchestratorInteractiveService, _directoryManager, _fileManager, optionSettingHandler, validatorFactory); _optionSettingHandler = new OptionSettingHandler(new ValidatorFactory(_serviceProvider.Object)); - _orchestrator = new Orchestrator(null, null, null, null, null, null, null, null, null, null, null, null, null, _optionSettingHandler, null); + _orchestrator = new Orchestrator(null, _orchestratorInteractiveService, null, null, null, null, null, null, null, null, null, null, null, _optionSettingHandler, null); } private async Task BuildRecommendationEngine(string testProjectName) @@ -76,6 +76,31 @@ await parser.Parse(fullPath), return new RecommendationEngine(session, _recipeHandler); } + [Fact] + public async Task ApplyPreviousSettings_InvalidType() + { + var engine = await BuildRecommendationEngine("WebAppWithDockerFile"); + + var recommendations = await engine.ComputeRecommendations(); + + var fargateRecommendation = recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_ASPNET_CORE_FARGATE_RECIPE_ID); + + + var serializedSettings = @$" + {{ + ""AdditionalECSServiceSecurityGroups"": ""sg-1234abcd"" + }}"; + + var settings = JsonConvert.DeserializeObject>(serializedSettings); + + fargateRecommendation = await _orchestrator.ApplyRecommendationPreviousSettings(fargateRecommendation, settings); + + var additionalECSServiceSecurityGroupsOptionSetting = fargateRecommendation.Recipe.OptionSettings.First(optionSetting => optionSetting.Id.Equals("AdditionalECSServiceSecurityGroups")); + + Assert.Contains($"Unable to retrieve value of '{additionalECSServiceSecurityGroupsOptionSetting.Name}' from previous deployment. Make sure to set it again prior to redeployment.", + _orchestratorInteractiveService.ErrorMessages); + } + [Theory] [InlineData(true, null)] [InlineData(false, "arn:aws:iam::123456789012:group/Developers")] diff --git a/test/AWS.Deploy.CLI.UnitTests/SetOptionSettingTests.cs b/test/AWS.Deploy.CLI.UnitTests/SetOptionSettingTests.cs index bdbe0bf0d..174a7a986 100644 --- a/test/AWS.Deploy.CLI.UnitTests/SetOptionSettingTests.cs +++ b/test/AWS.Deploy.CLI.UnitTests/SetOptionSettingTests.cs @@ -142,7 +142,7 @@ public async Task SetOptionSettingTests_KeyValueType_Error() var recommendation = _recommendations.First(r => r.Recipe.Id == Constants.ASPNET_CORE_BEANSTALK_LINUX_RECIPE_ID); var optionSetting = recommendation.Recipe.OptionSettings.First(x => x.Id.Equals("ElasticBeanstalkEnvironmentVariables")); - await Assert.ThrowsAsync(async () => await _optionSettingHandler.SetOptionSettingValue(recommendation, optionSetting, "string")); + await Assert.ThrowsAsync(async () => await _optionSettingHandler.SetOptionSettingValue(recommendation, optionSetting, "string")); } /// From a4935c623f062e354ffadc406bddf8d5bfb4f638 Mon Sep 17 00:00:00 2001 From: Norm Johanson Date: Thu, 21 Jul 2022 13:29:43 -0700 Subject: [PATCH 09/14] chore: Add integ test confirming server mode connect behavior --- .../ServerModeTests.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/test/AWS.Deploy.CLI.IntegrationTests/ServerModeTests.cs b/test/AWS.Deploy.CLI.IntegrationTests/ServerModeTests.cs index 749356852..7d6e350a0 100644 --- a/test/AWS.Deploy.CLI.IntegrationTests/ServerModeTests.cs +++ b/test/AWS.Deploy.CLI.IntegrationTests/ServerModeTests.cs @@ -5,6 +5,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; +using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Threading; @@ -62,6 +64,39 @@ public Task ResolveCredentials() return Task.FromResult(testCredentials); } + /// + /// ServerMode must only be connectable from 127.0.0.1 or localhost. This test confirms that connect attempts using + /// the host name fail. + /// + /// + [Fact] + public async Task ConfirmLocalhostOnly() + { + var portNumber = 4900; + var serverCommand = new ServerModeCommand(_serviceProvider.GetRequiredService(), portNumber, null, true); + var cancelSource = new CancellationTokenSource(); + + _ = serverCommand.ExecuteAsync(cancelSource.Token); + try + { + var restClient = new RestAPIClient($"http://localhost:{portNumber}/", ServerModeHttpClientFactory.ConstructHttpClient(ResolveCredentials)); + await WaitTillServerModeReady(restClient); + + using var client = new HttpClient(); + + var localhostUrl = $"http://localhost:{portNumber}/api/v1/Health"; + await client.GetStringAsync(localhostUrl); + + var host = Dns.GetHostName(); + var hostnameUrl = $"http://{host}:{portNumber}/api/v1/Health"; + await Assert.ThrowsAsync(async () => await client.GetStringAsync(hostnameUrl)); + } + finally + { + cancelSource.Cancel(); + } + } + [Fact] public async Task GetRecommendations() { From 0cc4dfde737117ae2caa3bd946ef9a9541639bd3 Mon Sep 17 00:00:00 2001 From: Norm Johanson Date: Mon, 4 Jul 2022 02:14:00 -0700 Subject: [PATCH 10/14] docs: Add documentation for deployment projects --- mkdocs.yml | 7 +- .../images/deployment-project-file-layout.png | Bin 0 -> 70426 bytes site/content/assets/images/vs-catagories.png | Bin 0 -> 71173 bytes site/content/docs/commands/project.md | 8 +- .../docs/deployment-projects/cdk-project.md | 106 ++++++ .../content/docs/deployment-projects/index.md | 39 ++ .../docs/deployment-projects/recipe-file.md | 354 ++++++++++++++++++ .../docs/deployment-projects/tutorial.md | 351 +++++++++++++++++ site/content/docs/project.md | 51 --- site/content/docs/recipe.md | 16 - .../aws-deploy-recipe-schema.json | 30 +- 11 files changed, 889 insertions(+), 73 deletions(-) create mode 100644 site/content/assets/images/deployment-project-file-layout.png create mode 100644 site/content/assets/images/vs-catagories.png create mode 100644 site/content/docs/deployment-projects/cdk-project.md create mode 100644 site/content/docs/deployment-projects/index.md create mode 100644 site/content/docs/deployment-projects/recipe-file.md create mode 100644 site/content/docs/deployment-projects/tutorial.md delete mode 100644 site/content/docs/project.md delete mode 100644 site/content/docs/recipe.md diff --git a/mkdocs.yml b/mkdocs.yml index 38e7b4762..a420409cd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,8 +27,11 @@ nav: - Docker support: - Dockerfile generation: docs/docker/docker-generation.md - Publishing a Docker image: docs/docker/publish-image.md - - Deployment recipes: docs/recipe.md - - Deployment projects: docs/project.md + - Deployment projects: + - Getting Started: docs/deployment-projects/index.md + - Tutorial: docs/deployment-projects/tutorial.md + - Recipe File: docs/deployment-projects/recipe-file.md + - CDK Project: docs/deployment-projects/cdk-project.md - Integrating with CI/CD: docs/cicd.md - Troubleshooting Guide: - troubleshooting-guide/index.md diff --git a/site/content/assets/images/deployment-project-file-layout.png b/site/content/assets/images/deployment-project-file-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..e10fd8a89aa1d0fdbce0c748b0bafd4a97317b8a GIT binary patch literal 70426 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
  • 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 literal 0 HcmV?d00001 diff --git a/site/content/assets/images/vs-catagories.png b/site/content/assets/images/vs-catagories.png new file mode 100644 index 0000000000000000000000000000000000000000..784439fdb706dbe078e20947cd5fefc3fe0dfce3 GIT binary patch literal 71173 zcma%>^KUQC)39Xc5uo}xyo>)FFbiRMVIZKU z1lVsQ@c(>hM=32AARzpR{~2(?$%7dX(7!TiF=16t{p&n%L)5ADK~8m#qOvd=`ql;I zXf*oU{|WCFA)@Dh!jRdm^jR*I=J@L4?2%UyzCE}-_;+&`Z|;5?H{a{WY6DWHEd6l* zpT6}%cNh`>)BJw0MhV}45(I0I@bdKZ^oP=qd;H%Dq+Xnp!^6W5Vo&zzk&%%n(R=IE zh=_=@h=WzC{{ z$4tH&d)!6;Lr9--7yp~**!8^%K`xcKYk&RQhBm1HBid4tO1BbMmdOkMgRyG3bGfm6)^{z z0^MlB3GX%@8O&RT7#)Tvs8RF2+(FOaQc|cmxN@jyJBcO|{a}Ho$rv{y{Xz;GEH+Ut z5LfH22r>noaaaIEA_DIp7~*gyh4b}5RfF1Oihy^dYK-r;#kr>fzyc0BbY|p2;kB-y zwmfDFqnSy)VwKeiX05E9&}LL~a7{+dj@3&G^NlX?gNTx0q}0liA+Je?9<$Z#wcILP znN$p-!X(4rQ!>D^c)TT+CexmZ{$2aCR&FxBVSSByF!l_%KYS#V3~qq`I5qw>1#(QW z2nf2jI>T$aq1>6ba?u^=DusGIxveG6R=g<~_ps@t0(9);Gs9J>GR-E6khGxy?UIRr zm_?csV;Lz~1ymBCE)g6uKv{_=F<9J*(}&hiyG%KtW`hJ69UVEBTEiwZHMTOfCZ>qs z+!coP2YWm{uvoCq%jWo4Ye_`0s&o^ri3CO3+*h?(W`1)HMxC&hi3lZ1f@*_xL|J2YP*9{b81tD5Np;{Hegh6U`;Cv%-=bG*ug&Q2n7`PT=J)3=l(X&< z0vkECfYZwlNEHESE5COY18ftSUs1O9cRaFk3~6P`WH_PE%S(LEeoWQ z@(q+|_%@}(c_Z-m%pP7U*QwtO z!E*FpGGx5`?XsWFxRBHODPycM5#STPCRclARJ}hhxPzCPBp6WRw|ME5MwYhJVhkAu`#kz}<H)?mf9wbRjbI9KX5jo>{@L|bAy+bKa=AdTq=T(T z>24AsuSLNBuyBvI?qpQ>FCFq;xjfFu(VML~q1L2>#T-zKBvOiB34uSjYN1x~a)|3P)0u6Nghyf@m; za;1HxrbAq@E{kt^YIO3Gcg50_3t20xJjWfni;atw>Tg`oxYXWA$Yoy1q`PQ>F4WtI zGiCW^5*8jxZiz75BVlrVKvFRgMGjY{!NTg{LW6453`z;k9^-laBhr`{Je`;Xoy^#_oWNC2V|8Mlm)qE?#C)Wnz?W z246;3zD!L`Ev4HURTU&>Ca1o25wXVLeJ7G+2{2`5W(M@GwBqrh`P})Mo2d?iCsZ~0aT=rt?_ZcxEYw?X}}4xPembVNioKXjxw-LEkfID##Uv$yl@L!>7`S^_6O-^D+hAoU2eqM`NrndlA!_1pP=VxZ zt{LGSmq75dQ83Z-GC|^igQ&z>)wF%ZJZ)LdmF)*3R~8qU3rb2@)Ut0UHCdS1ie8cC0{}kN`(Q#A2glnb4>7?OSf)KATuu&!Jwuh8SQ;^|eV~c(kpT{_t znqa|U#FPw^76o6(@R^>$QjR?BE4AXRLU>D)aV(1FMON%IPE`0!f0e^hInRj$W0jnx z!&M7f66e-WS&AE=qS}Zro5`X$?;eSsgus7S;pMBxB>7GC!XZ{KsOp)9AFCZM_CgBnd^)P%=65 z9S?JHG#i3j6eEhP^N!a}uIpm9IkCEt7&(V%G|Bk7{Oc7rS;%G6fp%nk5VCvFPf`A) zHo(bHeRR3O#!j<4b`;{_w6o112>6{atmPkuJLjG1E$0))PvA5it?YqnOn-G)?KL>L zFZ7+GQJ*SwIvHoA1vqd4nNhkrBGbAk z_&9E1H1@6G1i@4l%6_lzwpaylyP2L4>0n|?R`6V)rQ!Ru*j7O-vPf}Ow5u?W9L2rZ zx$<(nHqof}TE`?E00vsKOBJEY)l&k0MzWc5X#khGi>=y;8z~=*S z&`D8D6K>Y0c2}!H{h%?wl2O$O=A^y!7hAkEt6{Q{W8?#!MWb;VDMW<-gow_WeG^Dn zq)3<-B4-|F5Rm6FK$I3D(~ZgI4k0JIxw={{ zx_PF?;)8w==OO&Mes34;Uh;DN9i=)^_g?$`0%%hSy5r3Uz;HIjgytm@A^Qe6fSBoZ z#R7k_M90RW;iY+zrYM_PRG3Y7fkrQ}GWq-a=d0Z0vwJhVV_~7;eD2ND73rNMLl&4f zlU4zVq_NPG<2nZ;(-x-CWOISR=GF_sLcPCVjJG>62N~_WV#Ugl<^|$* zSprg)s-yC%34Ei0bBzKYm}XN@661k?4pc*cu%;jg^-3 z1A1Wtm&9$eHXl~Lg~xoo&4Zl8INo7^B_Ppw&9>Tc`M(mF#0rvUBtGa38WD8GIE_nj z4=>AoW@Qlz&EN23A^5;;4>%w2k1= zwokcRf8Xm3_Ph}`5d1DPJr=jwKlBJ&arr1kL@V578!7dNb@lwq)3`Gj@cQ?;iOs_v zZ1?Y%Rf60=3s-gv0QC=rK<^`Ux!(SQ<~Po)$$_vp65L>+6q=D>ATHVCZYftxWfEwinzBD8&1N=5V(0T)d>iA*%v+bS|cmRfxb?g*K|F* z@Ol^+IJg*u>$8&WKK+jzqteAj6>RaH3YNnJh_Ic3M*i{MzD3p(Bsu1>c9Qa!7%%9%@{b{KcBp%+Ayn}q6? zyFa%v>@%a^QJA0CGO=A~8e7R-K zdZR4ibmeg1_oM03lm*v>qsW$#z0p_j@tD~kysFc7bwp6Aq@H|O6m*%S#{&69<8=Hm za53BaZ}5cg?$V>=^bL`SvN9vTc?{P2ra&w7VpNRo9MNVpU$-1Ubp}>uRJeh8KaBD> z^jLJ6vkn5!j)dlg!RY(tL?TOP4KY3*B2(^Qv1PWO0#QJ#joUICIfEshG61o0<}Hop z;j}%WOIgAO;>u?IN@yrHo?hF?5#4aN?v3ttEY^wp5aN$OplWrny@RA0uS`E(7eQF+ zPV!F8y=6ljOKK;*(7gF=e4Gw7?({5xUgn)s@qoZ z<0z9VKvP{gQqNX4Wx}Br%3cV<8P&v-g%xh%f-)>6@KSh$jGSQVCkv6Cj$v~J+#n9t z19QaQS6o|*o#Apu>$l~CW2A+k7#bQecyJ&hUt#m|_5{C3(%JFqK(5c+l`bFy6wG#L zaig~$&}`nG@9FqWIvoFKfwzcc=O@i#ux6|=s4izsXnK7A)B)OG1Fj7bgDNK?3bAMT zE+vctT1;1H%l1uP?O%zW52;>JEG+Q2;o>nhN zy|2%Hrm|(Ar?XFP97FN~Af61m13V8eA09^12MogpGvWhc;+ji0-JkjVrYkgoX%GjN zWBJ<^E!+LUJBBn&9}wya^p^$-Ft>^~ED=_}+@IL7*s)Wo&Hq#uF^!G0(fOPob8~#| zlFno<`9&jp%*2C^-(l|ewzmQo#D7k($~R|81<;#v{Y`p z%5Iu%6+@!p+6W2fsK2q^BovJQLRW0ttFBGPTd)aJ%!F#Asu+_U<^aN>5 zN$!KzBuXr&(UH?OOPiclcHG`R8i^aqP6)J!PhnQFQDMg0Z!?XLVa%^me(N{mEkW*z4V7 zEzf9Q9TF~AjkcTK=l+o#=)O@+?Ug^{u3_A9L=(2Q20V9%OMGgho{U^oxC`tt?)e%b zt~Qn~IBBueW5zSv(oV0n#Ft>RpC+u5gV}lwW^=waXdU`N(ZNE27}1E+3-r&0iWwEr z?W8N*J{=5GK+y<&_gqC7T=4Jm=kZdgUUGG`{zkYcPT`Xp4p=hK1yMYn#2UuxXJT1IOH%@ zS9wS$NMsc7O;Kn_Zh8s5e(mJCIUS?yhV8M1z)IT}TPB^2K@S_EDq}MjkSu@a9C@eE z=SXm-)fsS}E$cWQFodsVhAs=xMHWG@B8sou9QgekUxl3<+kUg(?$Lni?V?l<@(HeW z91;FGo>zb{Gy2x!Er`on1jQ@-n$f5-s($zVQNqL98}MrJ?prG~8%!PLDs^OvIcOX! z9J^TB02jq+e`(%!ej%+@V}8<&yf*;4Ou`|kSI_F?(i}eQ3Cu{V_6`Phh?oTL9_uRY z31N0S!w;<_6ztaSlMhH;oW=}tA6!nhFQJIb*X0V)%fx!8BWaUd=QsfS)<&4}YGX{M z`$gQV_d~thzd2w}&%O!Xh z5G{Rua0_wdB0CX3Mgi4}=7j_Wfa8-c`{!-H+%9Jfy(3@G6mm67yh{6-I_6V^x zVKoTb0Chwz9U?%P=1v}JWW;_kf|g_JHT-M7Pnef%^SD->oi8q(?|ZA#=B;M4IkFtY zesLqxB@JFTr*`^fX%xjuWmm6*GJIDlV60VD?#@t8sM)VI<1Mu-fslXOhmMc&4EPv= zjOLRB0&ij1u1*y`z4&rcU0cSzD5s|x?gEp;&!*AuD()JJ!{wyrxp_{DH232T^;ci)tB0i;KLI`wQ1R$vc%E-G%m zupSJ!c}J?t&55$Sz~iS$H_+GkS8oA!-MB4R+~;8 zClS7X_+jA$M1?FWM~4}>7M)%ZPr0yY&_?HGMX(^H|@8t5RJhUb#uy6kQl(K1*7kK(Wge%#=5<^Z&}E+sCbx?>8hf?|JSKBH zA3s~{NKr3TUY{OlEt9!gg}KdO@8DmlHhO6Neh>Z+N4N1|1ig)Ju8CD}74mr;Htqta zjJYapspNkE?HGLj&_BZSAmkeojnc0uNOxA&lnRO%1`?G$gV4tFGpC_7onGU!h&Rbe z&#$C^cbbv$h=A1ze1u*0t}o_Rx4bdtQE6db(=fW$iZ^VZ)ARmo%NACO&7Cod&!fJ+WGKp$nvD!6$pBJa{|u+-eI0sZxaO~Anu?Jac}pGa(H8ZED}wlHs z946LgGgI~wqQ?L^mIWkAQ?k;!gTq$(c)HT*;chEfi z_^HA57`WW6V;Bd<(#>+W)MR`KEImU73wz_kD5N3^6sxPujZhhg6rmd)(5Fzcj&HS5JwIxly!Jy;LiDV3 zuQR^J5m{_r=Lc58(lKZp9k1DXVf=R}z9 z@dC_pinON4w-tP05a3}D5I*j$XGalk&i1w34ymMu=)RuMzgM(mNtVz&Suw`xA~hu` zS-B|~Xug*#6o-h76z%i#*otF>*4c_g?(W|(mBg!@YDPNuPBsOdB0aa zUnsLs2b1Fl?DQ-yea_B{r5t8kh+0TL+z{i^?-3O)lrIiTZmlArh+imP`Tr2yH|K&m z`OL)AR*NJEp&+&^?(sPeLe?~2&${=n$t|N49T0Xkgsco}~Qc}V-xDzA~{Zt08;!LRh8mOGVQurS7BG&d2&9Y7xrJYH} z$oTaXl_;W=aqjL1hYx0jYQk68sy6s>?>-M;s)G7pt*&C-ZI#oy=gFs-s$(Y?{kD&_ zd(p~F7VTDSoqN=NbD{_1UZxz2spbhh71fF$hMpfZ*~`IvM_Gn}>V3wYR!&x-mwMj%(sZtU}J?cL)ac2))Wg z)<@c0&y6n=QQzp9oz&yn)-;)g54;zXwOw9!N0oni@s^s=v_XBxdh7-Q1$w+JP{&Zb zuAT!W6^no3U`KrUL>6G=&27m2j674 z_F}|XhICRGhaO1*9I)S)=0Y#Y@7}iGXH0`U9L3rC! zFqT+qw&JqYFPD%=Fj_aH9VONO)E`Tf7PYeIr~+JA|mBDpvb=hlNf zL2=<^Z7tNaRi&9Y5|S81nTD8WWx6=d?CD^A;LfCG@F?27+;-%QtTr8#tr0j#x5XL| zhb}8r(OePsBm++byG*iRJ+xqvy3=d?pOwJgQ|b>t7^$C&`HGm>$(80eWE6w9y~A$! z&N-0lA1iC0Q}M#4N4v3VlaIA7l+z}cRsiD5AVox^d%WSn=!X)hM;1aa}$@P^5pc`s(G;uORw5cj( zSsU3k^H7yWDI&mhnR42~&IVAe7@dLtV0P#UQ(jtrwW>~5&WINQ8mW#ym4b|Od0_Di zeVvn+`e+UiF=SDq5_x&4j;2n`{ikX_#85esY$%Pmt8#N&8vEvHFnc#xG?@ylJp2p$ z3-~f>!Mr+^N}1Lv1_lj!D|Zf3KVvGNszO;Q*!gwAW#qO(XKq}5|DmHCZ$SM zE1@7Ba`xTPKe}SJ8kS_uq?JDk+w%9_-XaXKm1TI$Z`?P^WNo*miRX;=mJW)|?_ zY%5Ahd0BNBIk*=#-q_j{{N&Qc#`aVgLKPzJrd|qV6cklqBCN8oTpDD8x+ZFVevZn4 zHDQ6~q1NK+<#K6v&8U`6GPYLsc)0i`h6sN%u2?K-s1&_LLUk?m{|qPcWs8qdQbdJ; z$U6V%Whc>;xYo%%KSWn(CnYnqG_s9Aiw5#kRFqz3WnM)`6#zBt&Xi(vr^aU$F_dEb z9(T4FXpol#qF9uXQ(Fe*XO#iphSUtD521;XNKh-zsAlS9BW;60un6D*3qwm!@i5)G z$;-hv_IGC0>yhUF3;wo7n_v~V9j?yl#m*!o2}7(c)PcVe*UcR^9f6%a5Qkus1}4NY zDnJaI3*Q`}kSZ>LtDzo@IEMkI2$hTlDj=H}9g5?OOAa=qD+Z55)ZlPz)GDz^8Y3@G z!~_e950{=S16R=kGsz(nnf^T4&|GGm3Iw7?tG#bzAOaF7ls?3y1K4@dOZ)nm{vx%5 z1BQUN8nDMe3~ivIEQ-FFGi&q+3@ej(?O>%zHQ|!6eT2xKV2zy${~A_F#c#x~L>`|` zy7#)vK@p!-_@YxDZ3LEnC&rGWe#zI+K48)YGr|~65R3;u!Q0oM-I}4m#|&X4^ag|F zE@)m)0`tS&wEF>4oEYN-1o_JqmrS<_WfKuC!MMEs;%c&8w3G!uKREN&;Dt3lPDq$Y zBDW*%Ma2q(N07G?M&;-r*Y}pfz=!u-ptOi%TA0@6eb z{vCt1UfOVylR@d}4B0gVj(|+>w6J$r#H_&ZVJ{EQ)lq9ZBi-`Wo4MKoV$*yw_KqT+ z7XGpvUqh`QRM@-GrLTSA^~A~fYY!riaa^@U6I%QZlm?dQ6gTb4#2Hp%jRoYpdfFJ(RT8)A8gI`_!5?lPU)}O zx6au3GVz@GT;KG=<4y%zI}I*U1Z6-Y-L4hT_W1A({~yWqGyt^8 z2KF*)MaD%YFmU=xjDc?GiT^nO^8e_s$YEMyg8!610QCREgH>2=^ppeLW=5RB`aXnH z&Yn~ITId7?iG#r)wv*gOeu-p%^ukg;yG2hzOlADRH1)?Zs9a|ZQWyOWE~5=5fedtC zgoX08STF!jUh16&JDr@j<*N_+gS6h3YRKV2u1qx3G~E|Mxzb}TCM8nOk->8;T`v7hV+S8^1kxWpu*`d z#41yUO#ST%$kdy2C!G|uu+1PFtml`nZV$u>t?J_=760u#|6-J~a!kRJ@dq)f0QtMo zh&B2eo*#t0a$Nyfs%9YL5nA!lp#ItS0A?|)v+}rG)wau)x@DHZ5BtS}A4(Jrb)~4u z`M+u|plVfWgE_yI+`mjrh0KP5LTCM*K2Dw!;{yF@ebcGgy)QB{>Im;Lqessh3wp5O zsSH=}q{}6(SK}%LL~HxE2t|NIY)6}iPx%N20kWsh3O4*#s?^JcZ(w(V*`j9SYlFqh z2fwX&E%3huSX7#`u?uJN)nC^E$$!-G<_L&5%H&@dTwa3^UG+ETJQ-y8H6nl#vuj) zktwUs4LU6fA=Tuob+qZY-KSt#|Geyo=ViQJ-&dO#L+r&)1J!Dv-|;?Q$08it1zfd{ zbJl~}zHKxb^y{=&tJ!VV+nF&kx4KvUYaiDr+$fu0ej$d?zOPp)^@Ru2U50D2p~Rsf z4?qx?QoLHJuJtVSOZ}X}U$x(^*iTgM{b1Ui&N+rHjM57kDXOywp2JSSNM%K0g7q57<6u4-ZXfDQaMU6y z1gC+$2~%>caT=;nlj)XH&SV7lAH*dV@)a_J(`?@KB;4>-uhfH+7HY@gwDIZM5kZ9$ z#?D0TUa37hxRXm%DE(~Nb-U{eR6Z=kWen$|?xc86)=T2YTI`ElxOEt6ciF ze%&rVS%ZR#GWnpahp6%edTE=S8vYubBn^BUm4fI~JsGQ?6> zUs$)p)CC-+1QLP>MK<{R>f(Lu9-9*Qh~R$hvlp736Rc_x?@iBKqnmxB_A3B~8fa3@ zLvM&ZojtLa%WK7Quv{x-Jw~=8FnJY!Jy5VH9zI2;dm)^x4Mh_NM{4R~IFAHqKn^qn z*$eq8Z1Fq9+V8I@|(_rAcPkRVj<@^IJ7 z(UV_aRgewi2=Tiy&cD`e=YO}4HS4^{>P4Hn2oE_)!^`@o*y)LhN#oENAJJNBP=P;GQ*jOl))TVC3G z4;k6B7;V4 z7d}P!fiH>b@KPllADN$bFR0ZE+bXrYRVGI%6A>AJ|9ioWFbDWr5Tj%Swp4|RpF^m* z@aB2Ve6fNrh#wgH?Bb2zuN+<#IEEf7`Z938dOssz5C?oWVfte!y$izabJa$5m*;2o zRnp4PsKo+2O~l?rE7$iQIwT?NNVN-a*<|_|sc&Ia1pdzYHe=M>l3 zV+D@%GJ^3!LHd|mt?i1|3X3`kyZ!P+cz`ky{6TnTwZ?Wx*lk=6`^7<7ZqEhFyJ*m$ zt1@{QTg|x>x9acnF^q+V2Pfh@bwEA^WBvsAR`ua-cwI?~e4e3hKl8$@0N<#AxZ zUN&sUfEYBt&Pra>+2R?ZMQ<-3&x<}31s?+#I`k9eE3L}b$ntL2#Lli3TRp-PCVUQ> zLJt~#)2W2WK>F&ohjoYFF3){L8gjp;erYam=f`N-x&Yti)vfaM*yhI{UhdTE`z>np z-koS2jZXADFs~rG%#j9%+d91#>&<4fnXga$UczwkM5$Lfo2#SK!XmYNMC#ZZr&=0f;it6M)j2kskNlUJMv0fy?W2YJTnX2RfbcUBBmK(gSi73ATDo zlYO-vJS1~I8kK5cN7u*JA$`q_vE zZe7O+$aOC!OjVl>g6btB!vbQv5Jr4I+_(Z7%xK%33}n20N0glf?t71~&GWV#%<$e` z3}nW!O-ZG7Mm@TVlPha!vzZe|Ta!zm`~??Ff!tUWSUl`|N5i*r zGrpNF?k>6wmo#085sk|PdtImBstm%py7qS09q(&qsc5iiE6{E4?hNXiza4MiGvp@P z@p=;7npBZ+-m861t4;%6wctJz?ag2{$w1gism#|_G`mjpK`aVPR>5%VC*14R<>Cq!1FIqmuEPja zSwxtQicq+^pbruXL<~b4za!4cq_NO0A<$)8-B`^9HECDSuaX+pD>o2b6K5G(or)sB zD(C+@!X$?{nLyTAxk0EhSXXwv&j`8!uC)i-W-MHVJqHbJM+B)g=2yVTxowiE+|XNW zO=XG^d@e-y&)P|o-}-c1QFUSpA%=0;nK+WHe8Xi-oRT)f(C`n%c$vk7t7r2`G`dHMRuPqrZNJe!Y1n4kt-%IM0w zLlic%`Ts68FD0X%y;MnOW%%J!h9HGQyOhR4BHA0Y>%Sq7jQ7W@RS!3or=;ginyW^f zzCnaxhlR~L@E>Ap^7qGC{9Vi;zW)8)gus|99p8waepgJZrMFqDUbk9Nwrb~lo^4Yu zA5J&nFtUeZ?Ql}NN>2OX_3*={R+Np;Uz(d)Y4YYX74Bb~C|0jwQAu8lw>nhmQOsp~ za^cH1(o#a)ksGtCu#b&boRWsST`o_q@~cCeRLpCzJ%Bjm)uGh%Sqth<4&UV{sw8zJ zi3l#bD9T*E|{y zrMu$)2LjG8v!*2iCKmr^``McyEg9*xw-{Z`0trG`i#=>Sd91&kBQ4hpKZA5uN?u-G zMlKmu$4YCznt}Z*NOU_C98+gm`A5)4fXMOsArdNZYbCBjsW;PJY~K>bLytHnoB@lMxHok z?bE4i%ZnYg8RFhusoamys7^+<-zWQLr7~_8z)xd`bclPIN3AGU#-aB;81G1xs zXV(XDK)z}=+DQ+?fjd1jISJ))MIr;I^%L!Cze#nfJp}SyqiVC^-+c=wk&4z?Gs%9w zO9<&-lM#JH>qGe2?SM5aG__I%LRQbsJzDB2?4kyS%;?HZpNEm)&8#I^-U?jov?vWK z(&8h4GLFj7T;=k4m=)X8{kt;2fO5~&7-Xw#7E!Y#x>ohDu*YLRRC(lfBs9c=&jtah)*?H}+ow zFx5(xrjupt-W>Tuodl3?GBW%0eCXdsx<`|+0sh^=EnS-PwYP;{*YDwx_a0BB9Ozq! zG4k?pvQoV*er-{i)$1=6G@t`|sv+Ww;0;8vg9ru8^nIgVWQ)Sj>e~ zyI}X^tdRZ#g%Vv0MR7BqFXpVXkjIGmJr%9)m2ppikxB@LG#^HaIjZk(i;AkzxLDic zC8JZ|+dv}F%$U}u82y=#vq5p3Z1CbExl5hh^05_EF}ey1^d1h>wIJA9pGi|?)`n*J&k}9& zR;M!C>Qi~(qJ zsgGl`ylAQ=nrQdj1D!3Ma*`zDc)6?7qg4b~@m+ngriMPWaAs=>wnw{G99-${Z?5*y z@v-L-h71U()2-{7U?Hce0CtZDZ}!K~t)Kk6;INA8ej>n?fUyf5H`ten&6M0q@C{j4YR zpr}g=?YX`_18JEMR%4Z`1>L4J zzM@VpF5AXyzdshSdW~nF`O>L4G=O^y*tKE<|6lL#ReDxLLGX@OGk`>zD7Fs)pZn=| zmy5-GzF@#>FE^cj^!vF5FcV_#_Rc!%lh#S+rd$OfuTz=Jx{>4L8Xg|Mw>wO)U&^i! z0I+f}q&FC(fx4ux@0o0wgg;=iUH)>#dA-xeDpLOMb5`ZsJzHI`P<&5+6U}N9YHr(+ zs`({vt!X$~-e)LI8N^Myy4s>a{~+|*GQ7EZtFpHLdn$zUpafv{<+tp`Ptv`JVC?vEK)D`trfQ9Fd%2Ai)Wc@a`g4eqPJs}geGSWxTsd^kzqRtV1Qo|`3u*724=N3#_dJyP_ zI%ayi+3qxyTGWs38_)MqOFG`;dT&w(prUBj|MAB+$G1KY9U*@o86lGJh%E5Gm5wjM z!(Cm_5D54L5wS|E&Gf0-6>q+>9zxqL5%KUys2^}8Lb zvLdM8MQJNtCgDZE0~vr*#Kkr2xmg5M+5_h9@k@BGuv6ocTEgZzQTju*!paH8i_~n` z2EOmP&(wgz(*fo3wCNz2_SzTR8<^`qco}fSyqpEK+r1gstz_!h)#m#1YaBg;7P>`f zo!S+Y^gWG_ij6->46N#z6+8Q1INO_Z113?qqr7hfN~&{XHXgigBStDU@(IU~J}lHU z$K%plTMhl}{x|3laCPZ)`#$WyFHiRU-SB;QHi)}KXwjWzRTzyDV>*OnJok!-7#F#m zZZ8MrX|kuQb^1=vYdR8L2CwO6<{uuorlFufvi<+&S>Y++AtBYF2X-u!mnXni2;YU0 z@82f7%W&5jo*6X!Z>KoR!;Lv??0xX7V_K+umLH%zOipg~w$~aA2F$+d169pDCnLDX z^*_jt48qO9c#^s0?J%!@z))q=vcD}7joodoT(J>&h?uEPm3!}3G!>hK?1+$K?{3T* zX!rjy@RCwnSpcCjt?a61EV6QJu(iUag@^;+w-f(S2V&s5k%4Q(_{-b1>w}Xbvof=F zCGC>4WwQ72UkXVT5=EcJO;oIx4^`X5k`--(@{+?NwwDXnfhAFfb;px zXZK{u^-r{Ah_E_O_9~Wn_ezn&B24rrHlPIeYK4g~2LBxxQia9i2wvsu*ipF_p(+3~ zv8h3jX8Yb{1UAja!C9J#7=gREf@0NOK-f-!fs9y>RF0nIIE-{2R}WTh?oEgS%4NJb zxW!Uov_IRvYn$=3R9`~DZd0fm1 zLt;ypkgzzv*6N9f!F_hLb31KiH1)b;sc+VU45xqj@GAF8ZQHrRj;)>hdH4RX|3Dqbs#>$w z8WZOb?n^Klb))|#;eMM5dB$S2R~M)qECYKbGQ!9(qwozMvavoLz{SF5j)$&c`sK>F zPiL1n03hHTOtIi=@uC}q-$sX$o(?X${oU6_2sbT@9FTt#(PC~HP@nPSzJ6s-^v^D8 z{1_Jr9n*1jzO|Jt3JRo=D=xf_@Y8SxJe{Q|j)CM4#!^*Vb+gcN(Z$*;Od72yI)i$X zyLxFTW6W9rv>&Nqz~$hX78F<1DgloxD$Y;e49O_`Ri$xKox`^cF)3;kTDfA^CHP)b zv^QRMMH9^lXc(|0F~$%Igfnn^=nc_IH!3VzVh4H=nD}8nG_xBR3MYOHFtDqhfO2?^ z4A`89HV@@rNHMv$3EtMXSWU;fA*RbQ;V`*euHQ|?fE6$r4Jzijdw>Y@z5vIU7O#_L zMr>o;KXncl<39zl3aXLWB1L=A?`L;!8Kb-SyunePhM9_{Bk~vQ>0+`X4_4cv#XHlXX4w7S>>ZnAka7tlU;U7iPY`2f!Z9uAplA)5W-yixpyX_H;SnIrSSi z=`XDxRWQhk8RG5owY(-QeU3jC-UFoVSqm1B_a90kKyCV{aX+jisEiid3Z#sKu^M30 zBkXT3KTZHp$Nz9QI}Ddug(D}#5uru28~ru)n<+Cyhb2uWBv);D&Ax<~BU0%#oAmGM zcF2jf^^k6B1y%LA8b9bbcHwed=sx4X-50Y$6;t#jUD!5K%Pop0R&0c@@S@K(a)l&SK5nl>GP zwsLisHBQ_%WKE$Kdv>QI2OA4Fi&RA_x$O0-{BDmS>pJfyYrV_oCuV*@ku4VRLtD}2?u zy2lnybA`?eGKw*{7_&P;?kWT|o99z#`clW&5=ljw=oR_QcT;*XDWlrMi7#cF^ zyU%ao@dhQkalv4`;?8eZ$~Hoxmv_KeC^=tF9InmcgwJOj5T?Ene>xd!VN&pMkEvvSg&X;@&fX2brc;+CY%3g8#^?3 zd&k09-;o4W%hB2g@I+#NpJvm_r{a78zY7EZlLuEr=g9TN#U;^HD;u&QU=fU)Nmo+d z9d6^Oc>5?yF8?^g!xrb_I5)*m*?mq!l1WL&XEBy*Ny;RMwHZst=cKA!wR)(mTT7Lt z$K~X)lNGOje0^>h?3hZ*tLyK5F*$78{B+B5_}X?!64)nqNS5B@e{l zKfrzun-To^YzE|__}vVh=e;?R9-kt>3;nfoNXXEWd&&>0bm>I{^!J~!mdBZnh(aA_~Tstfr&c<24G1PR`XWwVGr7V}|-hZP(L*M-Fr6 zt;_m`JNeI8uwGgZ3MZUFt7uD#<*_}N_qz>@@0cgGbAam-ZI(t$&pjWEQ>I(hS^K9r zS&k=gIFIhe_&ZxL%YSisSfVDzarJ`F@RaHmJ9)gi|7Y+nL{^E)!$oc5Sf94c5x$8cA(oXLo&a zM}9Y=(Cq+9g|GT^rUi$^=eRaUWY7MO2W6Rt$s^F2%5oEJOFz_kj5VVC*!c43ABXcx zxZtO!y5bTE;-I0CEH#@j1w??#y45rZJ2XsNik(B2<6;UVIm^K8N{i36EgJO-Hj|}v z7}qgn6tmrpArEt}2V84~jiu_-C9m^CJYP=!`uCa_PNCH!ahCqU^6Upa{SXR9G znJz&)n-U_*g?N+lJw7dgAf)?trHaar^X>_xXLz=WO{WWXFMGLcAC_tlb+#-fI4=k_ zra)qVxd@gpSZqf7J^z0?o>x6Dupd}lJw?IPSG$f!;R!xmONFqKJTZGUJ=r;P61C3U zm={&pDcyVm5fAkH5^Q!OaX2%9b zMoKu(wvK-~=v(atSP;dEV{9CZetM=P_oyN+7};&A)Fk)VSRyMHE#_{BJ}+3UmbMm$ zI|rR_5IDa}+hc^U`$}$ZwUWX=>oCfwT zAq3`n9&Lq8%`cd`!av%z<@^C5rK*g1St}ZsuS|1T6Hn_^p*S<}*W8-qoB>cSXT7$& z4;>(`<(SGTE?`jX!FIJyv2lj?BKd+Bk3r2;tmlTgh??~uljDp2cjolwDxIyK8zei_ zP=ue_NMOav-#?x7monTFOw(P?uvZYVxV+xt{C`;HBXP>c#FwMMm&#~KGS2PU#A<>a zfR@i2_s;(!$UEQ`$1!v*WPJex=TleEo;9&Om-VQ{K7)u{9|4Q zL@plvDGf3z+gar|&G)-HQ}fd9dpGYBEA7bTMTG~joI+j(&P&;5(t04ko0Hez`XzLk zoevW`^i5{<|J0_l)PhX>N2J5h{)S8Px4*l$pKNbOohfD%j572r%wwF4(Q!Lhff2_8 zS1}3g@<2|rSLrqLIGg>G1X@6h06YItpUQSyl5qtMi6piB?kc^aG$1?(eL@hRH~&W7 zS7+u<@Y!fm1B^@zZ`Qf(9$nfgM;TpGDL;2f4sz0=H4Y+-0F959W(BpQWlXMGPvG6b+}ypQ3++#T`0hL{5~=)Hu909=}*Z7R{)C~d8^iI1Bz;m zV}mij0*Eh0rg4}xr~YX%TWT6wtJK=cFiBINYBh-S``yHEi1Q2E&UG6Jb1GL*Mx;wZ z`}hJ(lEtO7v{IgH1#7^Lzde~Y(@|4eY~G>jT8LpO1BG(q(C2L*`c#b#kxLXSS<8xweGL2K6I< z-JVUq+dW9SyVz)(xQ8$!$&_SkErnglmx04}L9EJ7#!M_#YKH3Qq1=r3MTg&9ApBFd z*`D0-kMw+fFbQlj_~hb>hq6F9&E!stJ>^oqy>|{=Vx(%=b$eY?Xs^j7);im*&xt{_ zBMf1ms-_X|@0x6PJ#J8X-6+14UXOy2_c;Ya{OxKkm#SDQnnqs&#V`vtw#i-vu7Iz@ z#o$`5KHkj#Zn}?>zkP0 z`Fs$awQ?5_!GJDBX)+bdi$Rse{HeJF+6bH0}93wYKJ|_Oc&DRVn%m|^x5k`8sOgus{qA0I({OIk0=QD6%UVvyk&*OD6@ry z42?b2v)JV`T(1j0*QZCnu{u|#aLU%TimhEF<@kIkK0Kzgu=jVLb@&MsX0w(M@_NXbUK8q|A%wgl)T4>Ez z^Rj6o&SoM-*S`?Fr0N8YJROo1vK$rvauqJ&{_Bmg7F`OK6nSpjFB*(f+$xJS`ZF-=u;$E11r#w zP%((G6`ntSuHjaW#-pJn!}&zxM!xwiOUT}h!a(9)z?#?P{bo#K5201Jj}WIpJ`jRM zn_wY0@yWckT(qQkiPE+rGkMYsoc;nW(6sF&jrv?`p!N%-CJ^s2-Hke0yhO&BeGDAT z>k0wgnOd4tvDGB1?Q`MN)Yk_~KIhc@r z2x&r{B#r;E4Q4P+$^(w@ChFw*{+l$NCmDd-tBkxtu++^(HP+b%NDjNr7h{Wo9YBO{ zG;uA2#&F@{<>N@n8MH=xr3)PJu)wIcA7V(M^W!NJ2o%Lfj|TbL8~=UZFFK1+Adn~? zV9bV08`4N}B!PxVNxdi(VW}YUMwvaE6;pj1C~U*=b%Z~-&PsE4csP3(y6hbe(QIg3 z$v;CO;_GQl7R-WMfi9%`1{PV8!rZ1|mMh)wt#OAe3{5(w=sXmt07cpFfnva#rC2zK z-y31Q(#4*j&mLpT_n_ZGyq}7xx=pCbnXu&zeVoNG2psZ?5FjKmRKeAl>-*OQA+A;) zX4;q%ALC7JT%}O731)T|LYl!vC_gO4E1lCbJ@eF*f_!Xx`x$Q?U}6-W^QFbkUDIT^vu&r@U86g^ zA(qTcLZ(oB=zjhMW`@_qWx(hV*vpcCt?!ahhaB(sZIdi7LdflzPYE9aZ#m}0>*M~$pSMGpFDm<()BmdXgi3}c(`@Ciqk6(a zPLKbS=I#sqLM;Jh>w#`^cDO=K$ey$(94I7tq=`~>x9uAl>K`;#9)doqN^x=Xd1FiD@2TBPbAp4eC zYL^@6^FDm--hWH@_>W(igzAeP@&l|412FXcJm#mRnSi(#+aynq?3wH4LpR>{@CR;* zFy$0bQWW! zY;mSdIBORuPsz&4YOL2gblbXArcO&tu=5`-6Xr;%P%J1kbUM>?BI|E2T0SldGcztO zuCwzUU)(Ln66J%ZxqDNk64X!AbQs{BvP`TH@M&OYJOy_50q>85je=riW%V9piQ480 zu<-ew_^8PJS%Jc-B(LziW$?+X3}qY5+cT2*&AomX`tkm&6{^D^3U^GO{R8b}m~pF6P|dQ~^ZvFVq;Q3}*_}-M-z&P4VT;sMqFiBH z5mF=mNPEZ>Fb~GOOH=%h2&&OjA*K)lEnr7|2y7~cyH)0pWGaL0hR1p5;vCu&`;xa( z6yH&wurpR7oAOS_#>^Z#U=PI83&rVuHwgB@ZSQe+7z!W&Oj;&K^BWlzmX@Zb+*xKG z%0I?oEtbq?0;s)s+$KHhYv^hI!eLbYI*qaqYe#*e`V~P+sX8z`KN8vI;Y(2m0R~)8 zilDA|C z`DkhYUqfS^kOVbi&4iB-XsJ^0vRfP zRv}Uhk>iE5(c?xTnGyrT%0zqo2n!4Q@ZcP5r~|S+#r#B$z)W+!)ma!|QWxT*a{~eL z*nfNo0uJ|Z#eP2vR;UJN)Bbi&AxvV#^%RoRTt8;D_N0>)vt#pY^;?V<9m=uDjo~tf z({8dYC9HA{N=Pr4^G>?m{qtm6%B%JEwjDY7mW^)qUJ95CIePBMEp5WXy=KQt(p=AE z=*A!@4E|!H>Ld)|niC5=6e^k=bO}eHinHSvqzPXBb2$Hp0jQ9HuN-{`;tInHjSvGf zAJj`G%?(nd%M{&|G_8z54k#ZF&o{1~Y9VldCVlC$B}jt5qSBj~m>P$iqsud;iJk4@ z0fMkk&iy30Ldq!aHtYOg@l;t#7!KCf?j!mEl#@tef>TRV?S)diLFqEePm$Xh)q7Q% zV1M3c@nAe>vLj8$f}B@O-~ zA|g6kfREZwz(q?*Ny-Wyd%*t(EG)D#*swuHB*1{??+=x3U_fYanRx3O6$-5UcD}#A zfI5Man~8^&8VZ$z6d45x9}5c!DUTjqYRy1qiLp0-|8?{yoJ^K13o=3?YJ9y7!O4(J z%uLy^TZoAt7VDc)%4ofb&I@a+2T% zSJ#$=NC$P6I0*QByXu>Lb2Qm3mnyVc*DKRso(sl_12pw|i+q?Q6H|k~|H8SHp3XOULs6Lh`9neRrxnd>R@ha)z2WuefLinx zjaf*x9S^YaUa8U)gK{?Tq&!-uj!dLUzT`{F=n)LERbtTT^gLf0H~J$tVccLs7p0U8 z{7@@d3~q#OJoiSpsW>8*sx!*a>wA1Ko&+3XenaqDNEXwnZT(tx3`z@ZCV+7DxnMnVec&(9+t%=cC-`I!*d3j{$ zu=RQ6;wjr?!wr=RFyn~hsk84J>b|B5D8LfU(DGAnI9J&f?8c*oyT;vgzcD2xgR9tG z`c^5?DT-7G*8OsKk(%^P5+uUONY6;es>$pv>5msIgkYV0#igmY3cc_XTd%Ab4(|D^ zfiONh6Bl=IcmHzeX|Nd@b3848;rN4_v1@gU0U zn#(sTHdJxXy<@C%MCaIK?u`c=ATtFw1R64s_T%tTuGq5umb{T0ohC43tSrjK(YRcf zFNNlKk)9r}sG?^=W@aT>xjin9gC{z4G#llZTq+qa`!nr(BE>o7I|opOB~?7e`qr3l zANA5;8|vwF)8||^uTL>qYH}A97piu$-xJ-P&$vsivlpkdAiO4X0LFr+)?Yu%mgs5W zs8BSnl_1BZu4bQ?_-Cx_4^V1ee%AyDM`?Cc!Ml~{AVXA*hKmJvd! zpTC(8eB`wsHR1NXVTI9!R3x`6d`%Q^mG84{W7#%(W24n1q-j>GDin{8C{xNNJ>0+0 zpu0bP{}Bws!L?dcyPi;IGBYnB_}(+i2wr5Wd$e;)6f1_#M8wKA zxjCYi8MrX8va?6SdJ?3O-`6Np@qTnK)D<RK_`zOJJg5ebIOEuJg2YGrjlS8R8t%SBPh z&1lBM5+5?-TEkJembHAi_f6cdj<8ok=WbK4<9+70p(iSDrk<;Bo=q(-nNZlp-J!oJ z*Wihzd3>F?Qd!k27N7hkoz5T!Fqsg++5uhRyhasbq1aLZv{Ph=m*j0|N&H4&sPg z3ye#Sb~wD~B#=@g{h8*@X4K3KbBjweBPtbYQ+acDbvs|Jupf%Pd>Q7%!$)^kbB+zM zZZ@5j6_l{JzAlqug?_WsZh7T)^fEv-R@g6~Z)k%{1ZwA;_N8=!_$_NZK>{m;m4#%n zUbFTqrXrY!_m83=x^3?t1>$yTNd?6aXdCsu+J-P{?si!RRLJQDyix^n=Nus>4--=65#z+W662LY!YYBXumB@g?)y;kuXN0b1= zMZ(=&(os~90g?E7eI*cKNtwzecLEODT|yvs-rU_^3zO6nV^?pJ{;RVytd&Z=Hl40? zS*)1NZ|cUEUdeTL?l>4MewTZubXsh7^RDk-TEzy{vzY8<>g&Dm^lJeNXqIoQR!7D$ zQXeX2|L`_jyEFz%=rY;xS*+gABV;Hg_xH8BQ~iu6q*xI1u}mLA@1;iE%2k_}tK;h= z2D#r?%K_#l(r1{<6{~d$pXZ*)m||Vz$FC5tBY$%N7yt~drAB?{0(n~6mrFztfcy=z z#2qghbg68BI5DxVyDl0eX}en3UN$vqgy_auA5v4=yAUX1}x=XfscH!bI;8dX?r2VK*a6M z2MelVA+S0Vk$WS-?Da2a^jfN)AD{5ubqqW{I+ssktoF?RlnVUx__%|s>zB#X&(!Oe zUxHlB`4d4=rwvI`QczMnp!ILQ%*6lHTa>q@@{f2M{1I<2$=tJcV*Ngf|5JThN4q#= zcEbTsa!9XqkBodp8>le^@ErJn^CMXNe);YGpWQ(J|10ADKfi*Z=W>O+ zzG(Jr{{P$vzP);?#UfUQ+|s2Sk)T1p8_0*5Zz{5Wo|$%pV~N_7CJza%Ts0vJ3;jb9 zfr5gHQZA#KE6N_?N1&9KKgf)`_@C#2qPI*8G9EQj1SrlZ+(Wf)D_(!E@8CNDisPGYE30DnkTC;i)@R=@io_&js*Y`5Fv@%ZK<-Pe6b zCcWH*4JHsssE>xL;P|3UTqLDy3(QXQ0@;^8%wY~mlpUTA`(a`tB4qHd^$N6#zikiF zFkmMbH(1))g`;*WY+ShXv|=DE zrC7Z{PI5A^q4McIdq@*PH%|WK=9HLL4!7i=l4P&s+Nl^Hzun)Gef3{~NLiE~{4-SBs@qKg&K(O;#zq7*vyd ze`7sg;&VaXEV*j^PR$3wnkf*kGqY`RP~@=v248-4sNM6qbsDFp$!5ORqkqF zhKo%rkulfnb*hz+Tx!rr>Qt`WX)*~@ZJzi+5EcQ`!Mf6`S^t*^@XKIeI2RS7COI&Y z^h~M1H_pj<&!!9(CvB*MF!9ln=6^d_zAvo>7UFoUtKK`18*m}5xFj68+G=k!kSH$} z`g*Ya?KeD3F{=lWoxa<3y+`zN*&18mAJP3r{k}B)Cr+=&ug6ZG|>-3CHADtOAO@XpubA$cs@V35nFr#>U{IT=rG}L&w>wtEwp2A(&HvB(<@Bu zbc-@D8CxC2S+z^eM9c}56)P*`Hk~3w3L!vzv{~*=w0N1um4sk6RAB?sbDHTe*DP12 zbPU(}dfF>2@<4%Lp>7W>(R9A{1WY;Hgc9F+{+NCM`1hkMlM9xU%YPaXRyb<-z?kOD z-LWX$aG2Ssx8@h|a4p#&nUiDJhBG`d;PHXg^#Mn9Tyct&79=b__5!pCvi~?{FjH!3 zY$R};<2g{EoZ-r5^Qa2s!#NZUWGO{=Rz@cd-SFC@5C0x3&z#ymRw!3$Y}YF8mTy+7 zR0n@$kNnSxr1iCdZNeWP1p#Z#^7yiz+Fs($Ux4D8x^`9@7y|czF6Z|Gg@H1OU9_q| zA=68QhlmU+5jeES@5rMuRC@t!Ni>{q!c@yWSQDlKv@=6-{0AygQM1v=@SwkfYA`Xd za}vMXv0!9ecYD4c&RF(t7tNmKYE;X|%{ z$mW_UbZICTN`xg~B%Mv2uFo2MofKbe)GJvHDAr09?kSn@RMij+uyF7j^^RNZR(WHh zUXjdH1_fDlrpIT1XWNN#ML*dJ)t#M-A3|WQZm$M^%Z4~##z#GRtw5pl@RoFcWfq36AHr+JS(YJJ7vHc zhX0qN+KvAvA^rr%vfYJLrNjv5PK4dzk^2|9nqShtWgJXgAKr`(#abQM%t4kc9$tmq z%RhsM$U*<2(nWDg*lt1PG-p^r7;%%hx9Y=^7CFoVDB8g3o1Q@+f z0$RS+qdk{s32cOT?t+d5#S^D-w4PkSTxiCs{yS`_@bTUWF|#e6rqGmGv05OfWA`WA z@%^D?QjSZ_|EDJ|Eo5W@x?wkH?g%ew6ruPfboXq ze7a2M$Ek9WLAcu7#E2o~nA;2a>&zmj;;a7FVH}zLq+=qD0c4%@mugrAa;}QAv!(;{ z*v`ttLdRNT)~aBCl=GtnURNj;Aw$1Gj0}*M8U+5HE#IppKc6i{oI8)tv9IfF4&=er zxO*5g?f}1I+3WlBEI!Y7?<+%xxwNgdadJX}fxh_=-|6im`@ufdl%GM&-A66Rgg7XdbQJ%It*)az3+I@LAgJ+! zbG34W+>S9a6gY$U0K@zvaDBXIlT&PmEWki!YuS0H_zyAkUR%y~?`wb>bOI)8sr`Do zYu1bp@aiYcyA=0228}73^?1N(R%MoqdcxCPUBS@J8-Ny(yUsqku`nm6`*12|wIJBi zLh_zo7@-=|*7E#`K4xT^+_3&9y+QUL7-SI%^E?vc!D^wyBuaC+(z*>zraVwsxn!E= zwa=4anN+Y?IfGlx&%rk;E+Stu4lBa3i!mkZmuB#)osPwdC2N~Go2@mlb$;kl-JUcy zIOAI>+32`qu=2#ki3~aTsL8}}9&g+E9X7E~zRiYXa6O4I@*YwHVL zMLv`1eNrryt!}OtiXxLS=A;PmlP46pOjc^YgRuYG z{DE%Q>+Rq;<*bg*@ zpCCY>tT4*%Nr>ZXK9A$C!*!2vA6O&;Vk1GEg0X33JH*1os(JpDI4HyfOLXMljhL*j zhpCCHRgjykNNd_I=Dbofn<=;;AwCp@x6d$8UY!OUs{_})wUF#M9IvM9yjTNEP0?Jm zRCNsvEY8xw%k%;qS^j7ruYvyRfy?%L3}aW2zVRM%K+Bm z$b{i;Jf1qhR*00CjHX7XjhRxUW3@c{>&8=k5+HaCbaS<8YpeC3&tWlbChNz2>b?*a z&0a{6OQx|RBMk6=`wON_@OJ38)J412DK;inRyyX{MNpz4=6o4lTwqNt`zi)DCiYtL zjkQK?sBlV;+tcj)azfcrg^k-FN32EpME5%UUrLn^)k`$M8GWvxohyr8w(d4W&HgxP!jE*#x$*WV&l(tGh!F zLV6|}x4dGN9FBukt!vsYmD9^~dZ<|_`^bHCSv4NBM+ zZ`sogmbQHzV*ncTg^V69T2r*L*+(GkWb+ppggZ_53XXlUM}dl{yGeUd)IVe|F$chiG!2>KHpX|Tl{K&Du z8N=Fm%byAzfRb6}VDF%-2Nv=W<7~WH^Z(R`;(zL+1$a0G^~JsavKu)N$+5NP=jOt1hM$i8^jUqtZqwjGVo8p_}oyxG&HeTnHzK8*{5zl@SB z06jVpq$kCY4stpvr1X3EsVwflYIqyjDO0Z8R&6*>w9Olh#CF?1YqT#JHPVYgiy9W3 zq?&st(NhZw_OxE0gR<5>UAPG%RVY`G7q;~9cSe_3gwKE>%HJOQWieDMrrg+koxV;= zwnR%txS=}&ffBtZOMOxP(qg=srJ?yJ<&UAp{l5w);79AqAMHK!nWM=>M6x~5pxjV_ z^N14ne=RR=G+)&@&%z~O#)lUZkTa;4j)h;%*KB8)DG)I*RPDGC(VUy~+UC5?Ziw@3 zC9`#TmD+ZPb;l+I>IQLM)7$Cwe0PWkzo}rqnGgB%>2SMgHob#ea@TWm-&y3<=yW<; z_FheqAj-zL^P0_M!%7mOLKAV4Jq(`;Zg)DLwePR#Y_X$35lsZhOzMiz*y3q#6c~-F zY}N?%=X>teM*4A7$<5N|aM$qJV?{z|CRbzscju0~hhu|&6Z>08GV+`oQT8DB{?GSv zXCUtH5?pr-JD);q-rDy}q@c{7sZlAp$kXD+FY}#hzbp1`>4%Iu|38f*u$b+4##u8u zD6-SFI}YyK;B@EC1n1YuSBL-ZiDcm;Aa;1WZeMuqjs3dhrz&NzzR|n6TfN;7eE4*? z_Y{kDs#|!yT&~e?Zp6^XyuX?pAJ45R>%|}3znw46c_m-iFP5vS-(=JNFLot`SRI&3?2w>!nUJu&ly15%&|{%5-w!m#6u zAf?9$y^F80X87;8{P6vPNu$zCT4g2U>8tN3DM?Efrs8dX$T?BSG~)n2Z0FCr_&+G= zb9`U?_3>8D7u^lE?u&y?2ZHN8s|gl-DCtU@He}|e0vKF2x7FI7%d>}-Y0baShH55m|QwP?8U z1{BQiSLzlYkIgR`$v??h9yX7VH$D!|uEPlk8EuncJ$e{)~cEPn+@gPKB5yJ zW_sYC3nk-j+iJ=D%ow7RNk0v%-efYWC!Nfn0II)?yGmiidw)NNJ$?MDdegqX-FggS zgse`)7YBuda(NN9UMPW_DMclod7RT8LX@hWupKn7CkjBtgA^_0iuJ_6P5{{V1^l&-Hmd^8;@t&IbXa zg9ufaD)YTKWd_@Z_#AvCc6nRpdzU-S9kYoEt;O}>k1@%PRGh4U$*Lw+6r(#nqR>Pd zv>^ln0pm4o*sGZ?Nv@Wr?{$^IN)CdAGUVg#;zU3x@FMVosF3o1gL2MOfU>c%_;|!( zaeJfh9W@7y-P{l00)N$!5s^Q^e}Y3o$cjt?phH24bft|&)XmL>DqxobM2IKF;bCCl zq9Q})23BGBF^%!{c)YKLQRj=Y{eb55{IvkcTS63J-;ggF-RZ3e@Os|AiUS)G4h~em z`uWYK^t^B@Z(_QLP~~ui!pV^I)*49&$w6F*G2Y+^ZNgo=M^ECDvuj6*H&WMoUA>y5 zKWC?r6n$tD)k(=$Lp82kN-paI2=R=pnlj@CDyWJWctzKx| z6HjyK6T5_3ykntgpvcHb*dGL?C7ZS9=lt+XDFlI3d6Rj%?}!ZdbNAD~<8F{iVMRfY zLo8%T#evoYtAVH(1QG*tLA|-W-K*~0mEH`Fw0!hSK}F*_X?^utm9$2=-LAH}LlyH> z!smLcpUbXv4+O>&KBv3=>t78Vw|_gGR%Rk4%xvsj!h%VaK~)0-^S@y5I7tCQHLIY+ z3Cy>Pf$jGQc-&oX*FEpG!Xd;8rk7z@N+s7@jn_B(K^Gj>)A?m;t+5Q+Ehl3MBsi&` zSoDRgD7kok@zj)h_C>>^MUoD$KpFA0x38YE(Z+CJjJ~?sT+Z)C*y)x zBE!AG-c)r3*&rkqAML0&ki3kjg`Lfno6b{~tlSpGni-;RRbjLcn zeH6)h$>Wv7xZo^X2-GIG#dEZff38*0h@7h}csy1kO;m6d$yaNB1D786+c7Q%3m4+f z$_=y`LS*Psg0K%5qBP7bEX#r32+nx%-UL#{{LZ@?>jNX#V z7Xi|Ewtr`M+zyB9+V9EbavQ9#0uP8A1c)2e2#2)9jvA_@@348jIr!#Fp+k@XP4eP2 z%5}-1Nwwh$CZ?uGdzKPtU%!c^$W_Xd&7UH{u+Fd;gZtp914^)n3KJ(#FUKH0r}_xP zNW(3ag&K&bm?0deCctAvY&DQfO-#oelaE3X8UGDYd$7a06~qEr-2)@yRA6DEUtejB zFUhNgAD1w*FgF|{!f1j>mIks&x~3)*SwhUxmqYC{=7N}AkZ#4c*NLZqbm63tUIaVFBmWb8f4tX2IgqWC< zQJ(M64SWm*^Oj7T5+M6)x#H||7h`^k-&B#9=<}idZooq!B$BIIOWsm;Qs5g)6aBgR z^x|ATTTt#&DYO9V$K7Yl0xc3JJVx5*+*zHsJr5E*ZK$Y9&1AQMo(p(uin)gp254X4gt zn<2D>rup*1d;l{;^W`~<+s)p{+$^F%BZPW+vZGx%FP&5MM-fxj)2>&gPkvNGaH+bM zjEe;nX8jqy+gT~`lo#j1)seLc362h~<9M5#E_fS^-*t@wE;njWx&LVW_^7M!gwPGM=IFwNOfgm zpbtBHcdj}Hw~Q@W=ByL()R?!M(e+U)uoUH$cY*bYLOBX(T`GUB)ogmcOnGm;#^Fjs zq3~8#_i8&EjZW`sR*C9hfb4)C{;&NelTg);ZY3QoF zee-at<@0sjpVDx8rY561^;iUS`F)=&h?`DF;#;zTOdK7oc+3{nplQ>gTGUd+ZOvEN zY*VB?+3vcXZ(MPYkagolNwm=GxrGoOr-W17|LcDt>~M!tCvo&a=~&ivcxo-J~QQ`0(JYjr!J+kJUk9;89wSE*1H zCBQ*R=F6sAP?O7Yy`66aT=Scnj7_T5niNp%cG>U0Lde^Jp|bSgV+n;4mj zQ5x0cbhKIhz#DtP*MZXFcD+#^Z!I!o3tKCv-J+-T@Hxw=vBWxTm4L~lFE~KA+B_*J zQSI*p!jtYn_kKl7AqO6L?p5Hge7Wb#?+NN6k`ICz*t#cE1odc^?-OB!gt$}o&46)8 zfPB}7g<~fPttC4ltlJ|FV|*V8ApcG z?LhFA&hE3?-ugT1C$0BcS>rbaI@-)T`IPMisl-J_ zuRjv_$Xx6_z9d1QRD@VGelQZSOhGW@FPwnH=yrf@UzNjkIuZqG|La-KddvF_Dw&au zT>t!1rDAFpWke<=A>Rw&M!OqhG6*D|=;>g3*x#Ag|KkjF$s#u>A1iP_Y;!hFHHJ)DY=a!OsDVbjSU(c+qM8Z}=IZL#%X&>5mi62|%->!;_2LxRH67?0?^6|}8_5+O45 zfvQrb>i5+!{7^|UsylQTn23mus#2gUWADEW?Pn1Am%-OF7w5<@K%{!20QbE4c}|1L zZD+lcpOPo%Uq_eX= zW?M^$97`(Wc};WexRK zq2%=6E~zvDh5`vJsmjwTX}0OLG-pvP*EV6%d_;NKM1KKe^^I|G+&A)J7Z>9U4M`Q% zyZ)Rk3|j4vJC$g83OljUQ8SM;7ZOIz&hjJa7hhwG4iMRNCt@UMTdNtHmw_y2D zWG&9r2Ic`%DpMLH`GK~Vwr~u$R9f9Ok7u9)fj9-4BgaMPe{EN$21e6!ZOdXHme%Ut zE!p1rFk8J0dP;@A;B|w!m-;*af3K4C1U7RR#5WTt0#G0N4tWUv9{~SA0KfLA2!R3; zngh;3V1s!61qw_Hnnsm@t4#+JJj_DjZsz4~`E{o~4m*ILU?PLnci1caR^w_|(b4!QQLRXGpjEBM@*kSZTy7MEvuH%=zS|2!$*%^fJ2rX^e!n!ED{wf zX5;8nZ_3o^lg3XNIl2d^JRSX%C!bP5Cg8?Zx)kbM=pjhn(ZTl0*_&|4&b_DdZN9{ z=Z+jZcEpHLPqLl**K>w-2}A_N<58!RmubStA^j%KSP-79RLP}MSvI9pqC<1f@!fkY z*m44NY7R|_(*yeS95`y!WXD>qis=h0SFCto<-|=V@7L`#Q1IJ$cJkl~|FJx#4&-OHn1C&P#J8{OX z*I@!kkLufN{N#lS9Wz>yd&QNIlbw|6?aw{RN%1O`26iE!m3~Ik<{E$(jMl9ZVEJFbX zEJjk%Ox0FB^}?vN8pkl9Fi14IqGR ztJxC(+lt(=!vPi_EH}Z<0tacgf;j-RQYj*9e1yRpK*U;QE0i^EXK^mBP0)wDZXz#V zrIOYJ!C$Nz#emr;7PE>5x&{k_jVX~pW?<$EMR|<|rXd)5Y=hvf16nDQ5(?O_tLBou zV$_0uYZsWaM~oV}3sVKvNN%BEy#cnN;@)08@s=6Zt&vKlgsy~yH03Alq?X_V5e0K$ zTN09h`amLVER@WH9Vb{>_V~9$Yf$j;{3KvHz*He~111JcPS%ZD4*O`IbPeZ%l-a`N!hT;QSBG*rXzk%6 zuukP%0GNOI%T_3BPAzIDgs%KG)CA>b32gwHRFg3)Od6B8U^T5BpVgskT)af34VEy^ zM};48!HZF79CBXZLsA7JT&pgiLm|oVz-L?bU8`EF8YoK8<)9S-EI-MGUDXree7OK@ zOJaS9I%b{dlgIC^Ljhim^86#ftRN7F=BQ{i%h!T(g*=LYi}^jGe+w>kZzQ68TEkANi(EA{&ATN>k@%GcBw1Ewh@Zr^uQ6<0Gb9e;O~_fNp9 zQ68TEkAOC0?*&91`c=iKk%ZMZuS1K3SED>U|4#v(NZ<~?0w>7p&@aHNQ63&1o*#l& zqdYu3JU;}lMtOL6czy_8jq>pD@caJUl%AdwkIv6^lgA&aCkA?C zMP(0bTGPj`TFvU!y}iAM&Rmp&sLkYwZiRjd-L6zH18@yuY{rmTC-n@PD>dESE#VLGmBM%P`&;KA_utxFi z@wB*vU%!^+_HEyV9%zbEpKl%(IQulH>H-UTkw|1p?*mxuX1j-_&NjJBjw@Y;rUR4Fv(yOxC@v2V&;K@GRHLBwRBFn) zW@q!5M~}l3@m*P&5gQM_8#cZnE5HZ^7WhdR(5cGNBgfVnF%&;}V6yw&N zK78Q7^@mRm@0_AWiXS`QPPhY7`dZDw=Yy)67mM>FCXy z7oMwz4`@#@xETu2w5qsMamP|+T#B2iRQPoV@SOEWul+Lz#8Z?+BEehl#bR&(ye9pB z1bgPx<_iHud*z4o*Mi$6`u9f^mwz6d|33zoOv;8R}4^zP#`n36bDU%X?N6CpT0+745;RyZ+SfB5S zUL+8aO+ka0eAyVt*9}}p=y{LpH4i!X~F!pTPb}j zwN&X+v+mT1ldF`rRVw*=p8iE(c>Wh(1|?IS*|TN+qZa`*L(wWlaqoKbM)zbt4;l0F z+WI|55~UPPiQDua+sY3=jDC9Cyi*S%gcMz=Wxt_qYvBOP9ZoPeDOJw?^?zJ{lPVIZ z&E2aloit$Y)W&zrhi;wJ1|-RniOmiBl%q>Z*hyF_jg) zY~kv_#0;>DJR0>G-?=tKxpivykqdVe3}s08ga@%U6L-FH+JpT`X zZdUJFvE0PBdEcJhI(6>S%)b)&f)3p?Z$#N<6CA6z>fN(f6MxT$piqiZ^s4W%<+if_ zuz?+$)=7v+V3Pn~3W2(bdU2_;o7<@mCIbfb?c1k|Jn}saK`J@QJCVKVIKzV_iPlsPuq-eLA(M z9UG2SJF>KY&v~a?cIiE!PkZ&}gq+-Y4ymCIl|^)|;WK6Dbr9&?ub+c3J}MQoiCP9` z86h`ct`zXYxi~Sn69lSP zKtHlFAkX@%)p@aa{ym^${u^r)R)Ta>pK^T0b%lj_~I7`<&uYjVVX;vCf+9H?koEMmXs z&hhTx(l!T@gU>DjNf_7UGwB?(N(t&I??dkRm3CY(;bNA3WrR`*0~ZQ|CT-Mdp~H}8 zX|cYhtTX~vh4xd|gCz?EWBoZYUVByVdHdZP3sP*hs2pG_GeYeO zas%U6v4H~y?$Lamxg89G# zBg4ep!8rBFp(im!26x-Z$O0uI08Mai={U>gV?c*$e{P*f0yu6v`&uo&D}(6=6LnAn z$4OhCgAP5pYq7JPV<{J>PNP>v-}D@%gQyBly%2;$J7|cA$wMG4XyUs6=tXQJYxd^MK z45>VQ59m;?R-k=phB7d%;9$Gw=FtBX&w9$_(WJU#12$HbN|S#sjKOCWc7+bkzn zmr@Q^-gO7c!9o_MG^yk`XTd_>QdV;heF6bi;ryC>j~eCS`AZ0m^+h8ac~_}i(ZkJo z-uZA!9hIhUTEWEy%nUrK64WY{VetxAPjBz*SHi3HsBE+-akk@RA?MvU0k5mqY6lKA zu6PiVcphdFU1NRD7&NsoH#at>QeF=ku|42(L~v;M@=LR zT|H`Fuw6)4Ok!gAr(+AYzswSw8JWkuk96-Zl?MBmi@>I1QyahL@{Z9BS=A#DiYR65 zyOf;HbvZj-yD-+`qt^GER?HpdRb6jLd=lm+xsie!F}!Z zlP-M*gF~Z&3=DL4EgI=prEmu~{5Hglq6GQ2uLo*mA$ieO4IN|nl|c|RGG z(Z6i6p+LOYw}0)UIx~dEJ^#+m6~6m!8~n0aC~@cbw9_8k8ALFrvAjRAs8vE?3el?;&P}W)w)yEUd|BI^b!%2_IdEN1Bt3aKfTA1+b*m8g^47XFn?!$ zm`VYr8!3|f!-})-Yn7L*TeEWep3COC5%(@XDKI6~G)PKLA6-4JWg9pY2|1m$Ve|G1 zo@Sf=T(fc05v$_#w$1nI&RP?4eYTvU&RlxCYW<8S&ksZCZa&r<-q@O=RhqVvXDhml zTJreG(-+TQZ(NERR*^#~;Y^hWxN&75GA*6PFq?-}tL|8=*WyF$#X6Q8m4e*E1I?xJ z`y!AtC}xV%Y0|vxgq{Olz6-W3;j9bs6wszh1=&H|zHGLgPmOyAHm+W`MJ_hHeBmEJz{Pi9%gHJt53WLl(p3B_kK#5% zR-Sb$RYG4!f`%=L&Q$|)7c%<#2BxOwj3Rs3!UMfqdO?0{APZY~huQE&1zB@}ZPgbL_5npSIejdgKv6q|SAwo40Im+aN7TI*43*fX03xlFESXk=_+YOE(L z=G*4bD$t$^rC6kcJIh6+|Es~PQJ#MSfxaQWs)n796s5OvYL@|RTju263kkq9%gOqj zCEzY3_|>dPr^R6uJYrM~)oSA6PiGcQ-Ty>{TWnku41{?_rlp;we!%Ns5<~I$RgAtK zh6;`CCoR}6%Q`!<-^dgUQ_JMU;E@#bEMb;z?A5hbp8*2~^zPZcTq!FC%pBH6)&N=r zpBh16=AypD=S@WG*DYB;q`~bd+;C)J3xi6QTmS${+Zh=-RqNHaU;qC7dUxyOVkufY zu49!64{q*V(YSeAi6V{FW?+@GCKzR2*2zFAcCFvDPu~Fp2KMgU*1^sM)VD@qVCKXD z8O%L&`Oc1>d!L6G>R`T=Je_i^yt?)7GoXL}K0Ug7yTYoO>fE->uC>Ee9?h*y%*wbJ z@7lK9t1jBGsD`xA)5X0}>>6@8ZuH#MSLgJ&8Y92FH?P>dLKGx(4hrg3_ zAV;OvCGq^K)<}v^?$EJY{{aK~_w8NX%MnYh#{WpfU!B~_^YHvU7+St(`ShTY`Z8Iz z#NK<-kS;Zc{<$Z*Lvh!N1G}{`))gkl2A8PSyGxlwx5hIkj_hNqqu8{1{iLNwATG=s znBj~{Nl9!1?(J*dt;M@*y=uCf)2i%;Z{yA$*-q!k(KYVmb_`5_E zSfc`I^s8ahmz4JK3A=Zq&5+?>x#?7`q@37o*aWNbb7!nvzs}mHRrk03e2X)OPTt;k z?{R4XlO>hqszHJP^txzjhteT_%a2TK$zC~uWxip>ZYP&L>RH9M<$xI_^kiA_A4ARR zADr7qmYuES9!Q}UZ~n7U*IJ+Yj3}mx-Fzl2`osB_9sAE6+`~!PJN0vLXo{c=UNNU? zv~Jw1^&caduth6p?cK7tM18NY(IcEi@y8#=9Jz3+goNE)K$P+y6wVe8LZs+Ce17Pwrm ziLw1k44J57sEmF0DOu$WMM~)1f1-z*XHHU}b)C*GB@HQwM{z-F-_C=_j+@k^*NT$! z4QjQ^=}_J6?D3PWChs2Arlc%eO0GoamHn56w?=t>E->ze*~YGlU%Y_ ztC^k)j(t48*1}MvBN5xURP5Hgj=fLEfQzei1aziUed0yb{NDbcwm^r1Jp2W>L$&U2 z!xCDRH)Di4u(TdDW*P)l?KHVh3tw>9)f^add$W#GHe}YO13Nd@DQ|69!mDFLe_Ela z)OXp*r2}Y{%E-O(^;7$enH;r3Mmg3=jC)tj(I7)@bLiIH(uNc*G5mAId?PWX&Tp@^ z?l+@Nv)6%n7Ve~-YrdQIDw~iwE>s5&DR6nNKsbR`=o^4a51IQ zg{3dwI8{yuJZBb zAxkmX_$Ftsov-O?!5YgqKV^<;Q6V);HDS%6QBVh3Jbvc#3U(5(-Z8;noA0@Al;<}D zhUR~9-zek@b1iR)M*wxk>M2H%FB_3?W(V>xnD5NX6^kF1GB-~OUy{4V-uL-Y4|3@LS@IO$a0BW29 zkerL~FG!&h7K#G`#0w?Am0$sx+^D%|9T&)#ja0BOMU;hmye3yNpG1M&S@L^o65z;9 zha-RDdGS~u?U?y}@Th>W2JKiZg;Oh%0_gySqJRMU6qz6wmP-K{IQ&up3g`O^!Y}H1 zel{@h3-TrZf)F`vIR89yy^0JhKmnP85wwm`Qi~!z3umYCW5Wwb6!JjwdlnT%ivphP zAyD8D$nT@=E;>zZzT{s3R!kc%AP>%`$j}1E1!M}#YhWdRad5=cR-Fqn%qbB77 z{w|;ZFYTN$b^9%Fa9%`*W+q3RId){<{(ZZ4?SAqu3~wbXQj-dVB3eGObEEq)*`P{! zJ<7ww^Na8`YZStQukRf;V*?FJjPv^;qTk+q@HUD&Ab?>R@#akHjzeF)eDVCn!yYv~ zTTk9uq$b5%9|X+x%U5Hicxx`_%frL-Zvm6CNDGJO8+)T-9X$gBJrL69Ew&+Xam_+L zUq!y-fDch1esTrZ?GRV2qpK&;df7Jt?+h#Hw|x1^Ki6)$dw%`3Rik1-Qiyt! zO$x|;nnIvw06}=59V#Nb1dtUu;NB|%fEZf_C~#iUu)t``=9N~2A4daEt>Tl{Qjjcp z{yKSG!#-0)df-*W*_0Jadzi0=@Q+r~< z<*O}83c!{?>k+lzmv7VonwZmI1ZWyqTT8^^khc$x07uWoXW_$n0`g3oJURN(sbfcu z9)0*e6fH^tBLrWO^1;nZhYuZm5h}GbH_}dx1$~rq)~#b~2@$c4@zF5m*_E@04w%g)<;KboV4?~_p58rl_{fPNbXS%TmfHx3*;{OHvu=p%?E5D1~b z>Cqn!A3k*W(D9IjREZdUsH~{-r;Z*vd?r3i0hvNcqXHhk4oQmr@bKX28#1Lp#B0*O zgFv8?e|-1q@uNo%A3gdM8IMy%NIn$_|8n7E3EDoaTbn#jEdk<0G>5qk_BS7eJ#kEk zP+8!~GB+`N$vuucqC|)o3mcjT=UtEjQ8*U?4)Hx#;K=>xkOq<>2j@lLya=3EE=76* z8qfR=P?w_Qn2^VhA3c8b@WHdUIW(tLqk{t;K6-fP&J!hCIbyXe?dju(_wU|~NmJlg z0CF<|*wkR&=cI*i+Hi=%cj=?2CJ0=dgLsn4axJMvUQ!?;5{Y8NKi$n+PPBmfivE|eLb^Zs|Ckj8yVoCWN8a28jG8dL>DY~S;1Y<|Oz7Et=GIR^ zAIEp~?=fR9E1==QxrKi1#((Swaxw`HR5(P^Ct0-m)h!JTf#mX!qJVOShb5MEJU4=xAJ(;75}4KEMkO=p$~* zkyQ@)h8LVB^CUs({a<@$0Z>))HSqh24rve&1f)Sw>{jgV?(WvLySqEq?hfoO3_z4n zq>=7={l0VN-uHOm8vEC8ch&n__c3$kOx`=^&fJ&*IjsTRPc>YEUl`HQak(f5Wyl{T zc7-G77peiYf&xK9v`}`&a;Wed!e2TUr~*b&+9rBqYB;wc zK`1lbCLp9+OxYTk2;_hJ*v@OuBR;&3414!MhPw-LPHtJeX8*b9nAo^i*N)%*KvC(- z7pw>l`w$ZobpGT6=8{5yG$4IaDvFYd(^4}ah$N3Wl0$=6Bvs*|pfEt$e&9T5NpdJ@ zIjJmNFlhFI_@Hh3PDVwAtzEqEU6vFQp-cO-A`wd@3Ps`O?P(M@XV3_6O9*1I7%CQY zXr52YF;ay>h60qlIJ1P}xPgNv?8JD=vOz9xTbBiDG?Dwp+c%#Cj&sWgn0fc6g+Mb~ zs@0s+;DDs)Jiz_t;a)9@>*nt6=;&0XMx!%#f3xt3?qlmCKky{-i+Rp`sxn={((Z9TPY{-%uUt&3n(_m+}2iNaYG)a`=*! zJLy&gj<24*_rg=!o%k-~RZvi7KAtIfK8eLpu!IlcIR#=|P(v^0SYvpSAJ$-Pn(r5G>@7t@G2CY>JAGE5br4 zV%~?pd=;FFWsyT(SU3EGB?oi#DkwBpD9KAt%FGwOe-oOEWl_XM1_y_{fzrrvArD1t zM9|BZFEfSURD|9Zb;C}nB*)-Ej1x3vj|sL$<4_~%fz#~AUioREmww# zU`dXzm>EP`lIHTBC0ousVmySfbL-Y#j$k}s0qFWNCy^pAGvVc{poFyi;*1YV7j6Sd zdSWaTNhXs?igRP5ld$p%MRa&@@S6ycOc8qbX6SfBpg!g3g$hoLwY| zdi^RhBcBKqR}QSa^a?t!vXOsI{`P?D@x|j!CgXZ#5LvFE+}cj6D1RHC46|~h#E{#U zPadf0&=6Q^(I(*)x z17p<0HG9hB$?~m02ZnZrW`y5n-P$L{MuYI?;cZ(EU52^-ibZq7k_%xh1wv@z53g=r zc^VF*7-;Z=yY@=CygSFXZ#r=5<*QdK=1+T*n9mcX?$~w&G`SpJ;FVKPqElf|199Qp z4SjUw$s0V%=XbBU_$(3}myR7S;7S6H?0@{?_1!B+|GX3kBc?kiPwqRm``WGhdpE2; z{~}(T8S_51ASLY4)3A7$;A2YC!dJnsMcE(kJbWhOa?Wj8w&&!9z{d}k&z~KYArtV) z$PQO#;+@<)@4)G+cduT&`!+HD^}WqI_Mg9SvzX7he|+cOv$r4JxwK*DX&BqaKD&DC z%Hy!$#~U{8EtbiH!y<)QNdb4C!SMI?@!bc{-V6@BwS4OdA%_`F!@x4?#kCXXuD^PE zXa2ISFa)JfJ{X3^y?V5B=gt!s0xqB0w{ZOl7?yHG2@7X0d-yEy&uwd;M(3x8-nsZN z2I}$X==vR3UO}w;CwE6?!QhnX-5T1Op^pMzJ%1J)7OjvL2gen4ZCM-FSt7_3ltY6y zDOa`!1Y!eHxc3zTHHKpp_2k05C0iaoxOeW_J+Yienu~gP;mC{FLP)Wvy(6^D|-1KYro+`N1!*l!gowySG?AD4+hrk3xhuqk;Vcm&s<;3S$dI@N@a#FEqb>0K7IK%rAVt?z1EJi0nJ9Q47q*8 z)=+KHK{D4K+@k8_`K$D640s(9(%7~Lu9_Gm=g5>Lh08YHqoJt$ygW^P)vmaB7QjW6 z;%EooJ#_JM!1*&Lg5or%P3s3?a7l!|qSX6|59)shIrL#I9j-*0n-qEZO~KLyGe(XW zIlg=CLx(Rg$3j6>ujl{z{vA-xetT8ZshMtZ%&o}0g>z>O9XfPEk48sMT%oiyVcJS3 z2$oc39pFfNxO+uL$5Dl`g(j|w%*5jS^bE?>R$IGyj}iVgoGaMaL)q`1(X$@S8pee_2hI3A4MlbuBo_Qp$Ik`&4AW`&0$#%Vh>+mmcQGGDQaN8>sH1@` zPXp#uvz*hirPES^uS}V>G&)m^S2&obb9q#8(w=kAXRcZ{Zru1WeOmJ=7*k>txQx-$ zeh%Kn!GcCcM*24EHg(c?CmYiqT|1VubssyZyCN;(YDmVo@le@mw$k@c!ZI}|vDmEg zjHx5-jC3TKk=sr`A2q6&w3RhAzFG(7&}aNwxL zy$v=fZ!Ij$vZ#bB5JT@Zv#+F+%WO%ZkjbGWO9X-gOeoo!-vR^?$sI_QkfrOKiE0DQR3VU3nxGS$aAe!Nm~Qe zMPfZqC!8K}`T80fxIBBYNFo&#V=5$RFb>5cZd<7mI6!Dw(N&R`Ln}d7 zNsfwl_r(>X=`}i~QmKWtJvg%S^TgS4OBXGezj#G#vV@}{dw6Qs){~FyojuGAHJ~Pv zVj-P)VSY|=M$F2ki|5Xr83{*b2-=cuiA9{zLSfqv9SSeO0TT4L@cZ5;Djy( z$H0gO!?wIaQQ(au^XJZ8f8?4Gv=qV!c&r!YN3+r-Y4 ziz~)LI(VO%ASZkGgM%;7;NoUm)UZi^B;4G&biB<%qWEEz{ZCt$!DjSwe zY4YU~xxlHS6{Y~C%Fnm7_twG2g#1AE6Y~`_Dwm4Go?czPcEj@J%N8zJaQ6g<_;nvS4RS4!^EI%TQ{#+ySA%;wbz>UW_I_rs#M)d^t{KU#T(bJ{$u_| zp-711RkFq4cxST#o%5uxIBqigyFf_nFVAI13)YkON+3tIyWCb zv`&GGOSRP-HZGnqZvOu3TodPATc`V%*PFR;#k%!t+cv1W^7v!WEXvQx$-_Z3%lClu zU);|QU#WTb^y1cwZ`-$QY;0KE@pZtw3V*4jWi|naa0Z* z%8ZN*i5!IxWT?#v3VH*M;3xMp$yQfsh1x?V&24Ovb^d;kfX6G$%?F{esg0qr<%BtN zp{|SPjrVgl6XV@793#tRa($~xwLPqU)H~__F1)#O=EAf=_WY&f%4ME!RgLy-R9kex z&|O1YPg_$=+cJ*u;gso4A-&aQAeufYk6x2rYEf6T=l(zZkp5h8a3;g=3PfcI<(1 zzRs*^sy6>ToVbK!ds}=_;(rFSkQ6?-A8_V!z_oyYRI%}-sbeg4xjbzXKM&hAi)UWA zdQ(xM-l%Sk;iRHFH<%|aQ^$KJxB9g1=VWQX(>8K*FxkI()#-B=6cri`@7{#Z)pf8I zESd=MSD{NJVxXcwG`yuis7C8VP<%6xAtCoR@1*j zO$YAQbsNrHx~f~T{-Dkc6;i1JtgT$3X=vkWTCjfYw)2;++xa%s$&bm=u=TJr)-<%L zWFlX%V9DicH{uy7t*m{+>vq^m!u<^{(Hk~?DGE%Hqy7K&` zi*bbpKHg5`Wgi7h?d{AYtCy{PnRwX4xdit zSM1ldwVqMAyod+uPTX(Uyp4yIVBPZ7=Pq1`%GRvv>yi~0Q6R8%x3_>3r64){&y#m* z)T_?JlK$M??MtiQTvU4vb&9_XD&GzKp2`*~|dVS(z3hDKIj~0%iy5 z3iP%IkQ%<@LL`tls4H+oLfmc)PG`8Hf%R3+?l5l@%H(tb@NO4QH!xZHDMzUS)4MyA zE-l&Rg5I-%MERP%`3Znl`qQgR=uJ$y^QxL-9OO766~`%eh>hOpbexJ z)L^I_&o+`8q{G7(9&x}5ZW0-xciA8<2a2U@K}@+E_fIN)IzjrSQ@|Io$ocwd5af@i zcbSxNKM|-Ly16ju#Thyj0t-pzz>o$BBftrduTtUA7Wum3yO5 z!!mp-rzHU6FX1nRWt)tVmhd@w34a-?5|xThdrIqnM#8vNQCR*bp#7k0l%Q-;Y+6R7 z)`tO6LB4Ix&R|2yMrMebCdOg}ID{dPJQyI9mZ>?2HV%?#K#TrW=@1pBl;|SRu@I63 z<1X9BOKH&#qM;szE;QpNltd$%sxabVC=-PVQAMQv=t5cPywr4PH^jrpgfi)pFh-3A z-0FvncuP>%1TX$#>=GfM?j?arZ>ii%k^+Y+0Np=7UooRBEPo&DNGcc^fe|T%;D9l5 zh066iHt{2SPnL8lq6N@Cfbk=YM2SkKa+K0W3H^&GB}%7KPM{^Uh;f$+rzr_gIcR7v zP|Aap2+*Y#M!YH*A%PJA>VB1r$PnTyt3x|f(4h>BtV{}w8zA0NFaacp{#6$O>fTbJ zYED4qL9x=qxPNk3Gs^OB0v!n~DY>2f>vSrX-woD`vixAkTx^{+Di)~<^Gs{6WldsdRm*(p7OH;KPEa%cJP!q2Z1!uUT$83;eL665_FnIM0mjwzQ&i4S1B ze;LYnh?mF5Eh5x~e+h~A6&;p;3)YOX{AiR9-c`3^!J((kUB7Y5qJ?v{v~}>iLFR++ zQh=4<3j_kb3IV>N%>;f4urH7WM5Wj6WTfg4DXzMXHjCLP3|(Zg{lAX#SAZhai6p~- zRUr$QF@CZ}JqMSjXT0>slynyG%OT71GeJbTFe@W1yYS1F6oPQEd%;h>MEtJ{YerfA z9}#HaYHa#Cyh{PsCXOF7d-lA^6UP*nUAY?p`vB&pFzL;_;hkN*D|>raU9s;Tv7`)Y z76hCK;{$L72F~-x4+@0xGEcW?H~i1#3wVVQH7YqAd=P~ONx;vGyxFGPOc)H(nl!4o zsx(Svgv&Ydm-qE|_3^7&#mlmOe;i8+1aU7fcIwc~*Vo6}v)+w}OfZRO*G%;E_VK7x ze#xOw+LB@^$l4As?_Oxupn4TwAD>#CKjg_yt^Z^E_KUc02Uuv_(urgPsO1YOWJkSt z8kq%6gym5N5jSxVuX+@ge-hS=vi!e*!$S>TMp_2g&_bbfVBg+GMn;Pk%`Xz6tzeXt zfH?pILs4nI)oW9(eeYbmeCp_4A4lAwiypNBxIH2Ru1bSzgQ>vvFC+`*Pb*MpaCx9v zf@-jdBV&aqFEx48plRTR^Ik44h>cIhAbO8C0$5@CuX5B04wT@kB}$T_Q%0^haOUj! zJNuV_xA5&*-!>DwO|eKD-L|8bfN9ygaP;HAi1uw-pM4SqmT&d=0iZc?{Sh#bsx{#t#K9hEXppssdEBE*C)KW1qvPmBU{Nn_pLsI00Ibr5J*$r1`+$x=m)v|6kEV^l z)6n+xb1!e_;O1aMQQ39c4Za=|)uVxzwQU8j$~9}ao24YigK@O7w6eE%uHU+foGdv; z;VSWooyH%y7j(OUw}XwXU4usTYz%ZHxZ)CY!@}{C=4UC;8a~;*YVY-E$nNr{B@Jr% z^_;mQA@u6>Z4a(3?cQh6VUWMQy1RPy8ZA2aO_p%^yuw9uHU^wpTCdd~5El|+JHtQE zHd?}*VbK`j3&Fr*TRsM@uvb?@GDK>wZ>E}T7f{Ir{M z#lk{nskAbXH=hchz04UnunL8nw&A{da4aRoIcsMRcj>izc8>trL4sgZ$i|>vtWy z298s^&l!}rCiinOh9)n+t4}2t2Rr{UtEEYaTITirv?#EZq|_3bT+wXA>bCk%tN1lK zdJES!#-*viSaYe|=MU|xw{X*@WS}ZVWeCOQz~#_~DO2Cb9Ky-@2Nej(|FM@loWx!$XG- zdlK{U-tDJcBeTF$2PTag7Z4Jjo|eKja^i3mcCIcIRdD|Lqxk0+h71`QmXh@NVgRI8 zV!0J^DMjtrux!%U=^AFHe3IAcnSiz?|LO zP@rpMQBIqC{qR14cFu^QLznEo`TpVEy!?EL*mm@!&J}D-!8n&ml;xk{Yi5+#P##q@ zqy0e0kT9!WgPkJ~kIIL)b{_n>YW|1l*vX^8Bc& zU8VXX_HJCidd1Y9*RI@FhL++lC6oZh6I^nGi?XQbR@K=SU7ydC@u|TCumH_KGQa#l z)E+m}`yKK5nq&jXi|i;zar(5W zI&ZiRs*?1Ygcr$l55hjy+r?~j?+Z`?Sv zd+VDNd@X>US7q&c{9ACOE#AQtwa6UiTci6;BcOJp?zfew@np+*3JAC`)7k!6K4%o5$ z=*25%PaM8*=Q+jI$W2Sf{j6F3J-#}rN2@t^$mnq!kNOE8?Y$EV7gFp9_+}h}riiRz z4sf}64?gnI$q)G$i+(wy^n4v=H>i&ZD_J*lQIECP2DPi|wzJKNK#HqpOWCIqB>2;h&Bc2maCS z5{b69(zYQmijvDDQkmA3_qlrpwV*V#tX;g9OzUN2?XhCkKv0lKr4u$@SvRP@P%QCk z(5Iny`IZy5t{KPV`qo7^aY(`0r&kJ%?q>h`z<Y&f}jTdm*3epOD+-WS86`IOKmtK8nzw0dB;H`7RWqE7zgF&FIck( z2GwLQ50-z2FD^}@z^#;cMejX58*P7*_-J#xyUx3QvP%}wXe_`6z@1$wdP zfC&Rbwsmlw$xp0{!%jek%tlObYT&DO#XA>H+HmrbT*RAm@JO#3Zt+16XUw1VCN@XQ z!u8ap0ZMd zF6l7xeRFN|_*r|Br5dBAtQLlBuhPr&m6=DLhWCY6&-m1sK%@!-Nt97Mw5s&6PnUp`6o6kv~4iO`R# z=#z~@9^1<#5;?R3DXLPTBxPEkP6}I$hp#~48LKp+bRCHkk;5<>QpP)9%!mY(VT_@A zJwR0e^pJ}-d3lrx24y~Z0tV$LX(*%N7H2TGV}=M4{OF4(AYQea;+s#90**AT_mZZ2Bhw>r=3|$8lD^j%ZY%l8OUBP?a^VyvpKr{LErSi2FDhdO^ zy>4LLXO+eto6%Xu;Zq- z@jeo4v}x**=jzCq(RoAbKi27eW5e+H*O&cj_ozQ)%C=?mvYu>qZ8GCpY*sTnLFkzU z-ktXZynWo6BCm(afgKU{-92RCo)HWA-gHgKum+97M%r5HG7aNPI;P1QTecs169!6Bl} zlXC=GxH%(5ZCp6rrt1c

    PryRjT*!>dF&K=70_a;hBK<-6cFNE^6+62 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�prG)_01-#&Rd}ftb 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 MK$;5Ga+YEL1GT8_Gynhq literal 0 HcmV?d00001 diff --git a/site/content/docs/commands/project.md b/site/content/docs/commands/project.md index ce07fa4a2..7978f77a7 100644 --- a/site/content/docs/commands/project.md +++ b/site/content/docs/commands/project.md @@ -10,6 +10,8 @@ Generates and saves the deployment CDK project in a user provided directory path without proceeding with a deployment. Allows user to customize the CDK project before deploying the application. ### Examples -``` -dotnet aws deployment-project generate --region us-west-2 -``` \ No newline at end of file + +Creating a deployment project based on the .NET project in the current directory. The new deployment project will be saved to a sibling directory called CustomDeploymentProject. When the .NET project is next deployed the deployment project will be an available option called "Team custom deployment project". + + dotnet aws deployment-project generate --output ../CustomDeploymentProject --project-display-name "Team custom deployment project" + diff --git a/site/content/docs/deployment-projects/cdk-project.md b/site/content/docs/deployment-projects/cdk-project.md new file mode 100644 index 000000000..8e226f459 --- /dev/null +++ b/site/content/docs/deployment-projects/cdk-project.md @@ -0,0 +1,106 @@ +# CDK Project + +A deployment project uses a C# Cloud Development Kit (CDK) project to take in the settings collected from the deployment tooling using the recipe and to create the AWS infrastructure as a CloudFormation stack with your project deployed to the infrastructure. + + +### CDK Refresher +The following links are useful resources to learn how to write .NET CDK projects. + +* [.NET CDK Workshop](https://cdkworkshop.com/40-dotnet.html) +* [.NET CDK Reference](https://docs.aws.amazon.com/cdk/api/v2/dotnet/api/index.html) +* [AWS CDK Developer Guide](https://docs.aws.amazon.com/cdk/v2/guide/home.html) + +The main concepts to understand about the CDK are the following. + +* Stack - this is the top level container for all of the AWS resources represented as constructs. In deployment projects this type is usually the `AppStack` type in the project. +* Constructs - AWS resources are modeled as constructs. Some constructs are a 1 to 1 mapping. The CDK also has higher level abstractions where constructs represent a collection of AWS resources to solve a specific problem. +* Construct properties - For every construct this is a properties object that is created first, all necessary values are set and then passed into the constructor of a construct. + + +### Main method + +The main method for the CDK deployment project must be coded in a certain style to ensure interop with deploy tool. The deploy tool relies on .NET Configuration system to pass along settings from the deploy tool to the CDK project. In the example below `ConfigurationBuilder().AddAWSDeployToolConfiguration(app)` method takes care of reading the settings that were passed into the project from the deploy tool. + +With the configuration read from the deploy tool, the CDK environment is set to the account and region the deploy tool was configured with. + +The other major difference from non deploy tool CDK projects is the call to `CDKRecipeSetup.RegisterStack`. This is required to stamp the CloudFormation stack with the recipe id that created the stack. Future redeployments can target only be made with the originating recipe. It also serializes the settings collected from the deploy tool into the metadata for the CloudFormation stack so redeployments can use the previous settings used for deployment. + +``` +public static void Main(string[] args) +{ + var app = new App(); + + var builder = new ConfigurationBuilder().AddAWSDeployToolConfiguration(app); + var recipeProps = builder.Build().Get>(); + var appStackProps = new DeployToolStackProps(recipeProps) + { + Env = new Environment + { + Account = recipeProps.AWSAccountId, + Region = recipeProps.AWSRegion + } + }; + + // The RegisterStack method is used to set identifying information on the stack + // for the recipe used to deploy the application and preserve the settings used in the recipe + // to allow redeployment. The information is stored as CloudFormation tags and metadata inside + // the generated CloudFormation template. + CDKRecipeSetup.RegisterStack(new AppStack(app, appStackProps), appStackProps.RecipeProps); + + app.Synth(); +} +``` + +### Layout of a CDK deployment project + +The layout of the generated CDK project puts all the code that was used to create the AWS resources defined in the starting recipe in a directory called **Generated**. + +![Catagories in AWS Toolkit for Visual Studio](../../assets/images/deployment-project-file-layout.png) + +It is recommended to not modify the code in the `Generated` directory to make it easier to merge future changes from the starting recipe back into your deployment project. If you do not intend to ever remerge from the starting recipe you modify the code or rearrange the directory layout. + +If you choose to not modify the `Generated` code it is recommended to customize the CDK project starting from the `AppStack` class. Here is the constructor of `AppStack`. + +``` +internal AppStack(Construct scope, IDeployToolStackProps props) + : base(scope, props.StackName, props) +{ + _configuration = props.RecipeProps.Settings; + + // Setup callback for generated construct to provide access to customize CDK properties before creating constructs. + CDKRecipeCustomizer.CustomizeCDKProps += CustomizeCDKProps; + + // Create custom CDK constructs here that might need to be referenced in the CustomizeCDKProps. For example if + // creating a DynamoDB table construct and then later using the CDK construct reference in CustomizeCDKProps to + // pass the table name as an environment variable to the container image. + + // Create the recipe defined CDK construct with all of its sub constructs. + var generatedRecipe = new Recipe(this, props.RecipeProps); + + // Create additional CDK constructs here. The recipe's constructs can be accessed as properties on + // the generatedRecipe variable. +} +``` + +The `var generatedRecipe = new Recipe(this, props.RecipeProps);` line of code creates all of the AWS resources from the `Generated` directory. Your customizations could create new AWS resources via CDK constructs before or after this line. Typically you would create new resourcces before this line if you want those resources to be connected to the resources defined in the `Recipe` type. If you need to create new resources that are connected to the resources defined in the `Recipe` then create them after this line. The instance of `Recipe` has public properties for all of the resources that were created in the `Recipe`. + +In this constructor a callback method called `CustomizeCDKProps` is setup. This callback method is called right before any constructs are created from the `Recipe`. This allows modifying the constructs property object before it is passed into the construct. The example below shows the `CustomizeCDKProps` callback that checks to see if the resource being created is the Beanstalk Environment. If it is cast the property object to the appropiate property object and then make whatever customizations operations needed. + +``` +private void CustomizeCDKProps(CustomizePropsEventArgs evnt) +{ + if (string.Equals(evnt.ResourceLogicalName, nameof(evnt.Construct.BeanstalkEnvironment))) + { + if (evnt.Props is CfnEnvironmentProps props) + { + Console.WriteLine("Customizing Beanstalk Environment"); + } + } +} +``` + +### Configuration + +The settings collected in the deploy tool are passed into the CDK project and then deserialized into the `Configuration` object defined in the project. If you add new settings to the recipe file you will need to add the Id of the new settings to the `Configuration`. If you added an `Object` setting with a collection of child settings then you need to create a new type with the child setting ids as properties on the new type. Then add a new property on the `Configuration` type for the new type with the property name being the id of the `Object` setting. + +The `Configuration` object follows the same pattern as descibed above putting configuration in the `Generated` directory. The `Configuration` type is a partial type and there is also a partial `Configuration.cs` file outside of the `Generated` directory where custom settings should be added. \ No newline at end of file diff --git a/site/content/docs/deployment-projects/index.md b/site/content/docs/deployment-projects/index.md new file mode 100644 index 000000000..4593cf84a --- /dev/null +++ b/site/content/docs/deployment-projects/index.md @@ -0,0 +1,39 @@ +# Deployment projects + +### What is a deployment project? + +A deployment project allows you to customize the resources you deploy to AWS. For example if your deployment require additional application resources like a DynamoDB tables or SQS queues those resources could be added to the deployment project. + +When you have a deployment project you use the same deployment experience starting deployment with your application you want to deploy. The list of deployment recommendations will include your deployment projects. + +### Getting started + +To get started creating a deployment project execute the following command in the directory of the .NET project to deploy. + + dotnet aws deployment-project generate --output --project-display-name + +The `--output` switch sets the directory where the deployment project will be saved to. To customize the name the deployment project that will be shown to users when the .NET project is being deployed use the `--project-display-name` switch. + +Once you run the `dotnet aws deployment-project generate` the tool will display a list of system recipes that are compatible for the .NET project. Choose the recipe that is closest to what your project needs. These recipes will be used as the starting point for your deployment project that you can later customize. + +Select the starting recipe and then a deployment project will be created in the location of the `--output` directory. Now you can begin customizing the deployment project. + + +### Add to source control + +When you use a deployment project to deploy a .NET project it is important to add the deployment project to source control. Redeployments require the deployment project to be available to the deployment tooling. If a CloudFormation stack was created from a deployment project and that +deployment project has been deleted then you will not be able to redeploy to that CloudFormation stack. + + +### Searching for deployment projects + +When the deploy command is initiated the tooling searchs for the solution of the .NET project and searches for deployment project anywere underneath the solution directory. The deployment projects are sent through the deployment tooling's recommendation engine to make sure they are compatible with the project being deployed. + +If the deployment project is outside of the solution directory the `--deployment-project` switch for the `dotnet aws deploy` command can be used to pass in the path of the deployment project to use. This is common for shared deployment-projects across multiple solutions. + +### Parts of a deployment project + +A deployment project is made of 2 parts. Click on the links below for a information about each part. + +* [Recipe JSON file](./recipe-file.md) - a JSON file that drives the deployment experience in the deploy tool CLI and AWS Toolkit for Visual Studio. +* [.NET CDK project](./cdk-project.md) - a C# project that uses the CDK to define the infrastructure that will be created for the deployment project. diff --git a/site/content/docs/deployment-projects/recipe-file.md b/site/content/docs/deployment-projects/recipe-file.md new file mode 100644 index 000000000..51d51037a --- /dev/null +++ b/site/content/docs/deployment-projects/recipe-file.md @@ -0,0 +1,354 @@ +# Deployment project recipe + +In the deployment project is a JSON file with a `.recipe` extension. This file is called the recipe definition of a deployment project. This file provides all of the metadata that drives the experience through deployment tooling CLI and Visual Studio experience. + +The recipe file defines the type of .NET projects the deployment project is compatible with and the settings that will be shown to users. + +The schema for the recipe file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json) + + +### Top level settings + +This is the list of top level properties in the recipe definition. + +* **Id** - the of the deployment project. The CloudFormation stack will be tagged with this id, telling the deployment tooling what deployment projects to use in the future for redeployments. +* **Name** - the name of the deployment project shown in the list of recommendations +* **ShortDescription** - description used when showing the list of recommendations in a list. +* **Description** - description used when the recommendation more information is clicked. +* **TargetService** - the main AWS service the application will be deployed to. Visual Studio uses this to provide visual indicators. +* **DeploymentType** - for deployment projects this value should always be `CdkProject`. +* **DeploymentBundle** - how the .NET project should be bundled. Allowed values are `Container` and `DotnetPublishZipFile`. +* **DisplayedResources** - the list of resources to display to users after deployments. +* **RecipePriority** - the priority of the recipe in the compatibly list. +* **RecommendationRules** - the list of rules to determine the recipe's compatiblity with the project being deployed. +* **Categories** - the list of categories for the option settings. +* **OptionSettings** - the list of settings users can configured during deployment. + + +### Displayed Resources + +The `DisplayedResources` array contains a list of resources that the deployment tooling should display after deployment is complete. This is typically the primary resources for a deployment project like an Elastic Beanstalk Environment or a Load Balancer that allows the user to quickly see their application deployed to AWS. + +Here is an example for a recipe that wants to the Elastic Beanstalk environment to be displayed after deployment. + +``` + "DisplayedResources": [ + { + "LogicalId": "RecipeBeanstalkEnvironment83CC12DE", + "Description": "Application Endpoint" + } + ], +``` + +`DisplayedResources` objects have the following properties: + +* **LogicalId** - the CloudFormation logical id of the AWS resource. The CDK will generate a unqiue hash as the suffix of the logical resource id. The easiest way to figure out the value to set here is to do an initial deployment of the deployment project and then look up the logical id in the CloudFormation console. +* **Description** - a description for the resource shown to users in the list of display resources. + + +### Compatiblity Rules + +The recipe file defines a collection of rules that the deployment tool executes against the .NET project being deployed to determine if the deployment project is compatible for the .NET project. A rule is made up of a list of tests to run and the effect to apply. + +#### Tests + +The deploy tool supports a collection of tests that can be run against the .NET project being deployed. Here is an example of a test that checks the version of .NET the project is targeting. + +```json +{ + "Type": "MSProperty", + "Condition": { + "PropertyName": "TargetFramework", + "AllowedValues": [ + "netcoreapp3.1", + "net6.0" + ] + } +} +``` + +The `Type` property determines the type of test to run. The `Condition` contains the data needed to evaluate the test, in this case the MSBuild property to check and the allowed values. Each type of test can have a different set of properties for the `Condition`. + +#### Available Tests + +| Type | Description | Conditions properties | +| ---- | ----------- | ---------- | +| MSProjectSdkAttribute | Compares the `Sdk` attribute at the root element of the project file to a given value. |

    • Value - the expected value. For example `Microsoft.NET.Sdk.Web` for web projects.
    | +| MSProperty | Compares the property in a project file property group. |
    • PropertyName - the property to compare.
    • AllowedValues - an array of possible values for the property.
    | +| MSPropertyExists | Test to see if a property in a property group exists. |
    • PropertyName - the property test for existence.
    | +| FileExists | Tests to see if a file exist. For example checking to see a `Dockerfile` exists. |
    • FileName - the file to test for existence.
    | +| NuGetPackageReference | Test to see if the project has a `PackageReference` to a NuGet pacakge. |
    • NuGetPackageName - the NuGet package to test if it is being referenced.
    | + + +#### Effect + +A rule contains an effect that defines the behavior of a rule depending on if all of the test pass or not. Effects can either mark the recipe as not included in the compatible list or adjust the priority for the recipe. + +Here is an example of a rule that checks the project is a web project and targets .NET Core 3.1 or .NET 6. If both test pass the effect's `Pass` property instructs the deployment tooling to include the recipe. If either one of the 2 test fail the `Fail` effect is run, removing the recipe from the included compatible list. + +```json + "RecommendationRules": [ + { + "Tests": [ + { + "Type": "MSProjectSdkAttribute", + "Condition": { + "Value": "Microsoft.NET.Sdk.Web" + } + }, + { + "Type": "MSProperty", + "Condition": { + "PropertyName": "TargetFramework", + "AllowedValues": [ + "netcoreapp3.1", + "net6.0" + ] + } + } + ], + "Effect": { + "Pass": { + "Include": true + }, + "Fail": { + "Include": false + } + } + } + ] +``` + +Here is another example that tests if a project contains a docker file. If it does not include a docker file it reduces the priority of the recipe. + +```json + "RecommendationRules": [ + ... + + { + "Tests": [ + { + "Type": "FileExists", + "Condition": { + "FileName": "Dockerfile" + } + } + ], + "Effect": { + "Fail": { + "PriorityAdjustment": -100, + "Include": true + } + } + }, + + ... + ] +``` + +A recipe is considered compatible if no rule ran an effect that set `Include` to false and if the priority is greater then 0. To simulate an **"or"** set of rules the starting priority in `RecipePriority` can be set to a negative value meaning by default it is not included. Then you can have a series of tests that adjust the priority to a positive amount. That way if any test rule passes it can adjust the priority to a positive number. + + +### Setting Categories + +The `Categories` property is an array of objects that define the categories for the settings. The AWS Toolkit for Visual Studio uses this array to build the list of categories in the UI for fast navigation to a group of settings. + +![Catagories in AWS Toolkit for Visual Studio](../../assets/images/vs-catagories.png) + +A category is defined with the following properties: +* **Id** - the unique id within the recipe for the category. +* **DisplayName** - the name of the category displayed to users. +* **Order** - the order in the toolkit for the category. Categories are display in sorted decending order. + +Here is an example of defining a custom category that you could use to categorize additional settings added as application resources. + +``` + { + "Id": "AppResources", + "DisplayName": "Application Resources", + "Order": 15 + } +``` + +Settings can be assigned to a category setting the `Category` property of a setting to the `Id` of a category. Only top level settings can be assigned a category. Any top level settings that are not assigned a category will be placed in the `General` category. + +### Option Settings + +The settings that are shown to users and allows users to customize the deployment in either the CLI or Visual Studio are defined in the `OptionSettings` array. Settings have the following properties. + +* **Id** - the id of the setting. Once projects are deployed with the recipe this id should not change because the id is saved into the CloudFormation stack's template. +* **Name** - the name of the setting shown to users. +* **Description** - the informational text shown to users for the setting. +* **Type** - the data type of the setting. +* **DefaultValue** - the default value for the setting. +* **TypeHint** - a hint to the deployment tooling what the meaning of the setting is. +* **TypeHintData** - additional information to pass into the type hint. +* **AdvancedSetting** - a boolean whether this setting is an advanced use case. If true the setting might not be shown to users unless the request to see all settings. +* **Updatable** - a boolean that controls whether a setting can be modified during redeployment. It is recommended settings that trigger tearing down resources that would make the application unavailable be marked as `false`. +* **AllowedValues** - the list of possible values. +* **ValueMapping** - a mapping to the values in the `AllowedValues` to user friendly display names for each allowed value. +* **ChildOptionSettings** - if the `Type` property is set to `Object` this list contains a child option settings. +* **DependsOn** - a list of expressions to determine if this setting should be visible. +* **Validators** - a list of validators to run when values are set for the setting to ensure the value is valid. +* **ParentSettingId** - the id of a setting that represents the parent of this setting. For example a setting that allows picking EC2 subnets would set the `ParentSettingId` to the setting that defines the `VPC` to use for deployment. The type hint for the setting can use this field to filter the list of subnets that are valid for the selected VPC. + + +#### Setting Data Types + +Settings can have the following data types: + +* String +* Int +* Double +* Bool +* KeyValue +* List +* Object + +If the data type is set to `Object` the setting has child settings that are defined in the `ChildOptionSettings` array for the setting. + +#### TypeHint + +Type hints are used to give hints to the CLI or Visual Studio toolkit the meaning behind setting beyond the basic data type. For example if the `TypeHint` property is set to `ExistingECSCluster` the deployment tool knows this `String` data type setting should be set to the name of an existing ECS cluster and so presents the list of clusters to the user. + +Some type hints require additional configuration which can specified in the `TypeHintData` property. For example if a setting has a type hint of `ExistingIAMRole` the tooling should only show roles that can be assumed by the target service. Here is a example of configuring the `ServicePrincipal` for the type hint to filter the list of roles to pick from. + +``` + { + "Id": "RoleArn", + "Name": "Existing Role ARN", + "Description": "The ARN of the existing role to use.", + "Type": "String", + "TypeHint": "ExistingIAMRole", + "TypeHintData": { + "ServicePrincipal": "ecs-tasks.amazonaws.com" + }, + + ... +``` + +Here is the list of available type hints in the deployment tooling. + +| Type Hint | Type Hint Data | Notes | +| --------- | ----------- | ---- | +| IAMRole |
    • ServicePrincipal - the service principal the role can be assumed by.
    | Set at `Object` level that controls whether to create a new role or select an existing role. | +| ExistingIAMRole |
    • ServicePrincipal - the service principal the role can be assumed by.
    | Set at the `String` setting level for storing the existing IAM role arn. | +| ECSCluster | | Set at the `Object` setting level that controls whether to create or select an existing ECS cluster. | +| ExistingECSCluster | | Set at the `String` setting level for storing the existing ECS Cluster Name. | +| ECSService | | | +| ECSTaskSchedule | | | +| EC2KeyPair | | | +| Vpc | | Set at the `Object` level that controls whther to create a new VPC or select an existing VPC. | +| ExistingVpc | | Set at the `String` setting level for storing the existing VPC ID. | +| AppRunnerService | | | +| VPCConnector | | Set at the `Object` level for creating or selecting an App Runner VPC Connector. | +| ExistingVpcConnector | | Set at the `String` setting level for storing the existing VPC Connector id. | +| BeanstalkRollingUpdates | | | +| ExistingSubnets | | `ParentSettingId` should be set to a setting for the VPC. | +| ExistingSecurityGroups | | `ParentSettingId` should be set to a setting for the VPC. | +| ExistingBeanstalkApplication | | | +| ExistingApplicationLoadBalancer | | | +| InstanceType | | | +| WindowsInstanceType | | | +| S3BucketName |
    • AllowNoValue - determines whether to allow no value to be set.
    | | +| DynamoDBTableName |
    • AllowNoValue - determines whether to allow no value to be set.
    | | +| SQSQueueUrl |
    • AllowNoValue - determines whether to allow no value to be set.
    | | +| SNSTopicArn |
    • AllowNoValue - determines whether to allow no value to be set.
    | | +| FilePath |
    • Filter - the filter that appears in the file dialog box.
    • DefaultExtension - the default extension used if the user specifies a file name without an extension.
    • Title - the title of the file dialog box.
    • CheckFileExists - if true the deployment tooling ensures the file exists.
    • AllowEmpty - controls whether an empty value is allowed.
    | | +| DotnetBeanstalkPlatformArn | | | +| DotnetWindowsBeanstalkPlatformArn | | | +| DotnetPublishSelfContainedBuild | | Used internally to validate build configuration. | +| DotnetPublishBuildConfiguration | | Used internally to validate build configuration. | +| DotnetPublishAdditionalBuildArguments | | Used internally to validate build configuration. | +| DockerExecutionDirectory | | Used internally to validate build configuration. | +| DockerBuildArgs | | Used internally to validate build configuration. | + + +#### DependsOn + +The `DependsOn` property is an array of conditions on other setting values to determine if a setting should be visible. For example if a user selects the setting to create a new IAM role then the setting for the selecting an existing IAM role should not be displayed. + +Each item in the `DependsOn` array has the following properties. + +* **Id** - the id of the setting compare. The id should be full id including all parent objec id settings. The format is .. +* **Operation** - the operation to run. Allowed values are `NotEmpty` and `Equals`. If operation is not set then the default is `Equals`. +* **Value** - the value to compare when the operation is `Equals`. + +Here is an example for a setting used for storing an existing IAM role to use. The value is displayed if the setting `ApplicationIAMRole.CreateNew` is set false. +``` + { + "Id": "RoleArn", + "Name": "Existing Role ARN", + "Description": "The ARN of the existing role to use.", + "Type": "String", + "TypeHint": "ExistingIAMRole", + "TypeHintData": { + "ServicePrincipal": "tasks.apprunner.amazonaws.com" + }, + "AdvancedSetting": false, + "Updatable": true, + "DependsOn": [ + { + "Id": "ApplicationIAMRole.CreateNew", + "Value": false + } + ], + + ... + } +``` + +#### Validators + +Validators on a setting allow telling the user when a setting has an invalid value before starting the deployment. Each setting can have a list of validators assign in the `Validators` array. Validators can do simple checks like making sure string values are of a certain format as well as make AWS service calls to make sure the value of an existing resource exists. + +Here is an example of a validator for a port setting that ensures the value is within the range 0 to 51200. + +```json + ... + + { + "Id": "Port", + "Name": "Port", + "Category": "General", + "Description": "The port the container is listening for requests on.", + "Type": "Int", + "DefaultValue": 80, + "AdvancedSetting": false, + "Updatable": true, + "Validators": [ + { + "ValidatorType": "Range", + "Configuration": { + "Min": 0, + "Max": 51200 + } + } + ] + } + + ... +``` + +The `ValidatorType` property determines the type of validator to run. The `Configuration` contains the data needed to evaluate the validator, in this case the min and max values. Each type of validator can have a different set of properties for the `Configuration`. + +| Validator Type | Description | Configuration properties | +| ---- | ----------- | ---------- | +| Range | For numeric settings define the min and max values. |
    • Min - the min value.
    • Max - the max value.
    • ValidationFailedMessage - the error message shown if the regular expression fails to match.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | +| Regex | For string settings define a regular expression that value must match. |
    • Regex - the regular expression to match against the value of the setting.
    • ValidationFailedMessage - the error message shown if the validator fails.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | +| Required | A value is required for the setting. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    | +| DirectoryExists | For string settings representing a directory. Validates the diretory exists. | | +| DockerBuildArgs | Ensures the value is valid for being passed to the docker build command. | | +| DotnetPublishArgs | Ensures the value is valid for being passed to the dotnet publish command. | | +| ExistingResource | Using the [AWS Cloud Control API GetResource](https://docs.aws.amazon.com/cloudcontrolapi/latest/APIReference/API_GetResource.html) ensure the AWS resource exists. |
    • ResourceType - the AWS resource type to search for. For example `AWS::ECS::Cluster` for an ECS cluster.
    | +| FileExists | For string settings represeting a file path. Validates the file exists. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | +| StringLength | Validates the length of a string setting. |
    • MinLength - the min length for the string.
    • MaxLength - the max length for the string.
    • ValidationFailedMessage - the error message shown if the validator fails.
    | +| InstanceType | Validates the string value is a valid EC2 instance type. | | +| WindowsInstanceType | Validates the string value is a valid Windows EC2 instance type. | | +| SubnetsInVpc | Validates the subnets are in the configured VPC. |
    • VpcId - the id of the setting that has the VPC configured for.
    • ValidationFailedMessage - the error message shown if the validator fails.
    | +| SecurityGroupsInVpc | Validates the security group are in the configured VPC. |
    • VpcId - the id of the setting that has the VPC configured for.
    • ValidationFailedMessage - the error message shown if the validator fails.
    | +| Uri | Validates the value is a well formed URI string. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    | +| Comparison | Compares this setting with another setting. |
    • SettingId - the setting to compare to.
    • Operation - the comparison operation. Allowed values are `GreaterThan`.
    | +| VPCSubnetsInDifferentAZs | Validates that the selected VPC must have at least two subnets in two different Availability Zones |
    • ValidationFailedMessage - the error message shown if the validator fails.
    | + + diff --git a/site/content/docs/deployment-projects/tutorial.md b/site/content/docs/deployment-projects/tutorial.md new file mode 100644 index 000000000..c2b53baa2 --- /dev/null +++ b/site/content/docs/deployment-projects/tutorial.md @@ -0,0 +1,351 @@ +# Deployment project tutorial + +For this tutorial we are going to assume we our on a team building the Acme.WebApp project. This web applicaton uses an AWS DynamoDB table as the backend store. We want to create a deployment project the team can use that deploys the application to Amazon Elastic Container Service (ECS) along with the application's DynamoDB table. + +***Note: For this tutorial we are not concerned with the logic of the application being deployed. To follow along with this tutorial you can replace Acme.WebApp with any hello world web application.*** + + +Tasks we will accomplish: + +* Creating a deployment project +* Modify the deployment project's recipe file to allow the user to configure what DynamoDB table to use. +* Customize the deployment project's CDK project to create the DynamoDB table and set an environment variable our application can read to know what table to use. + +### Creating deployment project + +To create the deployment project navigate to the project directory of our application. Then run the following command to start creating the deployment project. + + dotnet aws deployment-project generate --output ../Acme.WebApp.DeploymentProject --project-display-name "ASP.NET Core app with DynamoDB" + +The deploy tool will then analyze the project and display what recommendation to use for the starting point of the deployment project. Since we want to deploy to ECS we will pick the option that says "ASP.NET Core App to Amazon ECS using AWS Fargate". + +Once the option is picked the deployment project Acme.WebApp.DeploymentProject is created in a sibling project to the application project. The `--project-display-name` switch above configures the name of the recommendation that is shown in the deploy tool when deploying the application project. + +If you are using Visual Studio you might want to add the Acme.WebApp.DeploymentProject project to your solution. + +### Adding DynamoDB settings to the recipe + +For our team members that will use our deployment project we want to give them the choice to either select an existing DynamoDB table or create a new table during deployment. To do that we need to add a few new settings to our deployment project's recipe definition. + +In the directory containing the deployment project open the `Acme.WebApp.DeploymentProject.recipe` file in your JSON editor of choice. In the file find the `OptionSettings` section that contains all of our settings that users can use to configure their project. + +To get started we are going to create a new object level setting called `Backend` to group all of our new settings. The snippet below shows the object level setting which is going to be grouped in the General settings category. + +``` + "OptionSettings": [ + + ... + + { + "Id": "Backend", + "Name": "Backend", + "Category": "General", + "Description": "Configure the backend store.", + "Type": "Object", + "AdvancedSetting": false, + "Updatable": true, + "ChildOptionSettings": [ + + ] + }, + + + ... + } +``` + +Now we are going to create our child settings. The first is a setting to determine if we should create a new table or not. This setting is a `Bool` type which is defaulted to `true`. As a best practice the `Updatable` setting is set to `false` to protected users from making an accidentaly mistake of deleting the table by switching to an existing table in the future. + +``` + "ChildOptionSettings": [ + { + "Id": "CreateNewTable", + "Name": "Create New DynamoDB Table", + "Description": "Do you want to create a new DynamoDB table for the backend store?", + "Type": "Bool", + "DefaultValue": true, + "AdvancedSetting": false, + "Updatable": false + }, + + ... + + ] + +``` + +If the user unchecks the `CreateNewTable` setting we need to give the user a choice to select an existing table. This `ExistingTableName` setting table is a String type that will store the name of the DynamoDB table to use as the backend store. + +``` + "ChildOptionSettings": [ + + ... + + { + "Id": "ExistingTableName", + "Name": "Existing DynamoDB Table", + "Description": "Existing DynamoDB table to use as the backend store.", + "Type": "String", + "TypeHint": "DynamoDBTableName", + "DefaultValue": "", + "AdvancedSetting": false, + "Updatable": true, + "DependsOn": [ + { + "Id": "Backend.CreateNewTable", + "Value": false + } + ], + "Validators": [ + { + "ValidatorType": "Regex", + "Configuration": { + "Regex": "[a-zA-Z0-9_.-]+", + "ValidationFailedMessage": "Invalid table name." + } + }, + { + "ValidatorType": "StringLength", + "Configuration": { + "MinLength": 3, + "MaxLength": 255 + } + } + ] + } + ] +``` + +Lets take a deeper dive into the properties for the `ExistingTableName` setting. + +* **TypeHint** - set to `DynamoDBTableName` letting the deploy tool know this String type is for DynamoDB tables. The deploy tool uses this information to show a list of tables to pick from. +* **Updatable** - since changing table names of existing tables is not a destructive change allow for this field to be updated during redeployments. +* **DependsOn** - Controls this setting only being visible if the previous `CreateNewTable` setting is set to `false`. Notice how the Id is the full name of the setting including the parent Object setting `Backend`. +* **Validators** - Build a couple validators to make sure the input name matches the regex for table names and that the name matches the required min and max length. Adding validators helps users get feedback right away when there is incorrect values for settings. + +Here is the full snippet of the `Backend` Object setting with the child settings. +``` + { + "Id": "Backend", + "Name": "Backend", + "Category": "General", + "Description": "Configure the backend store.", + "Type": "Object", + "AdvancedSetting": false, + "Updatable": true, + "ChildOptionSettings": [ + { + "Id": "CreateNewTable", + "Name": "Create New DynamoDB Table", + "Description": "Do you want to create a new DynamoDB table for the backend store?", + "Type": "Bool", + "DefaultValue": true, + "AdvancedSetting": false, + "Updatable": false + }, + { + "Id": "ExistingTableName", + "Name": "Existing DynamoDB Table", + "Description": "Existing DynamoDB table to use as the backend store.", + "Type": "String", + "TypeHint": "DynamoDBTableName", + "DefaultValue": "", + "AdvancedSetting": false, + "Updatable": true, + "DependsOn": [ + { + "Id": "Backend.CreateNewTable", + "Value": false + } + ], + "Validators": [ + { + "ValidatorType": "Regex", + "Configuration": { + "Regex": "[a-zA-Z0-9_.-]+", + "ValidationFailedMessage": "Invalid table name." + } + }, + { + "ValidatorType": "StringLength", + "Configuration": { + "MinLength": 3, + "MaxLength": 255 + } + } + ] + } + ] + } +``` + +### Customizing the deployment project's CDK project + +Now that users can customize the backend settings in the deployment tooling the CDK project for the deployment project needs to be updated to react to the new settings. + +***Note: The .NET CDK projects generated by the deploy tool have the C# feature `Nullable` enabled in the project file. If you do not want this feature enabled edit the csproj file and remove the `Nullable` projecty from the PropertyGroup.*** + +#### Deserializing settings + +When the deploy tool executes the CDK project it passes all of the settings collected from the user and deserializes into the `Configuration` type in the CDK project. We need to modify the `Configuration` type to have the new backend settings. Create a new class called `BackendConfiguration` in the `Configurations` directory. Below is the code for this new type with the properties for `CreateNewTable` and `ExistingTableName`. + +``` +namespace Acme.WebApp.DeploymentProject.Configurations +{ + public class BackendConfiguration + { + public bool CreateNewTable { get; set; } + + public string ExistingTableName { get; set; } + + + /// A parameterless constructor is needed for + /// or the classes will fail to initialize. + /// The warnings are disabled since a parameterless constructor will allow non-nullable properties to be initialized with null values. +#nullable disable warnings + public BackendConfiguration() + { + + } +#nullable restore warnings + + public BackendConfiguration( + bool createNewTable, + string existingTableName) + { + CreateNewTable = createNewTable; + ExistingTableName = existingTableName; + + } + } +} +``` + +In the `Configuration.cs` file add a new property for our new backend settings. + +``` +namespace Acme.WebApp.DeploymentProject.Configurations +{ + public partial class Configuration + { + public BackendConfiguration Backend { get; set; } = new BackendConfiguration(); + } +} +``` + +Notice the `Backend` property was added to the partial class that is **not** in the Generated directory. In both the Configuration and BackendConfiguration type the property names match the setting ids used in the recipe file. This is important for the data to be property deserialized. + +#### CDK Changes + +The `AppStack` class is the recommended place to customzie the AWS resources created by the CDK. In the constructor of this class we will modify it check if `CreateNewTable` is set to true. If it is then use the CDK construct to create a table as part of the CloudFormation stack. + +``` +using Amazon.CDK.AWS.DynamoDB; + +namespace Acme.WebApp.DeploymentProject +{ + + public class AppStack : Stack + { + private readonly Configuration _configuration; + private Table? _ddbBackend; + + internal AppStack(Construct scope, IDeployToolStackProps props) + : base(scope, props.StackName, props) + { + _configuration = props.RecipeProps.Settings; + + // Setup callback for generated construct to provide access to customize CDK properties before creating constructs. + CDKRecipeCustomizer.CustomizeCDKProps += CustomizeCDKProps; + + if(_configuration.Backend.CreateNewTable == true) + { + var backendProps = new TableProps + { + RemovalPolicy = RemovalPolicy.DESTROY, + PartitionKey = new Amazon.CDK.AWS.DynamoDB.Attribute { Name = "Id", Type = AttributeType.STRING }, + BillingMode = BillingMode.PAY_PER_REQUEST, + }; + _ddbBackend = new Table(this, "Backend", backendProps); + } + + var generatedRecipe = new Recipe(this, props.RecipeProps); + } +``` + +In the snippet above the table was created before `Recipe` construct. The `Recipe` construct has all of the AWS resources that are part of the original ECS recipe the deployment project was created from. Now that we have our table we need to pass the table name into the application. We are going to do this by setting an environment variable for the application. + +The `CustomizeCDKProps` method in `AppStack` is a callback method that gets called for each AWS resources about to be created from the `Recipe` construct. Here is where we can set the environment variable. + +To know which AWS resource is about to be created compare the `evnt.ResourceLogicalName` property to the public property name on the `Recipe` construct. The system recipes are written to make sure the resource logical name is the same as the public property name. In our scenario we are looking to see if the `AppContainerDefinition` is about to be created. When we determine that the callback is for `AppContainerDefinition` then we cast the `evnt.Props` to the corresponding property object for `AppContainerDefinition` in this case `ContainerDefinitionOptions`. From `ContainerDefinitionOptions` we can set the table name. + + +``` +private void CustomizeCDKProps(CustomizePropsEventArgs evnt) +{ + // Example of how to customize the container image definition to include environment variables to the running applications. + // + if (string.Equals(evnt.ResourceLogicalName, nameof(evnt.Construct.AppContainerDefinition))) + { + if (evnt.Props is ContainerDefinitionOptions props) + { + if (props.Environment == null) + props.Environment = new Dictionary(); + + + if(_ddbBackend != null) + { + props.Environment["BACKEND_TABLE"] = _ddbBackend.TableName; + } + else + { + props.Environment["BACKEND_TABLE"] = _configuration.Backend.ExistingTableName; + } + } + } +} +``` + +### Using the deployment project + +Deployment projects are used through the same deployment process as the system recipes. For the CLI deploy tool experience execute the `dotnet aws deploy` command in the application project directory. The new deployment project will be displayed as the recommended option. + +``` +Recommended Deployment Option +----------------------------- +1: ASP.NET Core app with DynamoDB +This ASP.NET Core application will be deployed to Amazon Elastic Container Service (Amazon ECS) with compute power managed by AWS Fargate compute engine. If your project does not contain a Dockerfile, it will be automatically generated, otherwise an existing Dockerfile will be used. Recommended if you want to deploy your application as a container image on Linux. + +Additional Deployment Options +------------------------------ +2: ASP.NET Core App to Amazon ECS using AWS Fargate +This ASP.NET Core application will be deployed to Amazon Elastic Container Service (Amazon ECS) with compute power managed by AWS Fargate compute engine. If your project does not contain a Dockerfile, it will be automatically generated, otherwise an existing Dockerfile will be used. Recommended if you want to deploy your application as a container image on Linux. + +... + +``` + +The settings for the recommendation shows the Backend settings we customized. If we navigate to the backend settings the deploy tool will allow choosing to use a new table or picking an existing table. + +``` +... + +Current settings (select number to change its value) +---------------------------------------------------- +1. ECS Cluster: AcmeWebApp +2. ECS Service Name: AcmeWebApp-service +3. Backend: + Create New DynamoDB Table: True +4. Desired Task Count: 3 +5. Application IAM Role: *** Create new *** +6. Virtual Private Cloud (VPC): *** Default *** +7. Environment Variables: +8. ECR Repository Name: acmewebapp + +... + +``` + +The AWS Toolkit for Visual Studio will also recognize the deployment project when deploying the application project. The deployment project will show up as the highest recommended option and if you edit settings you will be able to choose to use a new table or get a drop down box of available tables in my account. + +When you are using deployment project for deploying applications the deployment project should be checked in as part of source control. The deployment project is required for redeployments to existing CloudFormation stacks that were created from the deployment project. \ No newline at end of file diff --git a/site/content/docs/project.md b/site/content/docs/project.md deleted file mode 100644 index 487c4ccf9..000000000 --- a/site/content/docs/project.md +++ /dev/null @@ -1,51 +0,0 @@ -# Deployment projects - -### What is a deployment project? - -A deployment project allows you to customize the resources you deploy to AWS. Instead of choosing one of the recipes supplied by AWS, you can generate a deployment project and modify it to fit your application needs. - -Each deployment project includes: - -* **.NET CDK project** - takes the collected settings from the user and performs the deployment using the AWS CDK. It’s a standard C# console project that uses NuGet packages containing CDK construct types to define the AWS infrastructure. -* **JSON metadata file** - a JSON configuration file that contains all of the settings that are needed to determine which deployment services to use and their configurations. Here is the [JSON file definition](https://github.com/aws/aws-dotnet-deploy/tree/main/src/AWS.Deploy.Recipes/RecipeDefinitions). - -### Generating a project - -You can generate deployment project into your workspace. The `--project-display-name` sets the name for the project that will be seen to you during the deployment. - - dotnet aws deployment-project generate --project-display-name MyCustomCDKProject - -You can also generate the deployment project in the directory of your choice by specifying the `--output` parameter. - - dotnet aws deployment-project generate --output ../myCustomCDKProject --project-display-name MyCustomCDKProject - -You can then customize the project and the deployment settings to fit your needs. - -### Customizing resources - -Now you can go ahead and add additional resources to the generated deployment project. Deployment projects enable you to change the deployment interface. - -The `AppStack class` is the recommended place to add new AWS resources or customize the resources created in the generated code. - - > Note: Most of the code is located in the generated folder. We don’t recommend you edit the files in there directly, and instead use it for reference. If you want to take updates from the original recipe the deployment project was created from, you can just copy the code into the generated folder. - - -### Customizing deployment settings -You can also add new settings that will be presented to the user during deployment. Modify the generated `.recipe` file to correspond to the changes you made to the CDK project. - -The schema for the recipe file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json). - - -### Specifying external project - -Now that you created your custom deployment project, you can choose it over the default recipes supplied by AWS. - - By default, when you invoke the `dotnet aws deploy` command, it looks for all deployment projects under the directory where the solution file is at, or the root of the Git repository. - - If you have a deployment project you want to use but it’s in a separate workspace, possibly a separate repository, then use the `--deployment-project` switch to pass in the path of the shared deployment project. - - dotnet aws deploy --deployment-project [PATH_TO_CUSTOM_DEPLOYMENT_PROJECT] - -### Sharing deployment projects - -It is important to save the generated deployment project in version control so that you can reuse the project for multiple applications that you want to deploy or share with the rest of your team. diff --git a/site/content/docs/recipe.md b/site/content/docs/recipe.md deleted file mode 100644 index 1577159a1..000000000 --- a/site/content/docs/recipe.md +++ /dev/null @@ -1,16 +0,0 @@ -# Deployment Recipes - -#### Recommendation engine -At the heart of the tool there is a recommendation engine. When you run the tool, the recommendation engine inspects your .NET project and suggests the right deployment service that is most appropriate for your project. - -This allows the engine to provide intelligent recommendations that are tailored to the type of .NET application that is being deployed. The recommendation rules are defined in the deployment recipes. - -#### Deployment Recipes -The recommendation rules are defined in the deployment recipes. The deployment tool turns these recipes into recommendations for a given .NET project. - -There is a recipe for each project type. All recipes can be found on [GitHub](https://github.com/aws/aws-dotnet-deploy/tree/1344e9e8e5485d7d38af524657178facf27ec973/src/AWS.Deploy.Recipes/RecipeDefinitions). Each recipe contains the following: - -1. **JSON Metadata File** - this file contains all of the metadata the deployment tool uses to drive the experience. This includes rules used in the recommendation engine to determine if the recipe is compatible with a project. It also has all of the settings that the deploy tool CLI, and eventually Visual Studio, uses to allow users to customize the experience. The schema for this file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json) -2. **.NET CDK project template** - a recipe also contains a .NET project template that will be used to generate an [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/) deployment project. - - > Note: There are a couple special case recipes that don't have CDK project templates. (Push to ECR and Deploy to existing Beanstalk). diff --git a/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json b/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json index 37d57821a..503328a1a 100644 --- a/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json +++ b/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json @@ -323,6 +323,29 @@ } } } + }, + + { + "if": { + "properties": { "Type": { "const": "NuGetPackageReference" } } + }, + "then": { + "properties": { + "Condition": { + "type": "object", + "additionalProperties": false, + "required": [ "NuGetPackageName" ], + "properties": { + "NuGetPackageName": { + "type": "string", + "title": "NuGet Package Exists", + "description": "The name of the NuGet package to check if it being referenced by the project.", + "minLength": 1 + } + } + } + } + } } ] }, @@ -501,6 +524,7 @@ "EC2KeyPair", "Vpc", "DotnetBeanstalkPlatformArn", + "DotnetWindowsBeanstalkPlatformArn", "DotnetPublishSelfContainedBuild", "DotnetPublishBuildConfiguration", "DotnetPublishAdditionalBuildArguments", @@ -516,7 +540,11 @@ "ExistingVpcConnector", "ExistingECSCluster", "ExistingApplicationLoadBalancer", - "S3BucketName" + "S3BucketName", + "DynamoDBTableName", + "SQSQueueUrl", + "SNSTopicArn", + "FilePath" ] }, "DefaultValue": { From c9f48244dedcdf0a7d7f765b9a78a248e81f127d Mon Sep 17 00:00:00 2001 From: Alex Shovlin Date: Wed, 20 Jul 2022 12:45:13 -0400 Subject: [PATCH 11/14] Polish documentation for custom deployment projects --- mkdocs.yml | 2 +- .../docs/deployment-projects/cdk-project.md | 20 +++-- .../content/docs/deployment-projects/index.md | 37 ++++---- .../docs/deployment-projects/recipe-file.md | 85 ++++++++++--------- .../docs/deployment-projects/tutorial.md | 72 +++++++++------- 5 files changed, 115 insertions(+), 101 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index a420409cd..64fca358f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,7 +27,7 @@ nav: - Docker support: - Dockerfile generation: docs/docker/docker-generation.md - Publishing a Docker image: docs/docker/publish-image.md - - Deployment projects: + - Custom Deployment Projects: - Getting Started: docs/deployment-projects/index.md - Tutorial: docs/deployment-projects/tutorial.md - Recipe File: docs/deployment-projects/recipe-file.md diff --git a/site/content/docs/deployment-projects/cdk-project.md b/site/content/docs/deployment-projects/cdk-project.md index 8e226f459..e182569df 100644 --- a/site/content/docs/deployment-projects/cdk-project.md +++ b/site/content/docs/deployment-projects/cdk-project.md @@ -1,6 +1,6 @@ # CDK Project -A deployment project uses a C# Cloud Development Kit (CDK) project to take in the settings collected from the deployment tooling using the recipe and to create the AWS infrastructure as a CloudFormation stack with your project deployed to the infrastructure. +A custom deployment project uses a C# Cloud Development Kit (CDK) project to create the AWS infrastructure as a CloudFormation stack based on the settings provided by the user and to deploy your project to that infrastructure. ### CDK Refresher @@ -13,17 +13,17 @@ The following links are useful resources to learn how to write .NET CDK projects The main concepts to understand about the CDK are the following. * Stack - this is the top level container for all of the AWS resources represented as constructs. In deployment projects this type is usually the `AppStack` type in the project. -* Constructs - AWS resources are modeled as constructs. Some constructs are a 1 to 1 mapping. The CDK also has higher level abstractions where constructs represent a collection of AWS resources to solve a specific problem. +* Constructs - AWS resources are modeled as constructs. Some constructs are a one-to-one mapping to a single AWS resource. The CDK also has higher level abstractions where a single construct represents a collection of AWS resources that solve a specific problem. * Construct properties - For every construct this is a properties object that is created first, all necessary values are set and then passed into the constructor of a construct. ### Main method -The main method for the CDK deployment project must be coded in a certain style to ensure interop with deploy tool. The deploy tool relies on .NET Configuration system to pass along settings from the deploy tool to the CDK project. In the example below `ConfigurationBuilder().AddAWSDeployToolConfiguration(app)` method takes care of reading the settings that were passed into the project from the deploy tool. +The main method for the CDK deployment project must be coded in a certain style to ensure compatibility with the deploy tool. The deploy tool relies on .NET's Configuration system to pass along settings from the deploy tool to the CDK project. In the example below the `ConfigurationBuilder().AddAWSDeployToolConfiguration(app)` method reads the settings that were passed into the project from the deploy tool. With the configuration read from the deploy tool, the CDK environment is set to the account and region the deploy tool was configured with. -The other major difference from non deploy tool CDK projects is the call to `CDKRecipeSetup.RegisterStack`. This is required to stamp the CloudFormation stack with the recipe id that created the stack. Future redeployments can target only be made with the originating recipe. It also serializes the settings collected from the deploy tool into the metadata for the CloudFormation stack so redeployments can use the previous settings used for deployment. +The other major difference from normal CDK projects is the call to `CDKRecipeSetup.RegisterStack`. This is required to stamp the CloudFormation stack with the recipe id that created the stack. Future redeployments can only update existing stacks that were created by the original recipe. It also serializes the settings collected from the deploy tool into the metadata for the CloudFormation stack so redeployments can use the previous settings used for deployment. ``` public static void Main(string[] args) @@ -57,7 +57,7 @@ The layout of the generated CDK project puts all the code that was used to creat ![Catagories in AWS Toolkit for Visual Studio](../../assets/images/deployment-project-file-layout.png) -It is recommended to not modify the code in the `Generated` directory to make it easier to merge future changes from the starting recipe back into your deployment project. If you do not intend to ever remerge from the starting recipe you modify the code or rearrange the directory layout. +It is recommended to not modify the code in the `Generated` directory to make it easier to merge future changes from the starting recipe into your custom deployment project. If you do not intend to update your custom deployment project from the original built-in recipe you may modify the code or rearrange the directory layout. If you choose to not modify the `Generated` code it is recommended to customize the CDK project starting from the `AppStack` class. Here is the constructor of `AppStack`. @@ -82,9 +82,11 @@ internal AppStack(Construct scope, IDeployToolStackProps props) } ``` -The `var generatedRecipe = new Recipe(this, props.RecipeProps);` line of code creates all of the AWS resources from the `Generated` directory. Your customizations could create new AWS resources via CDK constructs before or after this line. Typically you would create new resourcces before this line if you want those resources to be connected to the resources defined in the `Recipe` type. If you need to create new resources that are connected to the resources defined in the `Recipe` then create them after this line. The instance of `Recipe` has public properties for all of the resources that were created in the `Recipe`. +The `var generatedRecipe = new Recipe(this, props.RecipeProps);` line of code creates all of the AWS resources from the `Generated` directory. Your customizations could create new AWS resources via CDK constructs before or after this line. Typically you would create new resources before this line if you want those resources to be connected to the resources defined in the `Recipe` type. If you need to create new resources that are connected to the resources defined in the `Recipe` then create them after this line. The instance of `Recipe` has public properties for all of the resources that were created in the `Recipe`. -In this constructor a callback method called `CustomizeCDKProps` is setup. This callback method is called right before any constructs are created from the `Recipe`. This allows modifying the constructs property object before it is passed into the construct. The example below shows the `CustomizeCDKProps` callback that checks to see if the resource being created is the Beanstalk Environment. If it is cast the property object to the appropiate property object and then make whatever customizations operations needed. +In this constructor a callback method called `CustomizeCDKProps` is setup. This callback method is called right before any constructs are created from the `Recipe`. This allows modifying the construct's property object before it is passed into the construct. + +The example below shows the `CustomizeCDKProps` callback that checks to see if the resource being created is the Beanstalk Environment. If it is, cast the property object to the appropriate property object and then make whatever customizations are needed. ``` private void CustomizeCDKProps(CustomizePropsEventArgs evnt) @@ -101,6 +103,6 @@ private void CustomizeCDKProps(CustomizePropsEventArgs evnt) ### Configuration -The settings collected in the deploy tool are passed into the CDK project and then deserialized into the `Configuration` object defined in the project. If you add new settings to the recipe file you will need to add the Id of the new settings to the `Configuration`. If you added an `Object` setting with a collection of child settings then you need to create a new type with the child setting ids as properties on the new type. Then add a new property on the `Configuration` type for the new type with the property name being the id of the `Object` setting. +The settings collected in the deploy tool are passed into the CDK project and then deserialized into the `Configuration` object. If you add new settings to the recipe file you will need to add the Id of the new settings to the `Configuration` object. If you added an `Object` setting with a collection of child settings then you need to create a new type with the child setting ids as properties on the new type. Then add a new property on the `Configuration` type for the new type with the property name being the id of the `Object` setting. -The `Configuration` object follows the same pattern as descibed above putting configuration in the `Generated` directory. The `Configuration` type is a partial type and there is also a partial `Configuration.cs` file outside of the `Generated` directory where custom settings should be added. \ No newline at end of file +The `Configuration` object follows the same `Generated` directory pattern described above. Custom settings should be added to the partial `Configuration.cs` file outside of the `Generated` directory. \ No newline at end of file diff --git a/site/content/docs/deployment-projects/index.md b/site/content/docs/deployment-projects/index.md index 4593cf84a..ca6e367b2 100644 --- a/site/content/docs/deployment-projects/index.md +++ b/site/content/docs/deployment-projects/index.md @@ -1,39 +1,42 @@ -# Deployment projects +# Custom Deployment Projects -### What is a deployment project? +AWS Deploy Tool comes with multiple recipes that can deploy your .NET application to [several different AWS compute services](../support.md). These built-in recipes let you configure AWS resources related to your application such as IAM roles, virtual private clouds, and load balancers. -A deployment project allows you to customize the resources you deploy to AWS. For example if your deployment require additional application resources like a DynamoDB tables or SQS queues those resources could be added to the deployment project. +But what if your application uses additional AWS resources that are not included in the built-in recipes, such as DynamoDB tables or SQS queues? -When you have a deployment project you use the same deployment experience starting deployment with your application you want to deploy. The list of deployment recommendations will include your deployment projects. +You can create a **custom deployment project** to expand one of the built-in recipes to manage additional AWS resources and services. + +Once you create a custom deployment project, the AWS Deploy Tool CLI and the AWS Toolkit for Visual Studio will display it alongside the built-in recipes and offer users the same deployment experience. + +### Parts of a custom deployment project + +A custom deployment project is comprised of two parts. You can follow the getting start guide on this page or the [tutorial](./tutorial.md) to create these, then refer to the full reference guides below. + +* [Recipe file](./recipe-file.md) - a JSON file that drives the user experience in both the deploy tool CLI and AWS Toolkit for Visual Studio. +* [.NET CDK project](./cdk-project.md) - a C# project that uses the [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/) to define the infrastructure that will be created for the deployment project. ### Getting started -To get started creating a deployment project execute the following command in the directory of the .NET project to deploy. +To create a custom deployment project, execute the following command in the directory of the .NET project you wish to deploy. dotnet aws deployment-project generate --output --project-display-name -The `--output` switch sets the directory where the deployment project will be saved to. To customize the name the deployment project that will be shown to users when the .NET project is being deployed use the `--project-display-name` switch. +The `--output` switch sets the directory where the deployment project will be saved. Use the `--project-display-name` switch to customize the name of the custom recipe that will be shown to users when the .NET project is being deployed. -Once you run the `dotnet aws deployment-project generate` the tool will display a list of system recipes that are compatible for the .NET project. Choose the recipe that is closest to what your project needs. These recipes will be used as the starting point for your deployment project that you can later customize. +When you run the above command, the tool will display a list of built-in recipes that are compatible with your .NET project. Choose the built-in recipe that is closest to what you wish to deploy. This will be used as the starting point that you can then customize. Select the starting recipe and then a deployment project will be created in the location of the `--output` directory. Now you can begin customizing the deployment project. ### Add to source control -When you use a deployment project to deploy a .NET project it is important to add the deployment project to source control. Redeployments require the deployment project to be available to the deployment tooling. If a CloudFormation stack was created from a deployment project and that +It is important to add the custom deployment project to source control. Redeployments require the custom deployment project to be available to the deployment tooling. If a CloudFormation stack was created from a custom deployment project and that deployment project has been deleted then you will not be able to redeploy to that CloudFormation stack. -### Searching for deployment projects - -When the deploy command is initiated the tooling searchs for the solution of the .NET project and searches for deployment project anywere underneath the solution directory. The deployment projects are sent through the deployment tooling's recommendation engine to make sure they are compatible with the project being deployed. - -If the deployment project is outside of the solution directory the `--deployment-project` switch for the `dotnet aws deploy` command can be used to pass in the path of the deployment project to use. This is common for shared deployment-projects across multiple solutions. +### Searching for custom deployment projects -### Parts of a deployment project +When the deploy command is initiated AWS Deploy Tool starts from the solution (.sln) of the .NET project being deployed and searches for custom deployment projects anywhere underneath the solution directory. The custom deployment projects are sent through the deployment tooling's recommendation engine to make sure they are compatible with the .NET project being deployed. -A deployment project is made of 2 parts. Click on the links below for a information about each part. +If the custom deployment project is outside of the solution directory use the `--deployment-project` switch for the `dotnet aws deploy` command to pass in the path of the custom deployment project to use. This is common when sharing custom deployment projects across multiple solutions. -* [Recipe JSON file](./recipe-file.md) - a JSON file that drives the deployment experience in the deploy tool CLI and AWS Toolkit for Visual Studio. -* [.NET CDK project](./cdk-project.md) - a C# project that uses the CDK to define the infrastructure that will be created for the deployment project. diff --git a/site/content/docs/deployment-projects/recipe-file.md b/site/content/docs/deployment-projects/recipe-file.md index 51d51037a..e18ac50ad 100644 --- a/site/content/docs/deployment-projects/recipe-file.md +++ b/site/content/docs/deployment-projects/recipe-file.md @@ -1,28 +1,28 @@ # Deployment project recipe -In the deployment project is a JSON file with a `.recipe` extension. This file is called the recipe definition of a deployment project. This file provides all of the metadata that drives the experience through deployment tooling CLI and Visual Studio experience. +In the custom deployment project is a JSON file with a `.recipe` extension. This file provides all of the metadata that drives the experience through the AWS Deploy Tool CLI and the AWS Toolkit for Visual Studio. -The recipe file defines the type of .NET projects the deployment project is compatible with and the settings that will be shown to users. +The recipe file defines the type of .NET projects the recipe is compatible with and the settings that will be shown to users. -The schema for the recipe file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json) +The full schema for the recipe file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json). ### Top level settings This is the list of top level properties in the recipe definition. -* **Id** - the of the deployment project. The CloudFormation stack will be tagged with this id, telling the deployment tooling what deployment projects to use in the future for redeployments. -* **Name** - the name of the deployment project shown in the list of recommendations -* **ShortDescription** - description used when showing the list of recommendations in a list. -* **Description** - description used when the recommendation more information is clicked. +* **Id** - the Id of the deployment project. The CloudFormation stack will be tagged with this Id which is used to identify which stacks to update when redeploying. +* **Name** - the name of the deployment project, shown in the list of recommendations. +* **ShortDescription** - description used when showing the list of recommendations. +* **Description** - longer description shown when hovering over the recommendation in Visual Studio. * **TargetService** - the main AWS service the application will be deployed to. Visual Studio uses this to provide visual indicators. * **DeploymentType** - for deployment projects this value should always be `CdkProject`. -* **DeploymentBundle** - how the .NET project should be bundled. Allowed values are `Container` and `DotnetPublishZipFile`. -* **DisplayedResources** - the list of resources to display to users after deployments. -* **RecipePriority** - the priority of the recipe in the compatibly list. -* **RecommendationRules** - the list of rules to determine the recipe's compatiblity with the project being deployed. +* **DeploymentBundle** - how the .NET project being deploying should be bundled. Allowed values are `Container` and `DotnetPublishZipFile`. +* **DisplayedResources** - the list of resources to display to users at the end of the deployment. +* **RecipePriority** - the priority of the recipe in the compatibility list. +* **RecommendationRules** - the list of rules to determine the recipe's compatibility with the project being deployed. * **Categories** - the list of categories for the option settings. -* **OptionSettings** - the list of settings users can configured during deployment. +* **OptionSettings** - the list of settings users can configure during deployment. ### Displayed Resources @@ -42,13 +42,13 @@ Here is an example for a recipe that wants to the Elastic Beanstalk environment `DisplayedResources` objects have the following properties: -* **LogicalId** - the CloudFormation logical id of the AWS resource. The CDK will generate a unqiue hash as the suffix of the logical resource id. The easiest way to figure out the value to set here is to do an initial deployment of the deployment project and then look up the logical id in the CloudFormation console. +* **LogicalId** - the CloudFormation logical id of the AWS resource. The CDK will generate a unique hash as the suffix of the logical resource id. The easiest way to figure out the value to set here is to do an initial deployment of the deployment project and then look up the logical id in the CloudFormation console. * **Description** - a description for the resource shown to users in the list of display resources. -### Compatiblity Rules +### Compatibility Rules -The recipe file defines a collection of rules that the deployment tool executes against the .NET project being deployed to determine if the deployment project is compatible for the .NET project. A rule is made up of a list of tests to run and the effect to apply. +The recipe file defines a collection of rules that the deployment tool executes against the .NET project being deployed to determine if the recipe is compatible with the .NET project. A rule is made up of a list of tests to run and the effect to apply. #### Tests @@ -77,14 +77,14 @@ The `Type` property determines the type of test to run. The `Condition` contains | MSProperty | Compares the property in a project file property group. |
    • PropertyName - the property to compare.
    • AllowedValues - an array of possible values for the property.
    | | MSPropertyExists | Test to see if a property in a property group exists. |
    • PropertyName - the property test for existence.
    | | FileExists | Tests to see if a file exist. For example checking to see a `Dockerfile` exists. |
    • FileName - the file to test for existence.
    | -| NuGetPackageReference | Test to see if the project has a `PackageReference` to a NuGet pacakge. |
    • NuGetPackageName - the NuGet package to test if it is being referenced.
    | +| NuGetPackageReference | Test to see if the project has a `PackageReference` to a NuGet package. |
    • NuGetPackageName - the NuGet package to test if it is being referenced.
    | #### Effect -A rule contains an effect that defines the behavior of a rule depending on if all of the test pass or not. Effects can either mark the recipe as not included in the compatible list or adjust the priority for the recipe. +A rules effect defines the behavior of the rule depending on if its test(s) pass or not. Effects can either mark the recipe as not included in the compatible list or adjust the priority for the recipe. -Here is an example of a rule that checks the project is a web project and targets .NET Core 3.1 or .NET 6. If both test pass the effect's `Pass` property instructs the deployment tooling to include the recipe. If either one of the 2 test fail the `Fail` effect is run, removing the recipe from the included compatible list. +Here is an example of a rule that checks the project is a web project and targets .NET Core 3.1 or .NET 6. If both tests pass the effect's `Pass` property instructs the deployment tooling to include the recipe. If either one of the two tests fail the `Fail` effect is run, removing the recipe from the included compatible list. ```json "RecommendationRules": [ @@ -146,7 +146,9 @@ Here is another example that tests if a project contains a docker file. If it do ] ``` -A recipe is considered compatible if no rule ran an effect that set `Include` to false and if the priority is greater then 0. To simulate an **"or"** set of rules the starting priority in `RecipePriority` can be set to a negative value meaning by default it is not included. Then you can have a series of tests that adjust the priority to a positive amount. That way if any test rule passes it can adjust the priority to a positive number. +A recipe is considered compatible if no rule ran an effect that set `Include` to false and if the priority is greater then 0. + +To simulate an **"or"** set of rules the starting priority in `RecipePriority` can be set to a negative value meaning it is not included by default. Then you can have a series of tests that adjust the priority to a positive amount. That way if any test rule passes it can adjust the priority to a positive number. ### Setting Categories @@ -155,10 +157,11 @@ The `Categories` property is an array of objects that define the categories for ![Catagories in AWS Toolkit for Visual Studio](../../assets/images/vs-catagories.png) -A category is defined with the following properties: +A category is defined with the following properties: + * **Id** - the unique id within the recipe for the category. * **DisplayName** - the name of the category displayed to users. -* **Order** - the order in the toolkit for the category. Categories are display in sorted decending order. +* **Order** - the order in the toolkit for the category. Categories are display in sorted descending order. Here is an example of defining a custom category that you could use to categorize additional settings added as application resources. @@ -170,23 +173,23 @@ Here is an example of defining a custom category that you could use to categoriz } ``` -Settings can be assigned to a category setting the `Category` property of a setting to the `Id` of a category. Only top level settings can be assigned a category. Any top level settings that are not assigned a category will be placed in the `General` category. +To assign a setting to a category, set the setting's `Category` property of to the `Id` of a category. Only top level settings can be assigned a category. Any top level settings that are not assigned a category will be placed in the `General` category. ### Option Settings The settings that are shown to users and allows users to customize the deployment in either the CLI or Visual Studio are defined in the `OptionSettings` array. Settings have the following properties. -* **Id** - the id of the setting. Once projects are deployed with the recipe this id should not change because the id is saved into the CloudFormation stack's template. +* **Id** - the id of the setting. Once projects are deployed with the recipe, this id should not change because the id is saved into the CloudFormation stack's template. * **Name** - the name of the setting shown to users. * **Description** - the informational text shown to users for the setting. * **Type** - the data type of the setting. * **DefaultValue** - the default value for the setting. * **TypeHint** - a hint to the deployment tooling what the meaning of the setting is. * **TypeHintData** - additional information to pass into the type hint. -* **AdvancedSetting** - a boolean whether this setting is an advanced use case. If true the setting might not be shown to users unless the request to see all settings. -* **Updatable** - a boolean that controls whether a setting can be modified during redeployment. It is recommended settings that trigger tearing down resources that would make the application unavailable be marked as `false`. +* **AdvancedSetting** - a boolean for whether this setting is an advanced use case. If true the setting might not be shown to users unless the request to see all settings. +* **Updatable** - a boolean that controls whether a setting can be modified during redeployment. It is recommended to set this to `false` for settings where deleting resources once they exist would make the application unavailable. * **AllowedValues** - the list of possible values. -* **ValueMapping** - a mapping to the values in the `AllowedValues` to user friendly display names for each allowed value. +* **ValueMapping** - a mapping between values in the `AllowedValues` list to user friendly display names for each allowed value. * **ChildOptionSettings** - if the `Type` property is set to `Object` this list contains a child option settings. * **DependsOn** - a list of expressions to determine if this setting should be visible. * **Validators** - a list of validators to run when values are set for the setting to ensure the value is valid. @@ -209,9 +212,9 @@ If the data type is set to `Object` the setting has child settings that are defi #### TypeHint -Type hints are used to give hints to the CLI or Visual Studio toolkit the meaning behind setting beyond the basic data type. For example if the `TypeHint` property is set to `ExistingECSCluster` the deployment tool knows this `String` data type setting should be set to the name of an existing ECS cluster and so presents the list of clusters to the user. +Type hints are used to control the user experience in the CLI or Visual Studio. For example if the `TypeHint` property is set to `ExistingECSCluster` the deployment tool knows this `String` data type setting should be set to the name of an existing ECS cluster and presents the list of existing clusters to the user. -Some type hints require additional configuration which can specified in the `TypeHintData` property. For example if a setting has a type hint of `ExistingIAMRole` the tooling should only show roles that can be assumed by the target service. Here is a example of configuring the `ServicePrincipal` for the type hint to filter the list of roles to pick from. +Some type hints require additional configuration which can specified in the `TypeHintData` property. For example if a setting has a type hint of `ExistingIAMRole` the tool should only show roles that can be assumed by the target service. Here is a example of configuring the `ServicePrincipal` for the type hint to filter the list of roles to pick from. ``` { @@ -238,7 +241,7 @@ Here is the list of available type hints in the deployment tooling. | ECSService | | | | ECSTaskSchedule | | | | EC2KeyPair | | | -| Vpc | | Set at the `Object` level that controls whther to create a new VPC or select an existing VPC. | +| Vpc | | Set at the `Object` level that controls whether to create a new VPC or select an existing VPC. | | ExistingVpc | | Set at the `String` setting level for storing the existing VPC ID. | | AppRunnerService | | | | VPCConnector | | Set at the `Object` level for creating or selecting an App Runner VPC Connector. | @@ -266,11 +269,11 @@ Here is the list of available type hints in the deployment tooling. #### DependsOn -The `DependsOn` property is an array of conditions on other setting values to determine if a setting should be visible. For example if a user selects the setting to create a new IAM role then the setting for the selecting an existing IAM role should not be displayed. +The `DependsOn` property is an array of conditions to determine if a setting should be visible based on the values for other setting(s). For example if a user selects the setting to create a new IAM role then the setting for the selecting an existing IAM role should not be displayed. Each item in the `DependsOn` array has the following properties. -* **Id** - the id of the setting compare. The id should be full id including all parent objec id settings. The format is .. +* **Id** - the id of the setting compare. The id should be full id including all parent object id settings. The format is .. * **Operation** - the operation to run. Allowed values are `NotEmpty` and `Equals`. If operation is not set then the default is `Equals`. * **Value** - the value to compare when the operation is `Equals`. @@ -300,7 +303,7 @@ Here is an example for a setting used for storing an existing IAM role to use. T #### Validators -Validators on a setting allow telling the user when a setting has an invalid value before starting the deployment. Each setting can have a list of validators assign in the `Validators` array. Validators can do simple checks like making sure string values are of a certain format as well as make AWS service calls to make sure the value of an existing resource exists. +Validators allow telling the user when a setting has an invalid value before starting the deployment. Each setting can have a list of validators specified in the `Validators` array. Validators can do simple checks like making sure string values are of a certain format as well as make AWS service calls to make sure the value of an existing resource exists. Here is an example of a validator for a port setting that ensures the value is within the range 0 to 51200. @@ -334,20 +337,20 @@ The `ValidatorType` property determines the type of validator to run. The `Confi | Validator Type | Description | Configuration properties | | ---- | ----------- | ---------- | -| Range | For numeric settings define the min and max values. |
    • Min - the min value.
    • Max - the max value.
    • ValidationFailedMessage - the error message shown if the regular expression fails to match.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | -| Regex | For string settings define a regular expression that value must match. |
    • Regex - the regular expression to match against the value of the setting.
    • ValidationFailedMessage - the error message shown if the validator fails.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | +| Range | For numeric settings define the min and max values. |
    • Min - the min value.
    • Max - the max value.
    • ValidationFailedMessage - the error message shown if the validator fails.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | +| Regex | For string settings define a regular expression that the value must match. |
    • Regex - the regular expression to match against the value of the setting.
    • ValidationFailedMessage - the error message shown if the validator fails.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | | Required | A value is required for the setting. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    | -| DirectoryExists | For string settings representing a directory. Validates the diretory exists. | | -| DockerBuildArgs | Ensures the value is valid for being passed to the docker build command. | | -| DotnetPublishArgs | Ensures the value is valid for being passed to the dotnet publish command. | | -| ExistingResource | Using the [AWS Cloud Control API GetResource](https://docs.aws.amazon.com/cloudcontrolapi/latest/APIReference/API_GetResource.html) ensure the AWS resource exists. |
    • ResourceType - the AWS resource type to search for. For example `AWS::ECS::Cluster` for an ECS cluster.
    | -| FileExists | For string settings represeting a file path. Validates the file exists. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | +| DirectoryExists | For string settings representing a directory. Validates the directory exists. | | +| DockerBuildArgs | Ensures the value is valid for being passed to the `docker build` command. | | +| DotnetPublishArgs | Ensures the value is valid for being passed to the `dotnet publish` command. | | +| ExistingResource | Using the [AWS Cloud Control API GetResource](https://docs.aws.amazon.com/cloudcontrolapi/latest/APIReference/API_GetResource.html), ensure that the AWS resource exists. |
    • ResourceType - the AWS resource type to search for. For example `AWS::ECS::Cluster` for an ECS cluster.
    | +| FileExists | For string settings representing a file path. Validates the file exists. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    • AllowEmptyString - boolean that if true allows empty values to be set.
    | | StringLength | Validates the length of a string setting. |
    • MinLength - the min length for the string.
    • MaxLength - the max length for the string.
    • ValidationFailedMessage - the error message shown if the validator fails.
    | -| InstanceType | Validates the string value is a valid EC2 instance type. | | +| InstanceType | Validates the string value is a valid Linux EC2 instance type. | | | WindowsInstanceType | Validates the string value is a valid Windows EC2 instance type. | | | SubnetsInVpc | Validates the subnets are in the configured VPC. |
    • VpcId - the id of the setting that has the VPC configured for.
    • ValidationFailedMessage - the error message shown if the validator fails.
    | | SecurityGroupsInVpc | Validates the security group are in the configured VPC. |
    • VpcId - the id of the setting that has the VPC configured for.
    • ValidationFailedMessage - the error message shown if the validator fails.
    | -| Uri | Validates the value is a well formed URI string. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    | +| Uri | Validates the value is a well-formed URI string. |
    • ValidationFailedMessage - the error message shown if the validator fails.
    | | Comparison | Compares this setting with another setting. |
    • SettingId - the setting to compare to.
    • Operation - the comparison operation. Allowed values are `GreaterThan`.
    | | VPCSubnetsInDifferentAZs | Validates that the selected VPC must have at least two subnets in two different Availability Zones |
    • ValidationFailedMessage - the error message shown if the validator fails.
    | diff --git a/site/content/docs/deployment-projects/tutorial.md b/site/content/docs/deployment-projects/tutorial.md index c2b53baa2..60645cf6e 100644 --- a/site/content/docs/deployment-projects/tutorial.md +++ b/site/content/docs/deployment-projects/tutorial.md @@ -1,35 +1,36 @@ -# Deployment project tutorial +# Custom deployment project tutorial -For this tutorial we are going to assume we our on a team building the Acme.WebApp project. This web applicaton uses an AWS DynamoDB table as the backend store. We want to create a deployment project the team can use that deploys the application to Amazon Elastic Container Service (ECS) along with the application's DynamoDB table. +For this tutorial we going to create a custom deployment project to deploy our Acme.WebApp project. This web application uses an AWS DynamoDB table as the backend store. We want to create a custom deployment project that the team can use to deploy the application to Amazon Elastic Container Service (ECS) along with the application's DynamoDB table. -***Note: For this tutorial we are not concerned with the logic of the application being deployed. To follow along with this tutorial you can replace Acme.WebApp with any hello world web application.*** +***Note: For this tutorial we are not concerned with the logic of the application being deployed. To follow along with this tutorial you can replace Acme.WebApp with any "hello world" web application.*** Tasks we will accomplish: -* Creating a deployment project -* Modify the deployment project's recipe file to allow the user to configure what DynamoDB table to use. -* Customize the deployment project's CDK project to create the DynamoDB table and set an environment variable our application can read to know what table to use. +* Create a custom deployment project +* Modify the custom deployment project's recipe file to allow the user to configure what DynamoDB table to use. +* Customize the deployment project's CDK project to create the DynamoDB table and set an environment variable that our application can read to know which table to use. -### Creating deployment project +### Creating the custom deployment project -To create the deployment project navigate to the project directory of our application. Then run the following command to start creating the deployment project. +To create the custom deployment project, navigate to the Acme.WebApp project directory and run the following command. dotnet aws deployment-project generate --output ../Acme.WebApp.DeploymentProject --project-display-name "ASP.NET Core app with DynamoDB" -The deploy tool will then analyze the project and display what recommendation to use for the starting point of the deployment project. Since we want to deploy to ECS we will pick the option that says "ASP.NET Core App to Amazon ECS using AWS Fargate". +The AWS Deploy Tool will analyze the Acme.WebApp project and display which built-in recipes can be used as the starting point of the custom deployment project. Since we want to deploy to ECS, pick the option that says "ASP.NET Core App to Amazon ECS using AWS Fargate". -Once the option is picked the deployment project Acme.WebApp.DeploymentProject is created in a sibling project to the application project. The `--project-display-name` switch above configures the name of the recommendation that is shown in the deploy tool when deploying the application project. +Once the starting recipe is picked, `Acme.WebApp.DeploymentProject` is created in a sibling project to the application project. If you are using Visual Studio you might want to add the new `Acme.WebApp.DeploymentProject` project to your solution. + +The `--project-display-name` switch above configures the name of the recommendation that is shown in the deploy tool when deploying the application project. -If you are using Visual Studio you might want to add the Acme.WebApp.DeploymentProject project to your solution. ### Adding DynamoDB settings to the recipe -For our team members that will use our deployment project we want to give them the choice to either select an existing DynamoDB table or create a new table during deployment. To do that we need to add a few new settings to our deployment project's recipe definition. +We want to give our team members who will use the custom deployment project the choice to either select an existing DynamoDB table or create a new table during deployment. To do that we need to add a few new settings to our deployment project's recipe definition. -In the directory containing the deployment project open the `Acme.WebApp.DeploymentProject.recipe` file in your JSON editor of choice. In the file find the `OptionSettings` section that contains all of our settings that users can use to configure their project. +In the directory containing the deployment project open the `Acme.WebApp.DeploymentProject.recipe` file in your JSON editor of choice. Find the `OptionSettings` section that contains the settings users can use to configure their project. -To get started we are going to create a new object level setting called `Backend` to group all of our new settings. The snippet below shows the object level setting which is going to be grouped in the General settings category. +To get started we are going to create a new "Object" setting called `Backend` to group all of our new settings. The snippet below shows the object-level setting. The options we are about to create will be displayed to the users in the "General" category when configuring their deployment. ``` "OptionSettings": [ @@ -54,7 +55,7 @@ To get started we are going to create a new object level setting called `Backend } ``` -Now we are going to create our child settings. The first is a setting to determine if we should create a new table or not. This setting is a `Bool` type which is defaulted to `true`. As a best practice the `Updatable` setting is set to `false` to protected users from making an accidentaly mistake of deleting the table by switching to an existing table in the future. +Now we are going to create our child settings. The first is a setting to determine if we should create a new table or not. This setting is a `Bool` type which is defaulted to `true`. As a best practice the `Updatable` setting is set to `false` to protect users from accidentally deleting the table when redeploying in the future. ``` "ChildOptionSettings": [ @@ -74,7 +75,7 @@ Now we are going to create our child settings. The first is a setting to determi ``` -If the user unchecks the `CreateNewTable` setting we need to give the user a choice to select an existing table. This `ExistingTableName` setting table is a String type that will store the name of the DynamoDB table to use as the backend store. +If the user unchecks the `CreateNewTable` setting we need to give them the choice to select an existing table. This `ExistingTableName` setting is a "String" type that will store the name of an existing DynamoDB table to use as the backend store. ``` "ChildOptionSettings": [ @@ -116,12 +117,12 @@ If the user unchecks the `CreateNewTable` setting we need to give the user a cho ] ``` -Lets take a deeper dive into the properties for the `ExistingTableName` setting. +Let us take a deeper dive into the properties for the `ExistingTableName` setting. -* **TypeHint** - set to `DynamoDBTableName` letting the deploy tool know this String type is for DynamoDB tables. The deploy tool uses this information to show a list of tables to pick from. -* **Updatable** - since changing table names of existing tables is not a destructive change allow for this field to be updated during redeployments. -* **DependsOn** - Controls this setting only being visible if the previous `CreateNewTable` setting is set to `false`. Notice how the Id is the full name of the setting including the parent Object setting `Backend`. -* **Validators** - Build a couple validators to make sure the input name matches the regex for table names and that the name matches the required min and max length. Adding validators helps users get feedback right away when there is incorrect values for settings. +* **TypeHint** - Set to `DynamoDBTableName` which lets the deployment tool know this String type is for the name of a DynamoDB table. The deploy tool uses this information to show users a list of tables to pick from instead of a text-box. +* **Updatable** - Since modifying the name of an existing table is not a destructive change, we will allow this field to be updated during redeployments. +* **DependsOn** - This setting will only be visible if the previous `CreateNewTable` setting is set to `false`. Notice how the `Id` is the full name of the setting including the parent "Object" setting `Backend`. +* **Validators** - This attaches validators to make sure that the user-provided name matches the regex for valid table names and that the name meets the required minimum and maximum lengths. Adding validators provides feedback to users when invalid values are provided in either the CLI or Visual Studio. Here is the full snippet of the `Backend` Object setting with the child settings. ``` @@ -181,13 +182,15 @@ Here is the full snippet of the `Backend` Object setting with the child settings ### Customizing the deployment project's CDK project -Now that users can customize the backend settings in the deployment tooling the CDK project for the deployment project needs to be updated to react to the new settings. +Now that users can customize the backend settings when deploying, the CDK project for the custom deployment project needs to be updated to react to the new settings. -***Note: The .NET CDK projects generated by the deploy tool have the C# feature `Nullable` enabled in the project file. If you do not want this feature enabled edit the csproj file and remove the `Nullable` projecty from the PropertyGroup.*** +***Note: The .NET CDK projects generated by the deploy tool have the C# feature `Nullable` enabled in the project file. If you do not want this feature enabled edit the csproj file and remove the `Nullable` project from the PropertyGroup.*** #### Deserializing settings -When the deploy tool executes the CDK project it passes all of the settings collected from the user and deserializes into the `Configuration` type in the CDK project. We need to modify the `Configuration` type to have the new backend settings. Create a new class called `BackendConfiguration` in the `Configurations` directory. Below is the code for this new type with the properties for `CreateNewTable` and `ExistingTableName`. +When AWS Deploy Tool executes the CDK project it passes all of the settings collected from the user and deserializes them into the `Configuration` type in the CDK project. We need to modify the `Configuration` type to store the new backend settings. + +Create a new class called `BackendConfiguration` in the `Configurations` directory. Below is the code for this new type with the properties for `CreateNewTable` and `ExistingTableName`. ``` namespace Acme.WebApp.DeploymentProject.Configurations @@ -233,11 +236,11 @@ namespace Acme.WebApp.DeploymentProject.Configurations } ``` -Notice the `Backend` property was added to the partial class that is **not** in the Generated directory. In both the Configuration and BackendConfiguration type the property names match the setting ids used in the recipe file. This is important for the data to be property deserialized. +Notice that the `Backend` property was added to the partial class that is **not** in the `Generated` directory. In both the `Configuration` and `BackendConfiguration` types the property names match the setting ids used in the recipe file. This is important for the data to be property deserialized. #### CDK Changes -The `AppStack` class is the recommended place to customzie the AWS resources created by the CDK. In the constructor of this class we will modify it check if `CreateNewTable` is set to true. If it is then use the CDK construct to create a table as part of the CloudFormation stack. +The `AppStack` class is the recommended place to customize the AWS resources created by the CDK. We will modify the constructor of this class to check if `CreateNewTable` is set to true. If it is we will use the CDK construct to create a table as part of the CloudFormation stack. ``` using Amazon.CDK.AWS.DynamoDB; @@ -273,12 +276,15 @@ namespace Acme.WebApp.DeploymentProject } ``` -In the snippet above the table was created before `Recipe` construct. The `Recipe` construct has all of the AWS resources that are part of the original ECS recipe the deployment project was created from. Now that we have our table we need to pass the table name into the application. We are going to do this by setting an environment variable for the application. +In the snippet above the table is created before `Recipe` construct. The `Recipe` construct has all of the AWS resources that are part of the original, built-in ECS recipe that the custom deployment project was created from. + +Now that we have our table we need to pass the table name into our application code. We are going to do this by setting an environment variable that the application code will read. -The `CustomizeCDKProps` method in `AppStack` is a callback method that gets called for each AWS resources about to be created from the `Recipe` construct. Here is where we can set the environment variable. +The `CustomizeCDKProps` method in `AppStack` is a callback method that gets called for each AWS resource about to be created from the `Recipe` construct. Here is where we can set the environment variable. -To know which AWS resource is about to be created compare the `evnt.ResourceLogicalName` property to the public property name on the `Recipe` construct. The system recipes are written to make sure the resource logical name is the same as the public property name. In our scenario we are looking to see if the `AppContainerDefinition` is about to be created. When we determine that the callback is for `AppContainerDefinition` then we cast the `evnt.Props` to the corresponding property object for `AppContainerDefinition` in this case `ContainerDefinitionOptions`. From `ContainerDefinitionOptions` we can set the table name. +To know which AWS resource is about to be created, compare the `evnt.ResourceLogicalName` property to the public property name on the `Recipe` construct. The built-in recipes are written to make sure the resource logical name is the same as the public property name. In our scenario we are looking to see if the `AppContainerDefinition` is about to be created. +When we determine that the callback is for `AppContainerDefinition` then we cast the `evnt.Props` to the corresponding property object for `AppContainerDefinition`, in this case `ContainerDefinitionOptions`. From `ContainerDefinitionOptions` we can set the table name in an environment variable. ``` private void CustomizeCDKProps(CustomizePropsEventArgs evnt) @@ -308,7 +314,7 @@ private void CustomizeCDKProps(CustomizePropsEventArgs evnt) ### Using the deployment project -Deployment projects are used through the same deployment process as the system recipes. For the CLI deploy tool experience execute the `dotnet aws deploy` command in the application project directory. The new deployment project will be displayed as the recommended option. +Custom deployment projects are used through the same deployment workflow as the built-in recipes. For the CLI deploy tool, execute the `dotnet aws deploy` command in the application project directory. The custom deployment project will be displayed as the recommended option. ``` Recommended Deployment Option @@ -325,7 +331,7 @@ This ASP.NET Core application will be deployed to Amazon Elastic Container Servi ``` -The settings for the recommendation shows the Backend settings we customized. If we navigate to the backend settings the deploy tool will allow choosing to use a new table or picking an existing table. +The settings for the recommendation shows the Backend settings we customized. If we navigate to the backend settings the deploy tool will allow the user to choose between using a new table or picking an existing table. ``` ... @@ -346,6 +352,6 @@ Current settings (select number to change its value) ``` -The AWS Toolkit for Visual Studio will also recognize the deployment project when deploying the application project. The deployment project will show up as the highest recommended option and if you edit settings you will be able to choose to use a new table or get a drop down box of available tables in my account. +The AWS Toolkit for Visual Studio will also recognize the custom deployment project. The deployment project will show up as the highest recommended option and the user will also be able to choose between creating a new table or choosing from a drop-down list of available tables in the account that is being deployed to. -When you are using deployment project for deploying applications the deployment project should be checked in as part of source control. The deployment project is required for redeployments to existing CloudFormation stacks that were created from the deployment project. \ No newline at end of file +The custom deployment project should be checked in to your source control. The deployment project is required for redeployments to existing CloudFormation stacks that were created from the custom deployment project. \ No newline at end of file From fb3eade7f82d5c499d546eafd7c5841f7b817f43 Mon Sep 17 00:00:00 2001 From: Alex Shovlin Date: Tue, 2 Aug 2022 18:39:12 -0400 Subject: [PATCH 12/14] Add screenshot to docs for custom deployment projects. --- .../assets/images/custom-deployment-project.PNG | Bin 0 -> 34762 bytes site/content/docs/commands/project.md | 4 ++-- .../docs/deployment-projects/cdk-project.md | 4 ++-- site/content/docs/deployment-projects/index.md | 3 +++ 4 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 site/content/assets/images/custom-deployment-project.PNG diff --git a/site/content/assets/images/custom-deployment-project.PNG b/site/content/assets/images/custom-deployment-project.PNG new file mode 100644 index 0000000000000000000000000000000000000000..c7d3faeee9a19c391f8bf3da2f21a5220eada53e GIT binary patch literal 34762 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 literal 0 HcmV?d00001 diff --git a/site/content/docs/commands/project.md b/site/content/docs/commands/project.md index 7978f77a7..0595eb7eb 100644 --- a/site/content/docs/commands/project.md +++ b/site/content/docs/commands/project.md @@ -7,11 +7,11 @@ dotnet aws deployment-project generate [-d|--diagnostics] [-s|--silent] [--profile ] [--region ] [--project-path ] [--project-display-name ] ### Description -Generates and saves the deployment CDK project in a user provided directory path without proceeding with a deployment. Allows user to customize the CDK project before deploying the application. +Generates and saves the [deployment CDK project](../deployment-projects/index.md) in a user provided directory path without proceeding with a deployment. Allows user to customize the CDK project before deploying the application. ### Examples -Creating a deployment project based on the .NET project in the current directory. The new deployment project will be saved to a sibling directory called CustomDeploymentProject. When the .NET project is next deployed the deployment project will be an available option called "Team custom deployment project". +Creates a deployment project based on the .NET project in the current directory. The new deployment project will be saved to a sibling directory called CustomDeploymentProject. The project display name _"Team custom deployment project"_ will be displayed to users when selecting a publish target when deploying with the custom deployment project. dotnet aws deployment-project generate --output ../CustomDeploymentProject --project-display-name "Team custom deployment project" diff --git a/site/content/docs/deployment-projects/cdk-project.md b/site/content/docs/deployment-projects/cdk-project.md index e182569df..70b1287ee 100644 --- a/site/content/docs/deployment-projects/cdk-project.md +++ b/site/content/docs/deployment-projects/cdk-project.md @@ -17,9 +17,9 @@ The main concepts to understand about the CDK are the following. * Construct properties - For every construct this is a properties object that is created first, all necessary values are set and then passed into the constructor of a construct. -### Main method +### Main method in Program.cs -The main method for the CDK deployment project must be coded in a certain style to ensure compatibility with the deploy tool. The deploy tool relies on .NET's Configuration system to pass along settings from the deploy tool to the CDK project. In the example below the `ConfigurationBuilder().AddAWSDeployToolConfiguration(app)` method reads the settings that were passed into the project from the deploy tool. +The `Main` method in `Program.cs` for the CDK deployment project must be coded in a certain style to ensure compatibility with the deploy tool. The deploy tool relies on .NET's Configuration system to pass along settings from the deploy tool to the CDK project. In the example below the `ConfigurationBuilder().AddAWSDeployToolConfiguration(app)` method reads the settings that were passed into the project from the deploy tool. With the configuration read from the deploy tool, the CDK environment is set to the account and region the deploy tool was configured with. diff --git a/site/content/docs/deployment-projects/index.md b/site/content/docs/deployment-projects/index.md index ca6e367b2..00cc347e4 100644 --- a/site/content/docs/deployment-projects/index.md +++ b/site/content/docs/deployment-projects/index.md @@ -8,6 +8,9 @@ You can create a **custom deployment project** to expand one of the built-in rec Once you create a custom deployment project, the AWS Deploy Tool CLI and the AWS Toolkit for Visual Studio will display it alongside the built-in recipes and offer users the same deployment experience. +![Custom Deployment Project in AWS Toolkit for Visual Studio](../../assets/images/custom-deployment-project.png) +_The recommended publish target is a custom deployment project that manages a DynamoDB table in addition to the ASP.NET Core project._ + ### Parts of a custom deployment project A custom deployment project is comprised of two parts. You can follow the getting start guide on this page or the [tutorial](./tutorial.md) to create these, then refer to the full reference guides below. From b76defda56eb0a5f5340058df54d800bf03878d8 Mon Sep 17 00:00:00 2001 From: Alex Shovlin Date: Tue, 2 Aug 2022 21:54:53 -0400 Subject: [PATCH 13/14] Fix additional feedback on deployment project CDK docs --- site/content/docs/deployment-projects/cdk-project.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/content/docs/deployment-projects/cdk-project.md b/site/content/docs/deployment-projects/cdk-project.md index 70b1287ee..67f96b645 100644 --- a/site/content/docs/deployment-projects/cdk-project.md +++ b/site/content/docs/deployment-projects/cdk-project.md @@ -13,8 +13,8 @@ The following links are useful resources to learn how to write .NET CDK projects The main concepts to understand about the CDK are the following. * Stack - this is the top level container for all of the AWS resources represented as constructs. In deployment projects this type is usually the `AppStack` type in the project. -* Constructs - AWS resources are modeled as constructs. Some constructs are a one-to-one mapping to a single AWS resource. The CDK also has higher level abstractions where a single construct represents a collection of AWS resources that solve a specific problem. -* Construct properties - For every construct this is a properties object that is created first, all necessary values are set and then passed into the constructor of a construct. +* Constructs - AWS resources are modeled as constructs. Some constructs are a one-to-one mapping to a single AWS resource. The CDK also has higher level abstractions where a single construct represents a collection of AWS resources that solve a common problem. +* Construct properties - For every construct there is a properties object that is created first, all necessary values are set and then passed into the constructor of a construct. ### Main method in Program.cs From f4f034703991b46d0e3f34c58da9625d945135c0 Mon Sep 17 00:00:00 2001 From: Irene Kors Date: Wed, 3 Aug 2022 16:24:10 -0400 Subject: [PATCH 14/14] docs: Deployment project documentation revisions --- mkdocs.yml | 9 +- site/content/assets/images/cliAfter.png | Bin 0 -> 61562 bytes site/content/assets/images/cliAfterBorder.png | Bin 0 -> 73953 bytes site/content/assets/images/cliBefore.png | Bin 0 -> 71216 bytes .../assets/images/solutionWithCDKProject.png | Bin 0 -> 39523 bytes site/content/docs/commands/project.md | 7 +- .../docs/deployment-projects/cdk-project.md | 101 +++++++------- .../content/docs/deployment-projects/index.md | 49 +++---- .../docs/deployment-projects/recipe-file.md | 23 ++-- site/content/faq.md | 6 + site/content/index.md | 20 +-- .../custom-project.md} | 127 ++++++++++++------ 12 files changed, 199 insertions(+), 143 deletions(-) create mode 100644 site/content/assets/images/cliAfter.png create mode 100644 site/content/assets/images/cliAfterBorder.png create mode 100644 site/content/assets/images/cliBefore.png create mode 100644 site/content/assets/images/solutionWithCDKProject.png rename site/content/{docs/deployment-projects/tutorial.md => tutorials/custom-project.md} (56%) diff --git a/mkdocs.yml b/mkdocs.yml index 64fca358f..6a6a4a796 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,12 +27,13 @@ nav: - Docker support: - Dockerfile generation: docs/docker/docker-generation.md - Publishing a Docker image: docs/docker/publish-image.md - - Custom Deployment Projects: - - Getting Started: docs/deployment-projects/index.md - - Tutorial: docs/deployment-projects/tutorial.md + - Deployment Projects: + - Overview: docs/deployment-projects/index.md - Recipe File: docs/deployment-projects/recipe-file.md - CDK Project: docs/deployment-projects/cdk-project.md - Integrating with CI/CD: docs/cicd.md + - Tutorials: + - Customizing deployment projects: tutorials/custom-project.md - Troubleshooting Guide: - troubleshooting-guide/index.md - Missing Dependencies: troubleshooting-guide/missing-dependencies.md @@ -56,4 +57,4 @@ theme: markdown_extensions: - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji \ No newline at end of file + emoji_index: !!python/name:materialx.emoji.twemoji diff --git a/site/content/assets/images/cliAfter.png b/site/content/assets/images/cliAfter.png new file mode 100644 index 0000000000000000000000000000000000000000..365118f38cd8427d62852d00110f524835923a6d GIT binary patch literal 61562 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 literal 0 HcmV?d00001 diff --git a/site/content/docs/commands/project.md b/site/content/docs/commands/project.md index 0595eb7eb..40165ea6a 100644 --- a/site/content/docs/commands/project.md +++ b/site/content/docs/commands/project.md @@ -9,9 +9,12 @@ ### Description Generates and saves the [deployment CDK project](../deployment-projects/index.md) in a user provided directory path without proceeding with a deployment. Allows user to customize the CDK project before deploying the application. +* The `--output` switch sets the directory where the deployment project will be saved. +* The `--project-display-name` switch sets the name that will be shown when the .NET project is being deployed. + ### Examples -Creates a deployment project based on the .NET project in the current directory. The new deployment project will be saved to a sibling directory called CustomDeploymentProject. The project display name _"Team custom deployment project"_ will be displayed to users when selecting a publish target when deploying with the custom deployment project. +This example creates a deployment project from the .NET project in the current directory. The deployment project will be saved to a sibling directory called CustomDeploymentProject. The name _"Team custom deployment project"_ will be displayed in the list of the available deployment options. - dotnet aws deployment-project generate --output ../CustomDeploymentProject --project-display-name "Team custom deployment project" + dotnet aws deployment-project generate --output ../CustomDeploymentProject --project-display-name "Team custom deployment project" diff --git a/site/content/docs/deployment-projects/cdk-project.md b/site/content/docs/deployment-projects/cdk-project.md index 67f96b645..dc9c18ba7 100644 --- a/site/content/docs/deployment-projects/cdk-project.md +++ b/site/content/docs/deployment-projects/cdk-project.md @@ -1,59 +1,22 @@ # CDK Project -A custom deployment project uses a C# Cloud Development Kit (CDK) project to create the AWS infrastructure as a CloudFormation stack based on the settings provided by the user and to deploy your project to that infrastructure. +Each deployment project has a C# Cloud Development Kit (CDK) project. This CDK project is used to create the AWS infrastructure as a CloudFormation stack based on the user settings and to deploy your project to that infrastructure. +Read our [tutorial](../../tutorials/custom-project.md) to see how you can customize this CDK project to add additional infrastructure resources for your deployments. -### CDK Refresher -The following links are useful resources to learn how to write .NET CDK projects. +### What is AWS CDK? -* [.NET CDK Workshop](https://cdkworkshop.com/40-dotnet.html) -* [.NET CDK Reference](https://docs.aws.amazon.com/cdk/api/v2/dotnet/api/index.html) -* [AWS CDK Developer Guide](https://docs.aws.amazon.com/cdk/v2/guide/home.html) - -The main concepts to understand about the CDK are the following. - -* Stack - this is the top level container for all of the AWS resources represented as constructs. In deployment projects this type is usually the `AppStack` type in the project. -* Constructs - AWS resources are modeled as constructs. Some constructs are a one-to-one mapping to a single AWS resource. The CDK also has higher level abstractions where a single construct represents a collection of AWS resources that solve a common problem. -* Construct properties - For every construct there is a properties object that is created first, all necessary values are set and then passed into the constructor of a construct. - - -### Main method in Program.cs - -The `Main` method in `Program.cs` for the CDK deployment project must be coded in a certain style to ensure compatibility with the deploy tool. The deploy tool relies on .NET's Configuration system to pass along settings from the deploy tool to the CDK project. In the example below the `ConfigurationBuilder().AddAWSDeployToolConfiguration(app)` method reads the settings that were passed into the project from the deploy tool. - -With the configuration read from the deploy tool, the CDK environment is set to the account and region the deploy tool was configured with. - -The other major difference from normal CDK projects is the call to `CDKRecipeSetup.RegisterStack`. This is required to stamp the CloudFormation stack with the recipe id that created the stack. Future redeployments can only update existing stacks that were created by the original recipe. It also serializes the settings collected from the deploy tool into the metadata for the CloudFormation stack so redeployments can use the previous settings used for deployment. +The [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/) is an open-source software development framework to define your cloud application resources using familiar programming languages. -``` -public static void Main(string[] args) -{ - var app = new App(); +The following links are useful resources to learn more about AWS CDK and how to write .NET CDK projects. - var builder = new ConfigurationBuilder().AddAWSDeployToolConfiguration(app); - var recipeProps = builder.Build().Get>(); - var appStackProps = new DeployToolStackProps(recipeProps) - { - Env = new Environment - { - Account = recipeProps.AWSAccountId, - Region = recipeProps.AWSRegion - } - }; - - // The RegisterStack method is used to set identifying information on the stack - // for the recipe used to deploy the application and preserve the settings used in the recipe - // to allow redeployment. The information is stored as CloudFormation tags and metadata inside - // the generated CloudFormation template. - CDKRecipeSetup.RegisterStack(new AppStack(app, appStackProps), appStackProps.RecipeProps); - - app.Synth(); -} -``` +* [AWS CDK Developer Guide](https://docs.aws.amazon.com/cdk/v2/guide/home.html) +* [.NET CDK Workshop](https://cdkworkshop.com/40-dotnet.html) +* [.NET CDK Reference](https://docs.aws.amazon.com/cdk/api/v2/dotnet/api/index.html) ### Layout of a CDK deployment project -The layout of the generated CDK project puts all the code that was used to create the AWS resources defined in the starting recipe in a directory called **Generated**. +The layout of the generated CDK project puts all the code that was used to create the AWS resources defined in the starting recipe in a directory called **Generated**. ![Catagories in AWS Toolkit for Visual Studio](../../assets/images/deployment-project-file-layout.png) @@ -80,7 +43,7 @@ internal AppStack(Construct scope, IDeployToolStackProps props) // Create additional CDK constructs here. The recipe's constructs can be accessed as properties on // the generatedRecipe variable. } -``` +``` The `var generatedRecipe = new Recipe(this, props.RecipeProps);` line of code creates all of the AWS resources from the `Generated` directory. Your customizations could create new AWS resources via CDK constructs before or after this line. Typically you would create new resources before this line if you want those resources to be connected to the resources defined in the `Recipe` type. If you need to create new resources that are connected to the resources defined in the `Recipe` then create them after this line. The instance of `Recipe` has public properties for all of the resources that were created in the `Recipe`. @@ -101,8 +64,46 @@ private void CustomizeCDKProps(CustomizePropsEventArgs evnt) } ``` -### Configuration +### Main method in Program.cs + +The `Main` method in `Program.cs` for the CDK deployment project must be coded in a certain style to ensure compatibility with the deploy tool. The AWS Deploy Tool relies on .NET's Configuration system to pass along settings from the deploy tool to the CDK project. In the example below the `ConfigurationBuilder().AddAWSDeployToolConfiguration(app)` method reads the settings that were passed into the project from the deploy tool. + +With the configuration read from the deploy tool, the CDK environment is set to the account and region the deploy tool was configured with. + +The other major difference from normal CDK projects is the call to `CDKRecipeSetup.RegisterStack`. This is required to stamp the CloudFormation stack with the recipe id that created the stack. Future redeployments can only update existing stacks that were created by the original recipe. It also serializes the settings collected from the deploy tool into the metadata for the CloudFormation stack so redeployments can use the previous settings used for deployment. + +``` +public static void Main(string[] args) +{ + var app = new App(); + + var builder = new ConfigurationBuilder().AddAWSDeployToolConfiguration(app); + var recipeProps = builder.Build().Get>(); + var appStackProps = new DeployToolStackProps(recipeProps) + { + Env = new Environment + { + Account = recipeProps.AWSAccountId, + Region = recipeProps.AWSRegion + } + }; + + // The RegisterStack method is used to set identifying information on the stack + // for the recipe used to deploy the application and preserve the settings used in the recipe + // to allow redeployment. The information is stored as CloudFormation tags and metadata inside + // the generated CloudFormation template. + CDKRecipeSetup.RegisterStack(new AppStack(app, appStackProps), appStackProps.RecipeProps); + + app.Synth(); +} +``` + +### Configuration options + +The option settings that are defined in the [recipe file](recipe-file.md) are passed into the CDK project and then deserialized into the `Configuration` object. + +When you add new settings to the recipe file, you also need to add the `Id` of the new settings to the `Configuration` object. If you added an `Object` setting with a collection of child settings, first create a new type representing that entire `Object`. For reach child setting id, add a property on the new type. Finally, add a new property on `Configuration` for your new type with the property name being the id of the `Object` setting. + +The `Configuration` object follows the same `Generated` directory pattern described above. Custom settings should be added to the partial `Configuration.cs` file outside of the `Generated` directory. -The settings collected in the deploy tool are passed into the CDK project and then deserialized into the `Configuration` object. If you add new settings to the recipe file you will need to add the Id of the new settings to the `Configuration` object. If you added an `Object` setting with a collection of child settings then you need to create a new type with the child setting ids as properties on the new type. Then add a new property on the `Configuration` type for the new type with the property name being the id of the `Object` setting. -The `Configuration` object follows the same `Generated` directory pattern described above. Custom settings should be added to the partial `Configuration.cs` file outside of the `Generated` directory. \ No newline at end of file diff --git a/site/content/docs/deployment-projects/index.md b/site/content/docs/deployment-projects/index.md index 00cc347e4..838284c90 100644 --- a/site/content/docs/deployment-projects/index.md +++ b/site/content/docs/deployment-projects/index.md @@ -1,45 +1,48 @@ -# Custom Deployment Projects +# Deployment Projects -AWS Deploy Tool comes with multiple recipes that can deploy your .NET application to [several different AWS compute services](../support.md). These built-in recipes let you configure AWS resources related to your application such as IAM roles, virtual private clouds, and load balancers. +### What is a deployment recipe? -But what if your application uses additional AWS resources that are not included in the built-in recipes, such as DynamoDB tables or SQS queues? +The tool provides intelligent deployment recommendations that are tailored to your specific .NET application. The recommendation rules are defined in the `deployment recipes`. These recipes let you configure a pre-defined set of AWS resources related to your application such as IAM roles, virtual private clouds, load balancers, and other. -You can create a **custom deployment project** to expand one of the built-in recipes to manage additional AWS resources and services. +There is a built-in recipe for [each supported project type](../support.md). All recipe definitions are available [on GitHub](https://github.com/aws/aws-dotnet-deploy/tree/main/src/AWS.Deploy.Recipes/RecipeDefinitions). -Once you create a custom deployment project, the AWS Deploy Tool CLI and the AWS Toolkit for Visual Studio will display it alongside the built-in recipes and offer users the same deployment experience. +### What is a deployment project? -![Custom Deployment Project in AWS Toolkit for Visual Studio](../../assets/images/custom-deployment-project.png) -_The recommended publish target is a custom deployment project that manages a DynamoDB table in addition to the ASP.NET Core project._ +What if your application uses additional AWS resources that are not included in the built-in recipe, such as DynamoDB tables or SQS queues? In this case, you can extend one of the existing recipes and create a custom `deployment project` to manage additional AWS resources and services. -### Parts of a custom deployment project +Once you create and customize your deployment project, it will be displayed alongside the built-in recipes as a custom deployment option. -A custom deployment project is comprised of two parts. You can follow the getting start guide on this page or the [tutorial](./tutorial.md) to create these, then refer to the full reference guides below. +** Before:** _The recommended deployment target is a built-in recipe for ASP.NET Core applications._ -* [Recipe file](./recipe-file.md) - a JSON file that drives the user experience in both the deploy tool CLI and AWS Toolkit for Visual Studio. -* [.NET CDK project](./cdk-project.md) - a C# project that uses the [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/) to define the infrastructure that will be created for the deployment project. +![Before](../../assets/images/cliBefore.png) -### Getting started +** After:** _The recommended deployment target is a custom deployment project that manages a DynamoDB table in addition to the ASP.NET Core project._ -To create a custom deployment project, execute the following command in the directory of the .NET project you wish to deploy. +![After](../../assets/images/cliAfterBorder.png) - dotnet aws deployment-project generate --output --project-display-name +### Parts of a deployment project -The `--output` switch sets the directory where the deployment project will be saved. Use the `--project-display-name` switch to customize the name of the custom recipe that will be shown to users when the .NET project is being deployed. +A deployment project consists of two parts. For details, refer to the full reference guides below. -When you run the above command, the tool will display a list of built-in recipes that are compatible with your .NET project. Choose the built-in recipe that is closest to what you wish to deploy. This will be used as the starting point that you can then customize. +* [Recipe file](./recipe-file.md) - a JSON configuration file that drives the deployment experience. +* [.NET CDK project](./cdk-project.md) - a C# project that uses the [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/) to define the infrastructure that will be created. -Select the starting recipe and then a deployment project will be created in the location of the `--output` directory. Now you can begin customizing the deployment project. +### Creating a deployment project +To create a custom deployment project, run this command in the directory of the .NET project you wish to deploy. See [`deployment-project` command](../commands/project.md) for more details. -### Add to source control + dotnet aws deployment-project generate --output --project-display-name -It is important to add the custom deployment project to source control. Redeployments require the custom deployment project to be available to the deployment tooling. If a CloudFormation stack was created from a custom deployment project and that -deployment project has been deleted then you will not be able to redeploy to that CloudFormation stack. +The list of built-in recipes that are compatible with your .NET project will be displayed. Select the recipe that you will use to customize, and a deployment project will be created in the `--output` directory. + > Note: It is important to add your deployment projects to source control. If your deployment project has been deleted, you will not be able to re-deploy your application to the same CloudFormation stack. -### Searching for custom deployment projects +Now you can begin customizing the deployment project. See our [step-by-step tutorial](../../tutorials/custom-project.md) for a step-by-step instructions. -When the deploy command is initiated AWS Deploy Tool starts from the solution (.sln) of the .NET project being deployed and searches for custom deployment projects anywhere underneath the solution directory. The custom deployment projects are sent through the deployment tooling's recommendation engine to make sure they are compatible with the .NET project being deployed. +### Searching for deployment projects + +When you run the `dotnet aws deploy` command, the tool searches for deployment projects anywhere underneath the solution (.sln) directory of project you are deploying. It also ensures that each deployment project iscompatible with the .NET project being deployed. + +To point to a deployment project that is outside the solution directory, use the `--deployment-project` switch to pass in the path of the deployment project to use. This is common when sharing deployment projects across multiple solutions. -If the custom deployment project is outside of the solution directory use the `--deployment-project` switch for the `dotnet aws deploy` command to pass in the path of the custom deployment project to use. This is common when sharing custom deployment projects across multiple solutions. diff --git a/site/content/docs/deployment-projects/recipe-file.md b/site/content/docs/deployment-projects/recipe-file.md index e18ac50ad..0cdefc0e0 100644 --- a/site/content/docs/deployment-projects/recipe-file.md +++ b/site/content/docs/deployment-projects/recipe-file.md @@ -1,11 +1,8 @@ -# Deployment project recipe +# Recipe file schema -In the custom deployment project is a JSON file with a `.recipe` extension. This file provides all of the metadata that drives the experience through the AWS Deploy Tool CLI and the AWS Toolkit for Visual Studio. - -The recipe file defines the type of .NET projects the recipe is compatible with and the settings that will be shown to users. - -The full schema for the recipe file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json). +Each deployment project has a JSON file with a `.recipe` extension. This recipe file defines the type of .NET projects the recipe is compatible with and the settings that will be shown to users. +Read our [tutorial](../../tutorials/custom-project.md) to see how you can modify this file to drive the custom deployment experience and display custom option settings to the users. The full schema for the recipe file can be found [here](https://github.com/aws/aws-dotnet-deploy/blob/main/src/AWS.Deploy.Recipes/RecipeDefinitions/aws-deploy-recipe-schema.json). ### Top level settings @@ -95,7 +92,7 @@ Here is an example of a rule that checks the project is a web project and target "Condition": { "Value": "Microsoft.NET.Sdk.Web" } - }, + }, { "Type": "MSProperty", "Condition": { @@ -146,24 +143,24 @@ Here is another example that tests if a project contains a docker file. If it do ] ``` -A recipe is considered compatible if no rule ran an effect that set `Include` to false and if the priority is greater then 0. +A recipe is considered compatible if no rule ran an effect that set `Include` to false and if the priority is greater then 0. To simulate an **"or"** set of rules the starting priority in `RecipePriority` can be set to a negative value meaning it is not included by default. Then you can have a series of tests that adjust the priority to a positive amount. That way if any test rule passes it can adjust the priority to a positive number. ### Setting Categories -The `Categories` property is an array of objects that define the categories for the settings. The AWS Toolkit for Visual Studio uses this array to build the list of categories in the UI for fast navigation to a group of settings. +The `Categories` property is an array of objects that define the categories for the settings. The AWS Toolkit for Visual Studio uses this array to build the list of categories in the UI for fast navigation to a group of settings. ![Catagories in AWS Toolkit for Visual Studio](../../assets/images/vs-catagories.png) -A category is defined with the following properties: +A category is defined with the following properties: * **Id** - the unique id within the recipe for the category. * **DisplayName** - the name of the category displayed to users. * **Order** - the order in the toolkit for the category. Categories are display in sorted descending order. -Here is an example of defining a custom category that you could use to categorize additional settings added as application resources. +Here is an example of defining a custom category that you could use to categorize additional settings added as application resources. ``` { @@ -177,7 +174,7 @@ To assign a setting to a category, set the setting's `Category` property of to t ### Option Settings -The settings that are shown to users and allows users to customize the deployment in either the CLI or Visual Studio are defined in the `OptionSettings` array. Settings have the following properties. +The settings that are shown to users and allows users to customize the deployment in either the CLI or Visual Studio are defined in the `OptionSettings` array. Settings have the following properties. * **Id** - the id of the setting. Once projects are deployed with the recipe, this id should not change because the id is saved into the CloudFormation stack's template. * **Name** - the name of the setting shown to users. @@ -296,7 +293,7 @@ Here is an example for a setting used for storing an existing IAM role to use. T "Value": false } ], - + ... } ``` diff --git a/site/content/faq.md b/site/content/faq.md index 9d20270b2..042c389d5 100644 --- a/site/content/faq.md +++ b/site/content/faq.md @@ -20,3 +20,9 @@ The AWS Deploy Tool will show you all compute service options available to depl #### *FAQ: I have an application that has dependency on Windows technology, Can I use the AWS Deploy Tool to deploy it to AWS?* ASP.NET Core applications can be deployed to AWS Elastic Beanstalk picking the "ASP.NET Core App to AWS Elastic Beanstalk on Windows" recommendation. The deployment experience is very similar the "ASP.NET Core App to AWS Elastic Beanstalk on Linux" recommendation with additional settings for configuring the Internet Information Services (IIS) resource path and web site. + +#### *FAQ: Can I deploy my application from Visual Studio?* +Yes, you can deploy your application using the "Publish to AWS" feature in the AWS Toolkit for Visual Studio. This feature exposes the same functionality as the AWS Deploy Tool for .NET CLI. To learn more, go to [Publish to AWS](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/publish-experience.html) in the AWS Toolkit for Visual Studio User Guide. + +#### *FAQ: Can I invoke AWS Deploy Tool from my CI/CD pipeline?* +Yes, you can. To learn more, go to [Integrating with CI/CD](docs/cicd.md) diff --git a/site/content/index.md b/site/content/index.md index 45791c707..135ae235a 100644 --- a/site/content/index.md +++ b/site/content/index.md @@ -1,26 +1,26 @@ -# About the AWS Deploy Tool +# About the AWS Deploy Tool for .NET -** AWS Deploy Tool** is an interactive tooling for the .NET CLI and the AWS Toolkit for Visual Studio that helps deploy .NET applications with minimum AWS knowledge, and with the fewest clicks or commands. It works by analyzing .NET projects and guiding developers to the right AWS service. It then selects the right deployment service, builds and packages your application, and creates the deployment infrastructure. It allows for a quick and easy Proof of concept (POC), smooth graduation to CI/CD, and a gradual ramp up on AWS knowledge. +** AWS Deploy Tool for .NET** is an interactive tooling for the .NET CLI and the AWS Toolkit for Visual Studio that helps deploy .NET applications with minimum AWS knowledge, and with the fewest clicks or commands. -## Key capabilities +### Key capabilities AWS Deploy Tool has the following capabilities: * **Compute recommendations for your application** – Get recommendations about the type of compute best suited for your application based on the application type. * **Dockerfile generation** - The tool will generate a Dockerfile if needed, otherwise an existing Dockerfile will be used. * **Auto packaging and deployment** – The tool builds the deployment artifacts, generates a deployment CDK project, provisions the infrastructure and deploys your application to the chosen AWS compute. -* **Repeatable and shareable deployments** –The tool persists configuration settings and AWS Cloud Development Kit (CDK) project used to deploy your application. You can also version control them and share with other team members for repeatable deployments. -* **Help with learning AWS CDK for .NET!** - Once you are ready to start exploring, the deployment tool will help you gradually learn AWS tools like CDK that are used under the hood. It generates well documented/organized CDK projects that you can easily start modifying to fit your specific use-case. +* **Repeatable and shareable deployments** – You can generate and modify AWS Cloud Development Kit (CDK) deployment projects to fit your specific use case. You can also version control your projects and share them with your team for repeatable deployments. +* **Help with learning AWS CDK for .NET!** - Gradually learn the underlying AWS tools that AWS Deploy Tool for .NET is built on, such as the AWS CDK. -## Availability -### ... in .NET CLI +### Availability +####... in .NET CLI -AWS Deploy tool is available for download as a NuGet package. See [How to install](docs/getting-started/installation.md) section. +AWS Deploy Tool for .NET is available for download as a NuGet package. See [How to install](docs/getting-started/installation.md) section. -### ... in AWS Toolkit for Visual Studio +#### ... in AWS Toolkit for Visual Studio The AWS Toolkit for Visual Studio exposes the same deployment functionality via **Publish to AWS** feature. For information about toolkit versions and using the feature, see [Publish to AWS](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/publish-experience.html) in the [AWS Toolkit for Visual Studio User Guide](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/). -## Additional Resources +### Additional Resources * The [aws-dotnet-deploy](https://github.com/aws/aws-dotnet-deploy) GitHub repo. * Blog Post: [Reimagining the AWS .NET deployment experience](http://aws.amazon.com/blogs/developer/reimagining-the-aws-net-deployment-experience/). diff --git a/site/content/docs/deployment-projects/tutorial.md b/site/content/tutorials/custom-project.md similarity index 56% rename from site/content/docs/deployment-projects/tutorial.md rename to site/content/tutorials/custom-project.md index 60645cf6e..b9a889c7c 100644 --- a/site/content/docs/deployment-projects/tutorial.md +++ b/site/content/tutorials/custom-project.md @@ -1,36 +1,72 @@ -# Custom deployment project tutorial +# Adding DynamoDB table to your deployment project -For this tutorial we going to create a custom deployment project to deploy our Acme.WebApp project. This web application uses an AWS DynamoDB table as the backend store. We want to create a custom deployment project that the team can use to deploy the application to Amazon Elastic Container Service (ECS) along with the application's DynamoDB table. +In this tutorial, we will create and customize a deployment project to deploy a web application that uses AWS DynamoDB table as the backend store to Amazon Elastic Container Service (ECS). We will then add the deployment project to the source control and share with the team for future deployments. -***Note: For this tutorial we are not concerned with the logic of the application being deployed. To follow along with this tutorial you can replace Acme.WebApp with any "hello world" web application.*** +Tasks we will accomplish: +1. Create a new web application called Acme.WebApp +2. Generate a deployment project using a built-in recipe. +3. Customize the deployment project's recipe file to allow the user to configure DynamoDB table. +4. Modify the CDK project to add the new DynamoDB setting options. +5. Modify the CDK project to create the DynamoDB table. +6. Pass the DynamoDB table name to the application code using the environment variable so that our application can read to know which table to use. +7. Add the deployment project to source control. +8. Deploy our Acme.WebApp application using custom deployment project. -Tasks we will accomplish: + > **Note:** This tutorial is not concerned with the application logic. You can replace the sample Acme.WebApp used in this tutorial with any other web application.*** -* Create a custom deployment project -* Modify the custom deployment project's recipe file to allow the user to configure what DynamoDB table to use. -* Customize the deployment project's CDK project to create the DynamoDB table and set an environment variable that our application can read to know which table to use. +### Step 1: Create a new web application -### Creating the custom deployment project +In your command prompt, run the following command to create your app: -To create the custom deployment project, navigate to the Acme.WebApp project directory and run the following command. + dotnet new webapp -o Acme.WebApp -f net6.0 - dotnet aws deployment-project generate --output ../Acme.WebApp.DeploymentProject --project-display-name "ASP.NET Core app with DynamoDB" +### Step 2: Generate a deployment project -The AWS Deploy Tool will analyze the Acme.WebApp project and display which built-in recipes can be used as the starting point of the custom deployment project. Since we want to deploy to ECS, pick the option that says "ASP.NET Core App to Amazon ECS using AWS Fargate". +Navigate to the Acme.WebApp project directory and run the following command to generate a deployment project: -Once the starting recipe is picked, `Acme.WebApp.DeploymentProject` is created in a sibling project to the application project. If you are using Visual Studio you might want to add the new `Acme.WebApp.DeploymentProject` project to your solution. + dotnet aws deployment-project generate --output ../Acme.WebApp.DeploymentProject --project-display-name "ASP.NET Core app with DynamoDB" The `--project-display-name` switch above configures the name of the recommendation that is shown in the deploy tool when deploying the application project. +The AWS Deploy Tool will analyze the Acme.WebApp project and display which built-in recipes can be used as the starting point of the custom deployment project. -### Adding DynamoDB settings to the recipe +``` +Recommended Deployment Option +----------------------------- +1: ASP.NET Core App to AWS Elastic Beanstalk on Linux +This ASP.NET Core application will be built and deployed to AWS Elastic Beanstalk on Linux. Recommended if you do not want to deploy your application as a container image. -We want to give our team members who will use the custom deployment project the choice to either select an existing DynamoDB table or create a new table during deployment. To do that we need to add a few new settings to our deployment project's recipe definition. +Additional Deployment Options +------------------------------ +2: ASP.NET Core App to Amazon ECS using Fargate +This ASP.NET Core application will be deployed to Amazon Elastic Container Service (Amazon ECS) with compute power managed by AWS Fargate compute engine. If your project does not contain a Dockerfile, it will be automatically generated. Recommended if you want to deploy your application as a container image on Linux. -In the directory containing the deployment project open the `Acme.WebApp.DeploymentProject.recipe` file in your JSON editor of choice. Find the `OptionSettings` section that contains the settings users can use to configure their project. +3: ASP.NET Core App to AWS App Runner +This ASP.NET Core application will be built as a container image and deployed to AWS App Runner. If your project does not contain a Dockerfile, it will be automatically generated. Recommended if you want to deploy your application as a container image on a fully managed environment. -To get started we are going to create a new "Object" setting called `Backend` to group all of our new settings. The snippet below shows the object-level setting. The options we are about to create will be displayed to the users in the "General" category when configuring their deployment. +4: ASP.NET Core App to Existing AWS Elastic Beanstalk Environment +This ASP.NET Core application will be built and deployed to existing AWS Elastic Beanstalk environment. Recommended if you do not want to deploy your application as a container image. + +Choose deployment option (recommended default: 1) +``` + +Pick the option #2 that says "ASP.NET Core App to Amazon ECS using AWS Fargate". + +`Acme.WebApp.DeploymentProject` is created in a sibling directory to the application project. If you are using Visual Studio, add the new `Acme.WebApp.DeploymentProject` project to your solution. + +![Deployment Project](../assets/images/solutionWithCDKProject.png) + + +### Step 3: Add DynamoDB settings to the recipe file + +To give the team members, who will use our deployment project, the choice to either select an existing DynamoDB table or create a new table during deployment, we will add several new settings to our deployment project's recipe definition. + +Open the `Acme.WebApp.DeploymentProject.recipe` file located in the deployment project directory in your JSON editor of choice. + +Go to the `OptionSettings` section that contains the settings users can use to configure their project. + +Create a new "Object" option setting called `Backend` to group all of our new settings using the snippet below. When users configure their deployment, this option will be displayed in the "General" category. ``` "OptionSettings": [ @@ -55,7 +91,9 @@ To get started we are going to create a new "Object" setting called `Backend` to } ``` -Now we are going to create our child settings. The first is a setting to determine if we should create a new table or not. This setting is a `Bool` type which is defaulted to `true`. As a best practice the `Updatable` setting is set to `false` to protect users from accidentally deleting the table when redeploying in the future. +Now we will create child option settings to configure DynamoDB settings. The first is a setting to determine if we should create a new table or not. This setting is a `Bool` type which is defaulted to `true`. As a best practice the `Updatable` setting is set to `false` to protect users from accidentally deleting the table when redeploying in the future. + +Add the following snippet to the `ChildOptionSettings` of the new `Backend` option we just greated: ``` "ChildOptionSettings": [ @@ -75,8 +113,10 @@ Now we are going to create our child settings. The first is a setting to determi ``` -If the user unchecks the `CreateNewTable` setting we need to give them the choice to select an existing table. This `ExistingTableName` setting is a "String" type that will store the name of an existing DynamoDB table to use as the backend store. +If the user unchecks the `CreateNewTable` setting, we need to give them the choice to select an existing table. This `ExistingTableName` setting is a "String" type that will store the name of an existing DynamoDB table to use as the backend store. + +Add the following snippet to the `ChildOptionSettings` of the new `Backend` option: ``` "ChildOptionSettings": [ @@ -124,7 +164,7 @@ Let us take a deeper dive into the properties for the `ExistingTableName` settin * **DependsOn** - This setting will only be visible if the previous `CreateNewTable` setting is set to `false`. Notice how the `Id` is the full name of the setting including the parent "Object" setting `Backend`. * **Validators** - This attaches validators to make sure that the user-provided name matches the regex for valid table names and that the name meets the required minimum and maximum lengths. Adding validators provides feedback to users when invalid values are provided in either the CLI or Visual Studio. -Here is the full snippet of the `Backend` Object setting with the child settings. +Here is the full snippet of the `Backend` Object option setting with the child settings: ``` { "Id": "Backend", @@ -180,17 +220,14 @@ Here is the full snippet of the `Backend` Object setting with the child settings } ``` -### Customizing the deployment project's CDK project - -Now that users can customize the backend settings when deploying, the CDK project for the custom deployment project needs to be updated to react to the new settings. +### Step 4. Add new setting options to the CDK project -***Note: The .NET CDK projects generated by the deploy tool have the C# feature `Nullable` enabled in the project file. If you do not want this feature enabled edit the csproj file and remove the `Nullable` project from the PropertyGroup.*** +When CDK project is executed, all settings collected from the user are passed and deserialized into the `Configuration` type. Now we need to customize the CDK project to store the new setting options by modifying the `Configuration` type. -#### Deserializing settings +Create a new class called `BackendConfiguration` in the `Configurations` directory. Below is the code for this new type with the properties for `CreateNewTable` and `ExistingTableName`. -When AWS Deploy Tool executes the CDK project it passes all of the settings collected from the user and deserializes them into the `Configuration` type in the CDK project. We need to modify the `Configuration` type to store the new backend settings. + > **Note:** The .NET CDK projects generated by the AWS Deploy Tool have the C# feature `Nullable` enabled in the project file by default. If you do not want this feature enabled, edit the .csproj file and remove the `Nullable` project from the PropertyGroup.*** -Create a new class called `BackendConfiguration` in the `Configurations` directory. Below is the code for this new type with the properties for `CreateNewTable` and `ExistingTableName`. ``` namespace Acme.WebApp.DeploymentProject.Configurations @@ -224,7 +261,7 @@ namespace Acme.WebApp.DeploymentProject.Configurations } ``` -In the `Configuration.cs` file add a new property for our new backend settings. +In the `Configuration.cs` file, add a new property for our new backend settings. ``` namespace Acme.WebApp.DeploymentProject.Configurations @@ -236,11 +273,13 @@ namespace Acme.WebApp.DeploymentProject.Configurations } ``` -Notice that the `Backend` property was added to the partial class that is **not** in the `Generated` directory. In both the `Configuration` and `BackendConfiguration` types the property names match the setting ids used in the recipe file. This is important for the data to be property deserialized. +Notice that the `Backend` property was added to the partial class that is **not** in the `Generated` directory. In both the `Configuration` and `BackendConfiguration` types, the property names match the setting ids used in the recipe file. This is important for the data to be property deserialized. + +### Step 5. Add DynamoDB table to the CDK project -#### CDK Changes + > **Note:** The `AppStack` class is the recommended place to customize the AWS resources. -The `AppStack` class is the recommended place to customize the AWS resources created by the CDK. We will modify the constructor of this class to check if `CreateNewTable` is set to true. If it is we will use the CDK construct to create a table as part of the CloudFormation stack. +Modify the constructor of the `AppStack` class to check if `CreateNewTable` is set to true. Then use the `Amazon.CDK.AWS.DynamoDB` CDK construct to create a table as part of the CloudFormation stack. ``` using Amazon.CDK.AWS.DynamoDB; @@ -276,13 +315,13 @@ namespace Acme.WebApp.DeploymentProject } ``` -In the snippet above the table is created before `Recipe` construct. The `Recipe` construct has all of the AWS resources that are part of the original, built-in ECS recipe that the custom deployment project was created from. +Notice that in the snippet above the table is created before the] `Recipe` construct. The `Recipe` construct has all AWS resources that are part of the original built-in ECS recipe that the deployment project was created from. -Now that we have our table we need to pass the table name into our application code. We are going to do this by setting an environment variable that the application code will read. +### Step 6: Pass the DynamoDB table name to the application code -The `CustomizeCDKProps` method in `AppStack` is a callback method that gets called for each AWS resource about to be created from the `Recipe` construct. Here is where we can set the environment variable. +Now that we have our DynamoDB table, we need to pass the table name into our application code. We will do it by setting an environment variable that the application code will read in the `CustomizeCDKProps` of the `AppStack` class. `CustomizeCDKProps` is a callback method that gets called for each AWS resource about to be created from the `Recipe` construct. -To know which AWS resource is about to be created, compare the `evnt.ResourceLogicalName` property to the public property name on the `Recipe` construct. The built-in recipes are written to make sure the resource logical name is the same as the public property name. In our scenario we are looking to see if the `AppContainerDefinition` is about to be created. +To know which AWS resource is about to be created, compare the `evnt.ResourceLogicalName` property to the public property name on the `Recipe` construct. The built-in recipes are written to make sure the resource logical name is the same as the public property name. In our scenario we are looking to see if the `AppContainerDefinition` is about to be created. When we determine that the callback is for `AppContainerDefinition` then we cast the `evnt.Props` to the corresponding property object for `AppContainerDefinition`, in this case `ContainerDefinitionOptions`. From `ContainerDefinitionOptions` we can set the table name in an environment variable. @@ -290,7 +329,7 @@ When we determine that the callback is for `AppContainerDefinition` then we cast private void CustomizeCDKProps(CustomizePropsEventArgs evnt) { // Example of how to customize the container image definition to include environment variables to the running applications. - // + // if (string.Equals(evnt.ResourceLogicalName, nameof(evnt.Construct.AppContainerDefinition))) { if (evnt.Props is ContainerDefinitionOptions props) @@ -312,9 +351,17 @@ private void CustomizeCDKProps(CustomizePropsEventArgs evnt) } ``` -### Using the deployment project +### Step 6: Add deployment project to the source control + +Check your customized deployment project in to your source control. This is required to re-deploy your application to existing CloudFormation stacks that were created using custom deployment projects. + +### Step 7: Deploy Acme.WebApp application -Custom deployment projects are used through the same deployment workflow as the built-in recipes. For the CLI deploy tool, execute the `dotnet aws deploy` command in the application project directory. The custom deployment project will be displayed as the recommended option. +In your command prompt, run the following command to deploy your application: + + dotnet aws deploy --project-path . + +The custom deployment project will be displayed as the recommended option. ``` Recommended Deployment Option @@ -331,7 +378,7 @@ This ASP.NET Core application will be deployed to Amazon Elastic Container Servi ``` -The settings for the recommendation shows the Backend settings we customized. If we navigate to the backend settings the deploy tool will allow the user to choose between using a new table or picking an existing table. +Select deployment option #1. You can now see Backend settings option we customized. When you navigate to the `Backend` settings, you will be able to choose between using a new table or picking an existing table. ``` ... @@ -352,6 +399,4 @@ Current settings (select number to change its value) ``` -The AWS Toolkit for Visual Studio will also recognize the custom deployment project. The deployment project will show up as the highest recommended option and the user will also be able to choose between creating a new table or choosing from a drop-down list of available tables in the account that is being deployed to. - -The custom deployment project should be checked in to your source control. The deployment project is required for redeployments to existing CloudFormation stacks that were created from the custom deployment project. \ No newline at end of file + > **Note:** The AWS Toolkit for Visual Studio will also recognize the custom deployment project. The deployment project will show up as the highest recommended option and the user will also be able to choose between creating a new table or choosing from a drop-down list of available tables in the account that is being deployed to.

    dq6VvOsXz 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%0D&!;vfzvZAFP%kgSr>e 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 DgKagK literal 0 HcmV?d00001 diff --git a/site/content/assets/images/solutionWithCDKProject.png b/site/content/assets/images/solutionWithCDKProject.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8626f2d180683da6e13f01d2860fc25a53e627 GIT binary patch literal 39523 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