

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 서버리스 애플리케이션 구성 요소 추가
<a name="cloudformation-serverless-application"></a>

**중요**  
AWS Marketplace 는 더 이상 리소스를 배포하는 CloudFormation 템플릿으로 신제품 게시를 지원하지 않습니다 AWS Serverless Application Repository. 판매자는 향후 발표될 날짜 AWS Serverless Application Repository 까지 리소스를 배포하는 CloudFormation 템플릿으로 기존 제품을 계속 게시할 수 있습니다.

제품에 서버리스 구성 요소가 통합된 상태에서 AWS CloudFormation 템플릿을 사용하여 제공되는 Amazon Machine Image(AMI)가 포함된 제품을 생성할 수 있습니다. 예를 들어 AMI가 컨트롤러 서버로 구성된 제품을 생성하고 CloudFormation 스택으로 제공할 수 있습니다. 스택을 생성하는 데 사용되는 CloudFormation 템플릿에는 서버의 이벤트에 의해 트리거되는 AWS Lambda 함수를 설정하는 정의가 포함될 수 있습니다. 이 접근 방식을 사용하여 제품을 설계하면 아키텍처를 간소화할 수 있으므로 구매자가 손쉽게 시작할 수 있습니다. 또한 제품을 손쉽게 업데이트할 수 있습니다. 다음 섹션에서는 이러한 유형의 제품을 만들고 생성하는 방법을 보여줍니다.

제품에 대한 AMI를 생성하는 방법은 [AWS Marketplace의 AMI 기반 제품](ami-products.md) 섹션을 참조하세요. 제품의 AWS CloudFormation 템플릿 작성에 대한 자세한 내용은 섹션을 참조하세요[제품에 CloudFormation 템플릿 추가](cloudformation.md).

서버리스 애플리케이션을 정의할 때에 저장하는 AWS Serverless Application Model (AWS SAM) 템플릿을 사용합니다 AWS Serverless Application Repository. AWS SAM 는 서버리스 애플리케이션을 빌드하기 위한 오픈 소스 프레임워크입니다. 배포 중에 AWS Serverless Application Model 는 구문을 AWS SAM 변환하고 CloudFormation 구문으로 확장합니다. AWS Serverless Application Repository 는 서버리스 애플리케이션을 위한 관리형 리포지토리입니다. 이 리포지토리를 사용하면 재사용 가능한 애플리케이션을 저장 및 공유할 수 있으므로 구매자가 서버리스 아키텍처를 어셈블하고 배포할 수 있습니다.

**참고**  
AWS Marketplace 는 목록이 생성되기 전에 제품을 검토하고 검증합니다. 제안이 나열되기 전에 해결해야 하는 문제가 있는 경우 이메일 메시지를 보내 드립니다.
구독 이행의 일환으로 AMIs, 서버리스 애플리케이션 및 CloudFormation 템플릿을 각각 AWS Marketplace에 있는 소유 리포지토리에 복사합니다 AWS 리전. 구매자가 제품을 구독할 경우 구매자에게 액세스 권한을 부여하고 소프트웨어 업데이트 시 구매자에게 알립니다.

**Topics**
+ [1단계: 서버리스 애플리케이션 만들기](#cloudformation-serverless-application-procedure-step-1)
+ [2단계: 리포지토리에 애플리케이션 게시](#cloudformation-serverless-application-procedure-step-2)
+ [3단계: CloudFormation 템플릿 만들기](#cloudformation-serverless-application-procedure-step-3)
+ [4단계: CloudFormation 템플릿과 구성 파일 제출](#cloudformation-serverless-application-procedure-step-4)
+ [5단계: AWS Serverless Application Repository 애플리케이션 권한 업데이트](#cloudformation-serverless-application-procedure-step-5)
+ [6단계: AMI 공유](#cloudformation-serverless-application-procedure-step-6)
+ [7단계: AMI 및 서버리스 애플리케이션과 함께 CloudFormation 제품 제출](#cloudformation-serverless-application-procedure-step-7)

## 1단계: 서버리스 애플리케이션 만들기
<a name="cloudformation-serverless-application-procedure-step-1"></a>

첫 번째 단계는 서버리스 애플리케이션을 생성하는 데 사용되는 AWS Lambda 함수를 패키징하는 것입니다. 애플리케이션은 작업을 수행하는 데 함께 작동하는 Lambda 함수, 이벤트 소스 및 기타 리소스의 조합입니다. 서버리스 애플리케이션은 단일 Lambda 함수처럼 간단할 수도 있고 API, 데이터베이스, 이벤트 소스 매핑 등 다른 리소스를 갖춘 여러 기능을 포함할 수도 있습니다.

 AWS SAM 를 사용하여 서버리스 애플리케이션의 모델을 정의합니다. 속성 이름 및 유형에 대한 설명은 GitHub의 [AWS::Serverless::Application](https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication) in AWS Labs를 참조하세요. 다음은 단일 Lambda 함수 및 AWS Identity and Access Management (IAM) 역할이 있는 AWS SAM 템플릿의 예입니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An example of SAM template with Lambda function and IAM role

Resources:
  SampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: 'com.sampleproject.SampleHandler::handleRequest'
      Runtime: java8
      CodeUri: 's3://amzn-s3-demo-bucket/{{2EXAMPLE-1234-4b12-ac37-515EXAMPLEe5-lambda.zip}}'
      Description: Sample Lambda function
      Timeout: 120
      MemorySize: 1024
      Role:
        Fn::GetAtt: [SampleFunctionRole, Arn]

  # Role to execute the Lambda function
  SampleFunctionRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action: "sts:AssumeRole"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
      Policies:
        - PolicyName: SFNXDeployWorkflowDefinitionPolicy
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "s3:Get*"
                Resource: "*"
      RoleName: "SampleFunctionRole"
```

## 2단계: 리포지토리에 애플리케이션 게시
<a name="cloudformation-serverless-application-procedure-step-2"></a>

애플리케이션을 게시하려면 우선 애플리케이션 코드를 업로드합니다. 코드 아티팩트(예: Lambda 함수, 스크립트, 구성 파일)를 계정 소유의 Amazon S3 버킷에 저장합니다. 애플리케이션을 업로드하면 처음에는 프라이빗으로 설정됩니다. 즉, 애플리케이션을 AWS 계정 생성한 에서만 사용할 수 있습니다. 업로드한 아티팩트에 액세스할 수 있는 AWS Serverless Application Repository 권한을 부여하는 IAM 정책을 생성해야 합니다.

**서버리스 애플리케이션을 서버리스 애플리케이션 리포지토리에 게시하려면**

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 애플리케이션을 패키징하는 데 사용한 Amazon S3 버킷을 선택합니다.

1. **권한** 탭을 선택합니다.

1. **버킷 정책(Bucket Policy)**을 선택합니다.

1. 다음 정책 설명 예시를 붙여넣습니다.
**참고**  
이 정책 설명 예시는 다음 단계에서 `aws:SourceAccount` 및 `Resource` 값이 업데이트될 때까지 오류를 일으킵니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service":  "serverlessrepo.amazonaws.com"
               },
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
               "Condition" : {
                   "StringEquals": {
                       "aws:SourceAccount": "{{123456789012}}"
                   }
               }
           }
       ]
   }
   ```

------

   1. `Resource` 속성 값의 amzn-s3-demo-bucket을 버킷의 버킷 이름으로 바꿉니다.

   1. `Condition` 요소의 {{123456789012}}을 AWS 계정 ID로 바꿉니다. `Condition` 요소는 AWS Serverless Application Repository 만 지정된의 애플리케이션에 액세스할 수 있는 권한을 갖도록 합니다 AWS 계정.

1. **저장**을 선택합니다.

1. 에서 AWS Serverless Application Repository 콘솔을 엽니다[https://console.aws.amazon.com/serverlessrepo](https://console.aws.amazon.com/serverlessrepo).

1. **Applications(애플리케이션)** 페이지에서 **Publish application(애플리케이션 게시)**을 선택합니다.

1. 필수 필드와 선택 필드(해당하는 경우)를 완료합니다. 필수 필드는 다음과 같습니다.
   +  **애플리케이션 이름** 
   +  **작성자** 
   +  **설명** 
   +  **소스 코드 URL** 
   +  **SAM 템플릿** 

1. **Publish Application(애플리케이션 게시)**을 선택합니다.

**애플리케이션의 후속 버전을 게시하는 방법**

1. 에서 AWS Serverless Application Repository 콘솔을 엽니다[https://console.aws.amazon.com/serverlessrepo](https://console.aws.amazon.com/serverlessrepo).

1. 탐색 창의 **My Applications(내 애플리케이션)**에서 애플리케이션을 선택합니다.

1. [**새 버전 발행**]을 선택합니다.

자세한 내용은 [AWS SAM CLI를 사용하여 서버리스 애플리케이션 게시를](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html) 참조하세요.

## 3단계: CloudFormation 템플릿 만들기
<a name="cloudformation-serverless-application-procedure-step-3"></a>

CloudFormation 템플릿을 빌드하려면 템플릿 사전 조건을 충족하고 필수 입력 및 보안 파라미터를 제공해야 합니다. 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [템플릿 구조](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)를 참조하세요.

CloudFormation 템플릿에서 서버리스 애플리케이션 및 AMI를 참조할 수 있습니다. 또한 중첩된 CloudFormation 템플릿을 사용하고 루트 템플릿과 중첩된 템플릿에서 서버리스 애플리케이션을 참조할 수 있습니다. 서버리스 애플리케이션을 참조하려면 AWS SAM 템플릿을 사용합니다. 에서 애플리케이션에 대한 AWS SAM 템플릿을 자동으로 생성할 수 있습니다 AWS Serverless Application Repository. 다음은 템플릿의 예입니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An example root template for a SAR application

Resources:
  SampleSARApplication:
    Type: AWS::Serverless::Application
    Properties:
      Location:
         ApplicationId: arn:aws:serverlessrepo:us-east-1:1234567890:applications/TestApplication
         SemanticVersion: 1.0.0
  SampleEC2Instance:
    Type: AWS::EC2::Instance
      Properties: 
        ImageId: "ami-79fd7eee"
        KeyName: "testkey"
        BlockDeviceMappings: 
          - DeviceName: "/dev/sdm"
            Ebs: 
              VolumeType: "io1"
              Iops: "200"
              DeleteOnTermination: "false"
              VolumeSize: "20"
          - DeviceName: "/dev/sdk"
            NoDevice: {}
```

 AWS SAM 템플릿에는 다음 요소가 포함되어 있습니다.
+  `ApplicationID` - 애플리케이션의 Amazon 리소스 이름(ARN)입니다. 이 정보는 AWS Serverless Application Repository의 **내 애플리케이션** 섹션에 있습니다.
+  `SemanticVersion` - 서버리스 애플리케이션의 버전입니다. AWS Serverless Application Repository의 **내 애플리케이션** 섹션에서 찾을 수 있습니다.
+  `Parameter`(선택 사항) - 애플리케이션 파라미터입니다.

**참고**  
`ApplicationID` 및 `SemanticVersion`의 경우 [내장 함수](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)가 지원되지 않습니다. 이러한 문자열은 하드코딩해야 합니다. `ApplicationID`는 복제될 때 업데이트됩니다 AWS Marketplace.

CloudFormation 템플릿의 구성 및 스크립트 파일을 참조할 계획이면 다음 형식을 사용합니다. 중첩 템플릿(`AWS::Cloudformation::Stack`)의 경우 내장 함수 없는 `TemplateURLs`만 지원됩니다. 템플릿의 `Parameters` 내용을 메모해 둡니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Metadata:
  Name: Seller test product
Parameters:
  CFTRefFilesBucket:
    Type: String
    Default: "seller-bucket"
  CFTRefFilesBucketKeyPrefix:
    Type: String
    Default: "cftsolutionFolder/additionCFfiles"
Resources:
  TestEc2:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        addCloudAccount:
          files:
            /etc/cfn/set-aia-settings.sh:
              source:
                Fn::Sub:
                - https://${CFTRefFilesBucket}.${S3Region}amazonaws.com/${CFTRefFilesBucketKeyPrefix}/{{sampleScript.sh}}
                - S3Region:
                    !If
                    - GovCloudCondition
                    - s3-us-gov-west-1
                    - s3
              owner: root
              mode: '000700'
              authentication: Amazon S3AccessCreds
    ..
    ..
    ..
  SampleNestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: 'https://sellerbucket.s3.amazon.com/sellerproductfolder/nestedCft.template'
      Parameters:
        SampleParameter: 'test'
Transform: AWS::Serverless-2016-10-31
```

## 4단계: CloudFormation 템플릿과 구성 파일 제출
<a name="cloudformation-serverless-application-procedure-step-4"></a>

CloudFormation 템플릿과 구성 및 스크립트 파일을 제출하려면 이러한 파일이 저장된 Amazon S3 버킷에 대한 읽기 권한을 AWS Marketplace 에 부여합니다. 이렇게 하려면 다음 권한을 포함하도록 버킷 정책을 업데이트합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service":  "assets.marketplace.amazonaws.com"
            },
            "Action": ["s3:GetObject", "s3:ListBucket"],
            "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket",
                         "arn:aws:s3:::amzn-s3-demo-bucket/*"]
        }
    ]
}
```

------

## 5단계: AWS Serverless Application Repository 애플리케이션 권한 업데이트
<a name="cloudformation-serverless-application-procedure-step-5"></a>

 AWS Serverless Application Repository 애플리케이션을 제출하려면 애플리케이션을 읽을 수 있는 AWS Marketplace 권한을 부여 AWS Marketplace해야 합니다. 이렇게 하려면 서버리스 애플리케이션에 연결된 정책에 권한을 추가합니다. 두 가지 방법으로 애플리케이션 정책을 업데이트할 수 있습니다.
+ [AWS Serverless Application Repository](https://console.aws.amazon.com/serverlessrepo/home)로 이동합니다. 목록에서 서버리스 애플리케이션을 선택합니다. **공유** 탭을 선택하고 **문 생성**을 선택합니다. **문 구성** 페이지의 **계정 ID** 필드에 서비스 주체 **assets.marketplace.amazonaws.com**을 입력합니다. 그런 다음 **저장**을 선택합니다.
+ 다음 AWS CLI 명령을 사용하여 애플리케이션 정책을 업데이트합니다.

  ```
  aws serverlessrepo put-application-policy \
  --region {{region}} \
  --application-id {{application-arn}} \
  --statements Principals=assets.marketplace.amazonaws.com,Actions=Deploy
  ```

## 6단계: AMI 공유
<a name="cloudformation-serverless-application-procedure-step-6"></a>

빌드되고에 제출된 모든 AMIs 모든 제품 정책을 준수해야 AWS Marketplace 합니다. 셀프 서비스 AMI 검사는 AWS Marketplace Management Portal에서 사용할 수 있습니다. 이 기능을 사용하면 AMI 검사를 시작할 수 있습니다. 단일 위치에서 분명한 피드백과 함께 검사 결과를 신속하게(대개 1시간 미만) 받을 수 있습니다. AMI를 성공적으로 스캔한 후 제품 로드 양식을 업로드하여 AWS Marketplace 판매자 운영 팀이 처리할 수 있도록 AMI를 제출합니다.

## 7단계: AMI 및 서버리스 애플리케이션과 함께 CloudFormation 제품 제출
<a name="cloudformation-serverless-application-procedure-step-7"></a>

제품을 제출하기 전에 다음에 유의하세요.
+ 각 템플릿의 아키텍처 다이어그램을 제공해야 합니다. 다이어그램은 CloudFormation 템플릿을 통해 배포된 AWS 각 AWS 서비스의 제품 아이콘을 사용해야 합니다. 또한 다이어그램에는 서비스의 메타데이터가 포함되어야 합니다. 공식 AWS 아키텍처 아이콘을 다운로드하려면 [AWS 아키텍처 아이콘](https://aws.amazon.com/architecture/icons)을 참조하세요.
+ 구매자에게 표시되는 각 템플릿의 인프라 추정 비용은 [AWS 요금 계산기](https://calculator.s3.amazonaws.com/index.html)를 사용하여 제공하는 추정치를 바탕으로 계산됩니다. 추정에는 일반 배포에 대한 기본 값과 함께 템플릿의 일부로 배포되는 서비스의 목록이 포함되어야 합니다.
+ 제품 로드 양식을 완료합니다. 제품 로드 양식은 AWS Marketplace Management Portal에서 찾을 수 있습니다. 단일 AMI 제품과 복수 AMI 제품에 다른 제품 로드 양식이 필요합니다. 제품 로드 양식에서 CloudFormation 템플릿의 퍼블릭 URL을 제공합니다. CloudFormation 템플릿은 퍼블릭 URL 형식으로 제출해야 합니다.
+  AWS Marketplace Management Portal 를 사용하여 목록을 제출합니다. **Assets(자산)**에서 **File upload(파일 업로드)**를 선택하고 파일을 첨부한 다음 **Upload(업로드)**를 선택합니다. 템플릿과 메타데이터가 수신되면가 요청 처리를 AWS 시작합니다.

목록을 제출한 후는 제품 로드 양식을 AWS Marketplace 검토하고 검증합니다. 또한는 AMIs 및 서버리스 애플리케이션을 AWS Marketplace 리전화하고 사용자를 대신하여 CloudFormation 템플릿에 대한 리전 매핑을 업데이트합니다. 문제가 발생하면 AWS Marketplace 판매자 운영 팀에서 이메일로 연락을 드립니다.