

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# サーバーレスアプリケーションコンポーネントの追加
<a name="cloudformation-serverless-application"></a>

**重要**  
AWS Marketplace では、リソースをデプロイする CloudFormation テンプレートを使用した新製品の公開がサポートされなくなりました AWS Serverless Application Repository。販売者は、 から将来の発表日までリソース AWS Serverless Application Repository をデプロイする CloudFormation テンプレートを使用して既存の製品を引き続き公開できます。

 AWS CloudFormation テンプレートを使用して配信される Amazon マシンイメージ (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 関数、イベントソース、その他のリソースを組み合わせたもので、協調して動作することによりタスクを実行します。サーバーレスアプリケーションは、1 つの Lambda 関数と同じくらい単純な場合もあれば、API、データベース、イベントソースマッピングなどの他のリソースと共に複数の関数を含む場合もあります。

を使用して AWS SAM 、サーバーレスアプリケーションのモデルを定義します。プロパティ名とタイプの詳細については、GitHub の AWS「 Labs」の[AWS::Serverless::Application](https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication)」を参照してください。以下は、単一の 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>

アプリケーションを公開するには、最初にアプリケーションコードをアップロードします。アカウントが所有する Amazon S3 バケットにコードアーティファクト (Lambda 関数、スクリプト、構成ファイルなど) を保存します。アプリケーションをアップロードすると、最初はプライベートに設定されます。つまり、アプリケーションを AWS アカウント 作成した でのみ使用できます。アップロードしたアーティファクトにアクセスするための AWS Serverless Application Repository アクセス許可を付与する IAM ポリシーを作成する必要があります。

**サーバーレスアプリケーションをサーバーレスアプリケーションリポジトリに公開するには**

1. Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. アプリケーションのパッケージ化に使用した Amazon S3 バケットを選択します。

1. **[アクセス許可]** タブを選択します。

1. [**バケットポリシー**] を選択します。

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. [**My Applications (マイアプリケーション)**] ページで、[**Create application (アプリケーションの作成)**] を選択します。

1. 必要に応じて、必須フィールドと任意のフィールドに入力します。必須フィールドは次のとおりです。
   +  **アプリケーション名** 
   +  **筆者** 
   +  **説明** 
   +  **ソースコード URL** 
   +  **SAM template** 

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 許可を付与する必要があります。これを行うには、サーバーレスアプリケーションに関連付けられているポリシーにアクセス許可を追加します。アプリケーションポリシーを更新するには 2 つの方法があります。
+ [AWS Serverless Application Repository](https://console.aws.amazon.com/serverlessrepo/home) に移動します。リストからサーバーレスアプリケーションを選択します。**[共有]** タブを選択し、**[ステートメントを作成]** を選択します。**[ステートメントの設定]** ページの **[アカウント ID]** フィールドに、次のサービスプリンシパル **assets.marketplace.amazonaws.com** を入力します。次に、**[Save (保存)]** を選択します。
+ 次の 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 は、すべての製品ポリシーに従う必要があります。 AWS Marketplace 管理ポータルではセルフサービス AMI スキャンを利用できます。この機能により、AMI のスキャンを開始できます。スキャン結果を迅速に (通常は 1 時間以内に) 受信でき、1 か所で明確なフィードバックを得ることができます。AMI が正常にスキャンされたら、製品ロードフォームをアップロードして AWS Marketplace Seller Operations チームによる処理のために AMI を送信します。

## ステップ 7: AMI とサーバーレスアプリケーションを使用する CloudFormation 製品を送信する
<a name="cloudformation-serverless-application-procedure-step-7"></a>

製品を送信する前に、次の点に注意してください。
+ 各テンプレートのアーキテクチャ図を用意する必要があります。この図では、 AWS CloudFormation テンプレートを介してデプロイされた各 AWS サービスの製品アイコンを使用する必要があります。また、ダイアグラムにはサービスのメタデータが含まれている必要があります。公式の AWS アーキテクチャアイコンをダウンロードするには、「[AWS アーキテクチャアイコン](https://aws.amazon.com/architecture/icons)」を参照してください。
+ 購入者に表示される各テンプレートのインフラストラクチャの料金見積もりは、[AWS 料金計算ツール](https://calculator.s3.amazonaws.com/index.html)を使用して提示した見積もりに基づきます。見積もりには、一般的なデプロイ向けのデフォルト値と共にテンプレートの一部としてデプロイされるサービスのリストを含めます。
+ 製品ロードフォームに入力します。 AWS Marketplace 管理ポータルから製品ロードフォームを見つけることができます。単一 AMI 製品と複数 AMI 製品には、異なる製品ロードフォームが必要です。製品ロードフォームで、CloudFormation テンプレートのパブリック URL を指定します。CloudFormation テンプレートは、パブリック URL の形式で送信する必要があります。
+  AWS Marketplace 管理ポータル を使用して出品を送信します。[**Assets (アセット)**] から [**File upload (ファイルのアップロード)**] を選択し、ファイルをアタッチして、[**Upload (アップロード)**] を選択します。テンプレートとメタデータを受信すると、 はリクエストの処理 AWS を開始します。

出品を送信すると、 は製品ロードフォーム AWS Marketplace を確認して検証します。さらに、 は AMIs とサーバーレスアプリケーションを AWS Marketplace リージョン化し、ユーザーに代わって CloudFormation テンプレートのリージョンマッピングを更新します。問題が発生した場合は、 AWS Marketplace Seller Operations チームが E メールで連絡します。