BLOG

새로운 AWS .NET 배포 환경을 사용한 배포 프로젝트
작성일: 2021-11-12

새로운 배포 도구의 주요 목표는 사용자가 모르는 사이에 뜻하지 않는 일이 일어나지 않도록 하는 것입니다. 우리는 경험이 가능한 한 단순하기를 원하면서 동시에 사용자가 원할 때에는 무슨 일이 일어나고 있는지 쉽게 확인할 수 있기를 바라죠. 이를 통해 사용자는 정확한 요구 사항에 맞게 사용자를 지정하여 배포할 수도 있습니다.

 

또한, 배포 프로젝트를 사용하면 Amazon SQS 대기열, Amazon DynamoDB 테이블 등과 같은 AWS 리소스를 배포의 일부로 추가할 수 있으며, 배포에 대한 회사의 요구 사항을 추가하고 다른 팀과 프로젝트를 공유할 수도 있습니다.

 

 

배포 프로젝트란?

 

 

배포 도구에는 우리가 레시피 라고 부르는 컬렉션이 포함되어 있습니다. 이 도구는 레시피를 주어진 .NET 프로젝트에 대한 권장 사항으로 바꾸고, 레시피에는 도구가 경험을 주도하는 데 사용하는 모든 메타데이터가 포함된 JSON 파일이 포함되어 있습니다. 여기에는 레시피가 프로젝트와 호환되는지 확인하기 위해 추천 엔진에서 사용되는 규칙이 포함됩니다. 또한 배포 도구 CLI 및 결국 Visual Studio에서 사용자가 환경을 사용자 지정할 수 있도록 하는 모든 설정이 있습니다.

 

메타데이터 파일 외에도 레시피에는 AWS CDK(클라우드 개발 키트) 를 사용하는 .NET 프로젝트 템플릿이 포함되어 있습니다. 프로젝트는 사용자로부터 수집된 설정을 가져오고 CDK를 사용하여 배포를 수행합니다. 리소스를 추가로 사용자 지정하지 않으려는 간단한 배포의 경우 CDK 프로젝트를 무시해도 됩니다.

 

배포 프로젝트는 다음 단계로 나아가 추가 리소스 또는 사용자 지정 요구 사항을 추가할 수 있는 곳입니다. 도구는 프로젝트를 검사하고 작업 공간에 배포 프로젝트를 생성합니다. 이 배포 프로젝트에는 레시피의 JSON 정의 파일과 관련 .NET CDK 프로젝트가 포함됩니다. 이 프로젝트를 사용자 정의하거나 그대로 둘 수 있습니다. 배포하려는 경우 AWS에서 제공하는 레시피 중 하나를 선택하는 대신 사용자 지정 배포 프로젝트를 선택할 수 있습니다.

 

 

배포 프로젝트 만들기

 

배포 프로젝트가 어떻게 도움이 될 수 있는지 보여주기 위해 데이터 저장소에 Amazon DynamoDB 테이블을 사용하는 웹 애플리케이션이 있습니다. AWS의 기본 제공 레시피를 사용하는 일반 배포는 인프라 리소스 생성을 처리하지만, 여기에서는 배포 중에 DynamoDB 테이블도 생성되기를 원합니다. 

 

애플리케이션에 대한 배포 프로젝트를 생성하기 위해 웹 애플리케이션의 프로젝트 디렉터리에서 다음 명령을 실행합니다.

 

Bash

 

dotnet aws deployment-project generate

 

이 명령은 프로젝트와 호환되는 권장 사항 목록을 표시합니다. 이는 배포할 때 표시되는 것과 매우 유사하지만 이제 옵션을 선택하면 명령이 대신 배포 프로젝트를 생성합니다.

 

 

애플리케이션에 Amazon Elastic Container Service(ECS) 를 사용하려면 권장 옵션을 그대로 유지하고 옵션 1을 선택해야 합니다. 기본적으로 배포 프로젝트는 .Deployment 접미사가 있는 프로젝트 디렉터리의 형제 디렉터리에 생성 됩니다. 배포 프로젝트를 다른 위치에 생성하려면–output 스위치를 사용할 수 있습니다.

 

이제 배포 프로젝트 dotnet aws deploy가 있으므로 프로젝트 디렉터리에서 실행하여 배포를 시작할 때 권장되는 배포 옵션은 새 배포 프로젝트입니다. 원래 권장 옵션인 Fargate 사용하는 Amazon ECS 대한 ASP.NET Core  이 이제 추가 옵션에 나열됩니다.

 

 

–project-display-name프로젝트를 생성할 때 스위치를 사용하여 여기에 표시되는 이름을 사용자 지정할 수 있습니다. 나중에 보여드릴 배포 프로젝트에서 이름을 편집할 수도 있습니다. DynamoDB 테이블을 추가하기 위해 배포하기 전에 배포 프로젝트를 사용자 지정하려고 하므로 Ctrl+C를 사용하여 배포하지 않고 도구를 종료합니다.

 

 

배포 프로젝트 검토

 

솔루션에 추가한 .NET 프로젝트인 배포 프로젝트를 살펴보겠습니다. CDK 구성 유형이 포함된 NuGet 패키지를 사용하여 내 애플리케이션에 필요한 AWS 인프라를 정의하는 표준 C# 콘솔 프로젝트입니다.

 

 

배포 프로젝트로 작업할 때 앞으로 프로젝트를 유지 관리하는 책임이 있으며 필요에 따라 변경할 수 있습니다. 배포 도구에서 제공하는 대부분의 의미 있는 코드는 생성된 폴더에 있습니다. 거기에 있는 파일을 직접 편집하지 않고 대신 참조용으로 사용하는 것이 좋습니다. 그런 다음 배포 프로젝트가 생성된 원본 레시피에서 업데이트를 가져오려면 생성된 폴더에 코드를 복사하면 됩니다.

 

AppStack 클래스는 새로운 AWS 리소스를 추가하거나 생성된 코드에서 생성된 자원을 사용자 정의할 수 있는 추천 장소입니다. 또한, 배포 프로젝트에서 레시피 정의 파일을 찾을 수 있습니다. .recipe 확장자가 있는 파일입니다 . 앞서 언급했듯이 레시피 파일에는 배포 도구가 프로젝트 호환성을 평가하는데 사용하는 메타데이터와 도구에서 구성할 수 있는 설정이 포함되어 있습니다.

 

 

 

DynamoDB 테이블 추가

 

 

배포 프로젝트에 테이블을 추가하기 전에 AppStack 클래스의 생성자를 살펴보겠습니다. 이 생성자에서는 3가지 중요한 일이 발생합니다.

 

  1. _configuration필드가 설정됩니다. 여기에는 CLI 및 Visual Studio에서 배포를 구성하는 동안 사용자가 만든 모든 설정이 포함됩니다.
  2. CustomizeCDKProps이벤트에 콜백이 추가됩니다. 이 콜백을 사용하면 원래 레시피에서 생성된 AWS 리소스를 사용자 지정할 수 있습니다.
  3. 애플리케이션 배포를 위한 모든 AWS 리소스를 포함하는 원래 레시피의 구성이 생성됩니다.

 

C#

 internal AppStack(Construct scope, IDeployToolStackProps<Configuration> 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<Recipe>.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.}

 

 

 

배포 프로젝트에 DynamoDB 테이블 추가를 시작하려면 먼저 Amazon.CDK.AWS.DynamoDBNuGet 패키지를 추가해야 합니다. CDK NuGet 패키지로 작업할 때 모든 NuGet 패키지의 버전 번호를 동일하게 유지하는 것이 중요합니다. 따라서 패키지를 추가하기 전에 프로젝트의 csproj 파일을 확인하여 다른 CDK 패키지에 대해 참조되는 버전 번호를 확인하십시오. 최신 CDK 버전에 대한 모든 참조를 업데이트하도록 선택할 수도 있습니다.

 

*참고: 간소화된 패키지 관리가 포함된 CDK V2는 현재 개발 중입니다.

 

프로젝트에 포함된 패키지로 CDK 코드를 추가하여 테이블을 생성할 수 있습니다. 원본 레시피의 일부로 생성된 리소스에 대한 참조가 필요한 리소스를 추가할 때 new Recipe(..)라인 뒤에 코드를 추가하세요. 원래 레시피로 생성된 리소스는 generatedRecipe개체의 공용 속성으로 액세스할 수 있습니다. 내 테이블은 원래 레시피에 의해 생성된 리소스에 의존하지 않기 때문에 new Recipe(..)를 호출하기 전에 코드를 추가하겠습니다.

 

C#

 private Table? _backendDataStore; internal AppStack(Construct scope, IDeployToolStackProps<Configuration> props)    : base(scope, props.StackName, props){    _configuration = props.RecipeProps.Settings;    CDKRecipeCustomizer<Recipe>.CustomizeCDKProps += CustomizeCDKProps;     var backendDataStoreProps = new TableProps    {        RemovalPolicy = RemovalPolicy.RETAIN,        PartitionKey = new Amazon.CDK.AWS.DynamoDB.Attribute        {            Name = “Id“,            Type = AttributeType.STRING        },        BillingMode = BillingMode.PAY_PER_REQUEST,    };    _backendDataStore = new Table(this, “BackendDataStore”, backendDataStoreProps);     _backendDataStore.AddGlobalSecondaryIndex(new GlobalSecondaryIndexProps    {        IndexName = “Name“,        PartitionKey = new Amazon.CDK.AWS.DynamoDB.Attribute        {            Name = “Name”,            Type = AttributeType.STRING        },        ProjectionType = ProjectionType.ALL    });     var generatedRecipe = new Recipe(this, props.RecipeProps);}

 

 

이제 이 배포 프로젝트로 응용 프로그램을 배포할 때 배포의 일부로 테이블이 생성됩니다.

 

 

레시피 리소스 사용자 지정

 

 

이전 섹션에서 배포에 새 DynamoDB 테이블을 추가하는 방법을 살펴보았습니다. 이제 테이블이 있으므로 배포된 애플리케이션에 사용할 테이블을 알려야 합니다. 여기에서 CustomizeCDKProps 콜백 메서드가 작동합니다.

 

CDK 구성이 생성 props되면 DynamoDB 테이블에 대해 위에서 본 것처럼 구성에 대한 모든 설정이 포함된 객체를 허용합니다. Recipe배포 프로젝트의 클래스는 많은 props 개체와 구성을 만듭니다. props 객체가 완전히 생성되면 구성이 생성되기 전에 CustomizeCDKProps 콜백이 호출됩니다. 이를 통해 사용자 정의를 통해 구성이 생성되기 전에 해당 구성의 속성을 변경할 수 있습니다.

 

콜백 이벤트에는 CDK 코드 내에서 사용되는 리소스의 논리적 이름이 포함됩니다. 사용자 지정하려는 리소스인지 확인하기 위해 이름을 검사합니다. 레시피를 작성할 때 사용하는 패턴은 리소스의 논리적 이름을 레시피 구성의 공용 속성과 동일하게 만드는 것입니다. 따라서 nameof 연산자를 사용하여 비교를 수행할 수 있습니다.

 

이 예에서는 환경 변수를 내 테이블 이름으로 설정하기 위해 애플리케이션 컨테이너 정의 생성을 사용자 정의하려고 합니다.

 

C#

 private void CustomizeCDKProps(CustomizePropsEventArgs<Recipe> evnt){    if (string.Equals(evnt.ResourceLogicalName, nameof(evnt.Construct.AppContainerDefinition)))    {        if (evnt.Props is ContainerDefinitionOptions props && _backendDataStore != null)        {            Console.WriteLine(“Customizing AppContainerDefinition”);            if (props.Environment == null)                props.Environment = new Dictionary<string, string>();             props.Environment[“AwsAppResources__BackendTable”] = _backendDataStore.TableName;        }    }}

 

 

* 참고: 제가 사용하는  double underscores를  appsettings.Development.json에 사용되는 중첩 json으로 일치하도록 환경 이름을 설정하였습니다. *

 

 

레시피 정의 사용자 정의

 

배포 프로젝트를 사용하면 배포 도구 CLI 및 곧 Visual Studio 내에서 프로젝트 사용 환경을 사용자 지정할 수도 있습니다. 이는 배포 프로젝트에서 레시피 정의 파일을 편집하여 수행됩니다.

레시피 정의를 사용자 지정하는 것은 팀 구성원 및 다른 팀 간에 배포 프로젝트를 공유할 때 정말 유용합니다. 이렇게 하면 다른 사람들이 프로젝트를 사용할 수 있지만 특정 환경에 맞게 쉽게 사용자 지정할 수 있습니다.

 

 

이름 및 설명 사용자 지정

 

배포 프로젝트에 더 의미 있는 이름과 설명을 지정하는 것부터 시작하겠습니다. 파일의 시작 부분에있는 Name, Description및 ShortDescription필드. 도구는 이것을 사용하여 레시피를 표시합니다.

 

JSON

{  “Id”: “c3835c75-41b6-455c-b77d-8a0c80585a01”,  “Version”: “1.0.0”,  “Name”: “Demo Application with DynamoDB Backend”,  “Description”: “This application will be deployed to ECS with its DynamoDB table backend.”,  “ShortDescription”: “This application will be deployed to ECS with its DynamoDB table backend.”,…

 

이제 dotnet aws deploy를 실행하면 인터페이스에 사용자 정의된 이름과 설명이 표시됩니다.

 

 

 

 

설정 사용자 정의

 

 

배포 프로젝트를 사용하면 이름과 설명을 변경할 수 있을 뿐만 아니라 인터페이스 변경도 가능합니다. 배포 중에 사용자에게 표시될 새 설정을 추가할 수도 있습니다. 예를 들어 DynamoDB 테이블을 CDK 프로젝트에 추가할 때 RemovalPolicyRemovalPolicy.RETAIN로 설정했습니다. 이렇게 하면 배포를 삭제해도 테이블에 추가된 모든 데이터가 유지됩니다. 이는 보다 생산적인 배포를 위한 좋은 방법입니다. 그러나 개발을 위해, 데이터에 신경 쓰지 않고 배포를 삭제할 때는 테이블을 삭제하기를 원합니다.

 

레시피 정의 파일은 OptionSettings섹션의 설정 배열을 포함합니다.  RetainTable. 라는 새 설정을 추가하겠습니다. 설정 항목에는 다음과 같은 속성이 있습니다.

 

  • Id – 설정의 고유 ID
  • 이름 – 애플리케이션을 배포할 때 사용자에게 표시되는 이름
  • 설명 – 애플리케이션을 배포할 때 사용자에게 제공되는 설명
  • 유형 – 설정의 데이터 유형 (이 경우 Bool)
  • DefaultValue – 새 배포의 기본값
  • AdvancedSetting – 기본적으로 설정을 사용자에게 표시할지 여부를 제어
  • 업데이트 가능 – 재배포 중에 설정을 업데이트할 수 있는지 여부를 제어

 

JSON

 “OptionSettings”: […    {        “Id”: “RetainTable”,        “Name”: “Retain Backend Table”,        “Description”: “If true the DynamoDB backend table will be preserved when the deployment is deleted.”,        “Type”: “Bool”,        “DefaultValue”: true,        “AdvancedSetting”: false,        “Updatable”: true    },…]

 

이제 설정을 추가했으므로 이를 적용할 CDK 코드가 필요합니다. 가장 먼저 해야 할 일은 CDK 프로젝트에서 설정을 모델링하는 것입니다. .NET의 구성 프레임워크를 사용하면 배포 도구에서 수집된 모든 설정이 CDK 프로젝트 내의 Configuration 클래스로 역직렬화됩니다. 구성 클래스는 레시피의 원래 설정을 사용자 정의의 일부로 추가된 설정과 분리하는 부분 클래스로 정의됩니다.

 

Configuration 폴더의 Configuration.cs 파일에서 레시피 정의 파일에서 사용한 것과 동일한 ID를 사용하여 새 속성을 추가합니다.

 

C#

public partial class Configuration{    public bool RetainTable { get; set; } = true;}

 

DynamoDB의 테이블이 작성되는 코드로 돌아가서 RemovalPolicy를 결정하는 configuration.RetainTable 속성을 확인할 수 있습니다. 

 

C#

var backendDataStoreProps = new TableProps{    RemovalPolicy = _configuration.RetainTable ? RemovalPolicy.RETAIN : RemovalPolicy.DESTROY,     PartitionKey = new Amazon.CDK.AWS.DynamoDB.Attribute    {        Name = “Id”,        Type = AttributeType.STRING    },    BillingMode = BillingMode.PAY_PER_REQUEST,};_backendDataStore = new Table(this, “BackendDataStore”, backendDataStoreProps);

 

이제 사용자에게 표시할 새 설정을 정의하고 해당 설정을 사용하여 AWS 리소스를 생성하는 방법의 논리를 제어합니다. 우리 팀의 누군가가 배포 프로젝트를 실행하면 RemovalPolicy 식별할 수 있게 됩니다.

 

 

 

 

배포 프로젝트 공유

 

 

배포 프로젝트의 의도는 소스 제어에 체크인하고 나머지 팀과 공유하는 것입니다. 배포하려는 여러 애플리케이션에 배포 프로젝트를 재사용할 수도 있습니다. 기본적으로 dotnet aws deploy명령을 호출하면 도구가 솔루션 파일이 있는 디렉터리 또는 Git 리포지토리의 루트에서 모든 배포 프로젝트를 찾습니다. 사용하려는 배포 프로젝트가 있지만 별도의 작업 공간(별도의 저장소일 수 있음)에 있는 경우 dotnet aws deploy명령을 호출할 때 –deployment-project스위치를 사용하여 공유 배포 프로젝트의 경로를 전달합니다.

 

 

마무리

 

이 게시물에서는 새 배포 프로젝트 기능을 사용하여 새 배포 도구로 .NET 응용 프로그램 배포를 사용자 지정하는 방법에 대한 매우 간단한 예를 보여주었습니다. 이 기능을 사용하여 팀 또는 회사 요구 사항에 맞게 훨씬 더 고급 사용자 지정을 수행할 수 있습니다. 예를 들어 측면 차량 컨테이너를 추가하거나, Amazon Route 53에 대한 DNS 항목을 추가하거나, 모든 배포에서 VPC 설정을 표준화할 수 있습니다. 사용해 보고 최신 개발 사항을 모두 확인할 수 있는 GitHub 에서 의견을 알려주세요. 

원문URL: https://aws.amazon.com/ko/blogs/developer/dotnet-deployment-projects/

메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글이나 관련 기사 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.