

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

# AWS Solutions Constructs の開始方法
<a name="getting-started-with-aws-solutions-constructs"></a>

 このトピックでは、AWS Cloud Development Kit（AWS CDK）、AWS ソリューションコンストラクトをインストールおよび設定し、AWS ソリューションコンストラクトパターンを使用して最初の AWS CDK アプリケーションを作成する方法について説明します。

**注記**  
AWS CDK バージョン 1.46.0 以上で AWS Solutions Constructs がサポートされています。

**ヒント**  
 深く掘り下げたいですか？ 試してみましょう[CDK ワークショップ](https://cdkworkshop.com/)を参照して、現実世界のプロジェクトのより詳細なツアーをご覧ください。

**ヒント**  
 AWS Cloud Development Kit (AWS CDK) の開始方法の詳細については、[AWS CDK 開発者ガイド](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)。

## Prerequisites
<a name="prerequisites"></a>

 AWS ソリューションコンストラクトは AWS CDK に基づいて構築されているため、Node.js（>= 10.3.0）をインストールする必要があります。これは、TypeScript や JavaScript 以外の言語で動作しているものでも同様です。これは、[AWS CDK](https://github.com/aws/aws-cdk)と AWS ソリューションコンストラクトは TypeScript で開発され、Node.js 上で実行されます。サポートされている他の言語のバインディングでは、このバックエンドとツールセットが使用されます。

 「認証情報およびリージョンの指定」の説明に従って、AWS CDK CLI を使用するには、認証情報と AWS リージョンを指定する必要があります。

 その他の前提条件は、次のように、開発言語によって異なります。


|  **言語**  |  **前提条件**  | 
| --- | --- | 
|  ![\[Python\]](http://docs.aws.amazon.com/ja_jp/solutions/latest/constructs/images/python.png)Python  |  Python > = 3.6  | 
|  ![\[TypeScript\]](http://docs.aws.amazon.com/ja_jp/solutions/latest/constructs/images/typescript.png)TypeScript  |  TypeScript > = 2.7  | 
|  ![\[Java\]](http://docs.aws.amazon.com/ja_jp/solutions/latest/constructs/images/java.png)Java | Java > = 1.8 | 

## AWS CDK のインストール
<a name="installing-the-aws-cdk"></a>

 AWS CDK をインストールおよび設定するには、『AWS CDK 開発者ガイド』を参照してください。[AWS CDK のインストール](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_install)。

## AWS Solutions Constructs の使用
<a name="working-with-the-aws-solutions-constructs-library"></a>

 AWS ソリューションコンストラクトを使用するときに新しいアプリケーションを作成する一般的なワークフローは、AWS CDK と同じアプローチに従います。

1.  app ディレクトリを作成します。

1.  アプリの初期化 

1.  AWS ソリューション構築パターンの依存関係を追加します。

1.  アプリにコードを追加します。

1.  必要に応じて、アプリケーションをコンパイルします。

1.  アプリで定義されているリソースをデプロイします。

1.  アプリのテスト 

 問題がある場合は、変更、コンパイル（必要な場合）、デプロイ、およびテストを繰り返しループします。

# ウォークスルー-パート 1
<a name="walkthrough-part-1"></a>

**注記**  
AWS CDK バージョン 1.46.0 以上 AWS ソリューション構成がサポートされています。

 このチュートリアルでは、プロジェクトの初期化から結果の AWS CloudFormation テンプレートのデプロイまで、AWS ソリューション構築のパターンを使用する、シンプルな「Hello Constructs」AWS CDK アプリケーションを作成してデプロイする方法について説明します。Hello Constructsアプリは、次の簡単なソリューションを作成します。

![\[アーキテクチャ図\]](http://docs.aws.amazon.com/ja_jp/solutions/latest/constructs/images/tutorial-part1.png)


## Hello Constrents
<a name="hello-konstruk"></a>

 パターンベースの開発を使用して、最初の AWS CDK アプリケーションの構築を始めましょう。

**注記**  
 これは、`Hello CDK!`からの[CDK ワークショップ](https://cdkworkshop.com/)。AWS CDK を初めて使用する場合は、このワークショップから実践的なウォークスルーを行い、CDK を活用して実世界のプロジェクトを構築する方法をおすすめします。

## アプリケーションディレクトリの作成と AWS CDK の初期化
<a name="creating-the-app-directory-and-initializing-the-aws-cdk"></a>

 CDK アプリケーション用のディレクトリを作成し、そのディレクトリに AWS CDK アプリケーションを作成します。

------
#### [ TypeScript ]

```
  mkdir hello-constructs     
  cd hello-constructs     
  cdk init --language typescript
```

------
#### [ Python ]

```
  mkdir hello-constructs     
  cd hello-constructs     
  cdk init --language python
```

------

**ヒント**  
今度は、お気に入りの IDE でプロジェクトを開いて探索する良い時期です。プロジェクト構造の詳細については、適切なリンクを選択します。  
[TypeScript](https://cdkworkshop.com/20-typescript/20-create-project/300-structure.html)
[Python](https://cdkworkshop.com/30-python/20-create-project/300-structure.html)

## プロジェクトベースの依存関係の更新
<a name="update-project-base-dependencies-to-use-aws-cdk"></a>

**警告**  
適切な機能を確保するために、AWS ソリューションコンストラクトと AWS CDK パッケージはプロジェクト内で同じバージョン番号を使用する必要があります。たとえば、AWS ソリューション構成 v.1.52.0 を使用している場合は、AWS CDK v.1.52.0 も使用する必要があります。

**ヒント**  
 AWS ソリューション構築物の最新バージョンを書き留め、そのバージョン番号を`VERSION_NUMBER`プレースホルダを以下のステップで使用します（AWS ソリューションコンストラクトと AWS CDK パッケージの両方）。Constructsライブラリのすべてのパブリックリリースをチェックするには、[ここをクリックしてください] を選択します](https://github.com/awslabs/aws-solutions-constructs/releases)。

------
#### [ TypeScript ]

編集`package.json`ファイルを編集します。

```
  "devDependencies": {
    "@aws-cdk/assert": "VERSION_NUMBER",
    "@types/jest": "^24.0.22",
    "@types/node": "10.17.5",
    "jest": "^24.9.0",
    "ts-jest": "^24.1.0",
    "aws-cdk": "VERSION_NUMBER",
    "ts-node": "^8.1.0",
    "typescript": "~3.7.2"
  },
  "dependencies": {
    "@aws-cdk/core": "VERSION_NUMBER",
    "source-map-support": "^0.5.16"
  }
```

------
#### [ Python ]

編集`setup.py`ファイルを編集します。

```
install_requires=[
    "aws-cdk.core==VERSION_NUMBER",
],
```

------

 プロジェクトの基本依存関係をインストールします。

------
#### [ TypeScript ]

```
npm install      
```

------
#### [ Python ]

```
source .venv/bin/activate
pip install -r requirements.txt
```

------

 アプリケーションをビルドして実行し、空のスタックが作成されていることを確認します。

------
#### [ TypeScript ]

```
 npm run build 
 cdk synth
```

------
#### [ Python ]

```
 cdk synth           
```

------

 次のようなスタックが表示されます。`CDK-VERSION`はCDKのバージョンです。（出力は、ここに示されているものと若干異なる場合があります）。

------
#### [ TypeScript ]

```
Resources:
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
          Modules: aws-cdk=CDK-VERSION,@aws-cdk/core=VERSION_NUMBER,@aws-cdk/cx-api=VERSION_NUMBER,jsii-runtime=node.js/10.17.0
```

------
#### [ Python ]

```
Resources:
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
          Modules: aws-cdk=CDK-VERSION,@aws-cdk/core=VERSION_NUMBER,@aws-cdk/cx-api=VERSION_NUMBER,jsii-runtime=Python/3.7.7
```

------

## Lambda ハンドコード
<a name="lambda-handler-code"></a>

 AWS Lambda ハンドラーコードから始めます。

 ディレクトリを作成する`lambda`プロジェクトツリーのルートに移動します。

------
#### [ TypeScript ]

という名前のファイルを追加します。`lambda/hello.js`項目の変更は以下のとおりです。

```
exports.handler = async function(event) {
  console.log("request:", JSON.stringify(event, null, 2));
  return {
    statusCode: 200,
    headers: { "Content-Type": "text/plain" },
    body: `Hello, AWS Solutions Constructs! You've hit ${event.path}\n`
  };
};
```

------
#### [ Python ]

という名前のファイルを追加します。`lambda/hello.py`項目の変更は以下のとおりです。

```
import json

def handler(event, context):
    print('request: {}'.format(json.dumps(event)))
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'text/plain'
        },
        'body': 'Hello, CDK! You have hit {}\n'.format(event['path'])
    }
```

------

 これは単純なLambda 関数で、「こんにちは、コンストラクト！[url path]」とヒットしました。関数の出力には、HTTP ステータスコードと HTTP ヘッダーも含まれます。これらは、API Gateway によって、ユーザーへの HTTP 応答を策定するために使用されます。

 このLambda は、JavaScriptで提供されています。選択した言語で Lambda 関数を記述する方法の詳細については、[AWS Lambda ドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)。

## AWS CDK をインストールし、AWS ソリューションを構築する依存関係
<a name="install-the-aws-cdk-and-aws-solutions-constructs-library-dependencies"></a>

 AWS ソリューションコンストラクトには、コンストラクトの広範なライブラリが付属しています。ライブラリは、適切に設計されたパターンごとに1つずつ、モジュールに分割されています。例えば、Amazon API Gateway レスト API を AWS Lambda 関数に定義する場合、`aws-apigateway-lambda`パターンライブラリ.

 また、AWS CDK から AWS Lambda および Amazon API Gateway 構築ライブラリを追加する必要があります。

 AWS Lambda モジュールとそのすべての依存関係をプロジェクトにインストールします。

**注記**  
AWS ソリューション構築と AWS CDK の両方で使用する正しい一致するバージョンを`VERSION_NUMBER`各コマンドのプレースホルダフィールドです。パッケージ間でバージョンが一致しないと、エラーが発生する可能性があります。

------
#### [ TypeScript ]

```
 npm install -s @aws-cdk/aws-lambda@VERSION_NUMBER       
```

------
#### [ Python ]

```
 pip install aws_cdk.aws_lambda==VERSION_NUMBER 
```

------

 次に、Amazon API Gateway モジュールとそのすべての依存関係をプロジェクトにインストールします。

------
#### [ TypeScript ]

```
 npm install -s @aws-cdk/aws-apigateway@VERSION_NUMBER         
```

------
#### [ Python ]

```
 pip install aws_cdk.aws_apigateway==VERSION_NUMBER          
```

------

 最後に、AWS ソリューションコンストラクトをインストールします`aws-apigateway-lambda`モジュールとそのすべての依存関係をプロジェクトに追加します。

------
#### [ TypeScript ]

```
 npm install -s @aws-solutions-constructs/aws-apigateway-lambda@VERSION_NUMBER        
```

------
#### [ Python ]

```
 pip install aws_solutions_constructs.aws_apigateway_lambda==VERSION_NUMBER          
```

------

## Amazon API ゲートウェイ/AWS Lambda パターンをスタックに追加する
<a name="add-an-aws-api-gatewayaws-lambda-pattern-to-your-stack"></a>

 それでは、AWS Lambda プロキシを使用して Amazon API Gateway を実装するための AWS ソリューション構築パターンを定義しましょう。

------
#### [ TypeScript ]

ファイルを編集します。`lib/hello-constructs.ts`項目の変更は次のとおりです。

```
import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as api from '@aws-cdk/aws-apigateway';
import { ApiGatewayToLambda, ApiGatewayToLambdaProps } from '@aws-solutions-constructs/aws-apigateway-lambda';

export class HelloConstructsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    const api_lambda_props: ApiGatewayToLambdaProps = {
      lambdaFunctionProps: {
        code: lambda.Code.fromAsset('lambda'),
        runtime: lambda.Runtime.NODEJS_12_X,
        handler: 'hello.handler'
      },
      apiGatewayProps: {
        defaultMethodOptions: {
          authorizationType: api.AuthorizationType.NONE
        }
      }
    };

    new ApiGatewayToLambda(this, 'ApiGatewayToLambda', api_lambda_props);
  }
}
```

------
#### [ Python ]

ファイルを編集します。`hello_constructs/hello_constructs_stack.py`項目の変更は次のとおりです。

```
from aws_cdk import (
    aws_lambda as _lambda,
    aws_apigateway as apigw,
    core,
)

from aws_solutions_constructs import (
    aws_apigateway_lambda as apigw_lambda
)

class HelloConstructsStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here

        apigw_lambda.ApiGatewayToLambda(
            self, 'ApiGatewayToLambda',
            lambda_function_props=_lambda.FunctionProps(
                runtime=_lambda.Runtime.PYTHON_3_7,
                code=_lambda.Code.asset('lambda'),
                handler='hello.handler',
            ),
            api_gateway_props=apigw.RestApiProps(
                default_method_options=apigw.MethodOptions(
                    authorization_type=apigw.AuthorizationType.NONE
                )
            )
        )
```

------

 それだ これは、すべてのリクエストを AWS Lambda 関数にプロキシする API Gateway を定義するために必要なすべてです。新しいスタックを元のスタックと比較しましょう：

------
#### [ TypeScript ]

```
npm run build    
cdk diff
```

------
#### [ Python ]

```
cdk diff       
```

------

 出力は次のようになります。

```
Stack HelloConstructsStack
IAM Statement Changes
┌───┬─────────────────────────────┬────────┬─────────────────────────────┬─────────────────────────────┬──────────────────────────────┐
│   │ Resource                    │ Effect │ Action                      │ Principal                   │ Condition                    │
├───┼─────────────────────────────┼────────┼─────────────────────────────┼─────────────────────────────┼──────────────────────────────┤
│ + │ ${LambdaFunction.Arn}       │ Allow  │ lambda:InvokeFunction       │ Service:apigateway.amazonaw │ "ArnLike": {                 │
│   │                             │        │                             │ s.com                       │   "AWS:SourceArn": "arn:${AW │
│   │                             │        │                             │                             │ S::Partition}:execute-api:${ │
│   │                             │        │                             │                             │ AWS::Region}:${AWS::AccountI │
│   │                             │        │                             │                             │ d}:${RestApi0C43BF4B}/${Rest │
│   │                             │        │                             │                             │ Api/DeploymentStage.prod}/*/ │
│   │                             │        │                             │                             │ {proxy+}"                    │
│   │                             │        │                             │                             │ }                            │
│ + │ ${LambdaFunction.Arn}       │ Allow  │ lambda:InvokeFunction       │ Service:apigateway.amazonaw │ "ArnLike": {                 │
│   │                             │        │                             │ s.com                       │   "AWS:SourceArn": "arn:${AW │
│   │                             │        │                             │                             │ S::Partition}:execute-api:${ │
│   │                             │        │                             │                             │ AWS::Region}:${AWS::AccountI │
│   │                             │        │                             │                             │ d}:${RestApi0C43BF4B}/test-i │
│   │                             │        │                             │                             │ nvoke-stage/*/{proxy+}"      │
│   │                             │        │                             │                             │ }                            │
│ + │ ${LambdaFunction.Arn}       │ Allow  │ lambda:InvokeFunction       │ Service:apigateway.amazonaw │ "ArnLike": {                 │
│   │                             │        │                             │ s.com                       │   "AWS:SourceArn": "arn:${AW │
│   │                             │        │                             │                             │ S::Partition}:execute-api:${ │
│   │                             │        │                             │                             │ AWS::Region}:${AWS::AccountI │
│   │                             │        │                             │                             │ d}:${RestApi0C43BF4B}/${Rest │
│   │                             │        │                             │                             │ Api/DeploymentStage.prod}/*/ │
│   │                             │        │                             │                             │ "                            │
│   │                             │        │                             │                             │ }                            │
│ + │ ${LambdaFunction.Arn}       │ Allow  │ lambda:InvokeFunction       │ Service:apigateway.amazonaw │ "ArnLike": {                 │
│   │                             │        │                             │ s.com                       │   "AWS:SourceArn": "arn:${AW │
│   │                             │        │                             │                             │ S::Partition}:execute-api:${ │
│   │                             │        │                             │                             │ AWS::Region}:${AWS::AccountI │
│   │                             │        │                             │                             │ d}:${RestApi0C43BF4B}/test-i │
│   │                             │        │                             │                             │ nvoke-stage/*/"              │
│   │                             │        │                             │                             │ }                            │
├───┼─────────────────────────────┼────────┼─────────────────────────────┼─────────────────────────────┼──────────────────────────────┤
│ + │ ${LambdaFunctionServiceRole │ Allow  │ sts:AssumeRole              │ Service:lambda.amazonaws.co │                              │
│   │ .Arn}                       │        │                             │ m                           │                              │
├───┼─────────────────────────────┼────────┼─────────────────────────────┼─────────────────────────────┼──────────────────────────────┤
│ + │ ${LambdaRestApiCloudWatchRo │ Allow  │ sts:AssumeRole              │ Service:apigateway.amazonaw │                              │
│   │ le.Arn}                     │        │                             │ s.com                       │                              │
├───┼─────────────────────────────┼────────┼─────────────────────────────┼─────────────────────────────┼──────────────────────────────┤
│ + │ arn:aws:logs:${AWS::Region} │ Allow  │ logs:CreateLogGroup         │ AWS:${LambdaRestApiCloudWat │                              │
│   │ :${AWS::AccountId}:*        │        │ logs:CreateLogStream        │ chRole}                     │                              │
│   │                             │        │ logs:DescribeLogGroups      │                             │                              │
│   │                             │        │ logs:DescribeLogStreams     │                             │                              │
│   │                             │        │ logs:FilterLogEvents        │                             │                              │
│   │                             │        │ logs:GetLogEvents           │                             │                              │
│   │                             │        │ logs:PutLogEvents           │                             │                              │
├───┼─────────────────────────────┼────────┼─────────────────────────────┼─────────────────────────────┼──────────────────────────────┤
│ + │ arn:aws:logs:${AWS::Region} │ Allow  │ logs:CreateLogGroup         │ AWS:${LambdaFunctionService │                              │
│   │ :${AWS::AccountId}:log-grou │        │ logs:CreateLogStream        │ Role}                       │                              │
│   │ p:/aws/lambda/*             │        │ logs:PutLogEvents           │                             │                              │
└───┴─────────────────────────────┴────────┴─────────────────────────────┴─────────────────────────────┴──────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Parameters
[+] Parameter AssetParameters/ba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340a/S3Bucket AssetParametersba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340aS3Bucket9780A3BC: {"Type":"String","Description":"S3 bucket for asset \"ba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340a\""}
[+] Parameter AssetParameters/ba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340a/S3VersionKey AssetParametersba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340aS3VersionKey37F36FFB: {"Type":"String","Description":"S3 key for asset version \"ba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340a\""}
[+] Parameter AssetParameters/ba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340a/ArtifactHash AssetParametersba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340aArtifactHash80199FBC: {"Type":"String","Description":"Artifact hash for asset \"ba91444ebd644d9419e8cfee417f3aaa728507dd428788a2fc40574646c4340a\""}

Conditions
[+] Condition CDKMetadataAvailable: {"Fn::Or":[{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-northwest-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"sa-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-2"]}]}]}

Resources
[+] AWS::Logs::LogGroup ApiGatewayToLambda/ApiAccessLogGroup ApiGatewayToLambdaApiAccessLogGroupE2B41502 
[+] AWS::IAM::Role LambdaFunctionServiceRole LambdaFunctionServiceRole0C4CDE0B 
[+] AWS::Lambda::Function LambdaFunction LambdaFunctionBF21E41F 
[+] AWS::ApiGateway::RestApi RestApi RestApi0C43BF4B 
[+] AWS::ApiGateway::Deployment RestApi/Deployment RestApiDeployment180EC503d2c6df3c8dc8b7193b98c1a0bff4e677 
[+] AWS::ApiGateway::Stage RestApi/DeploymentStage.prod RestApiDeploymentStageprod3855DE66 
[+] AWS::ApiGateway::Resource RestApi/Default/{proxy+} RestApiproxyC95856DD 
[+] AWS::Lambda::Permission RestApi/Default/{proxy+}/ANY/ApiPermission.HelloConstructsStackRestApiFDB18C2E.ANY..{proxy+} RestApiproxyANYApiPermissionHelloConstructsStackRestApiFDB18C2EANYproxyE43D39B3 
[+] AWS::Lambda::Permission RestApi/Default/{proxy+}/ANY/ApiPermission.Test.HelloConstructsStackRestApiFDB18C2E.ANY..{proxy+} RestApiproxyANYApiPermissionTestHelloConstructsStackRestApiFDB18C2EANYproxy0B23CDC7 
[+] AWS::ApiGateway::Method RestApi/Default/{proxy+}/ANY RestApiproxyANY1786B242 
[+] AWS::Lambda::Permission RestApi/Default/ANY/ApiPermission.HelloConstructsStackRestApiFDB18C2E.ANY.. RestApiANYApiPermissionHelloConstructsStackRestApiFDB18C2EANY5684C1E6 
[+] AWS::Lambda::Permission RestApi/Default/ANY/ApiPermission.Test.HelloConstructsStackRestApiFDB18C2E.ANY.. RestApiANYApiPermissionTestHelloConstructsStackRestApiFDB18C2EANY81DBDF56 
[+] AWS::ApiGateway::Method RestApi/Default/ANY RestApiANYA7C1DC94 
[+] AWS::ApiGateway::UsagePlan RestApi/UsagePlan RestApiUsagePlan6E1C537A 
[+] AWS::Logs::LogGroup ApiAccessLogGroup ApiAccessLogGroupCEA70788 
[+] AWS::IAM::Role LambdaRestApiCloudWatchRole LambdaRestApiCloudWatchRoleF339D4E6 
[+] AWS::ApiGateway::Account LambdaRestApiAccount LambdaRestApiAccount 

Outputs
[+] Output RestApi/Endpoint RestApiEndpoint0551178A: {"Value":{"Fn::Join":["",["https://",{"Ref":"RestApi0C43BF4B"},".execute-api.",{"Ref":"AWS::Region"},".",{"Ref":"AWS::URLSuffix"},"/",{"Ref":"RestApiDeploymentStageprod3855DE66"},"/"]]}}
```

 いいね この単純な例では、AWS Solutions Constructs の 1 つの優れたアーキテクチャのパターンを使用して、スタックに 21 個の新しいリソースが追加されました。

## CDK デプロイ
<a name="cdk-deploy"></a>

**ヒント**  
Lambda 関数を含む最初の AWS CDK アプリケーションをデプロイする前に、AWS 環境をブートストラップする必要があります。これにより、AWS CDK がアセットを含むスタックをデプロイするために使用するステージングバケットが作成されます。AWS CDK を使用してアセットをデプロイするのが初めての場合は、`cdk bootstrap`をクリックして、CDK ツールキットスタックを AWS 環境にデプロイします。

 デプロイの準備が整いました?

```
cdk deploy
```

## スタック出力
<a name="stack-outputs"></a>

 デプロイが完了すると、次の行が表示されます。

```
Outputs:
HelloConstructsStack.RestApiEndpoint0551178A = https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod/
```

 これは、AWS Solutions Constructs パターンによって自動的に追加されるスタック出力で、API Gateway エンドポイントの URL が含まれます。

## アプリのテスト
<a name="testing-your-app"></a>

 このエンドポイントを`curl`。URLをコピーして実行します（接頭辞と地域が異なる可能性があります）。

```
curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod/
```

 出力は次のようになります。

```
Hello, AWS Solutions Constructs! You've hit /
```

 これがあなたが受け取った出力であれば、あなたのアプリは動作します！

# ウォークスルー-パート 2
<a name="walkthrough-part-2"></a>

**注記**  
AWS ソリューションコンストラクトは、AWS CDK バージョン 1.46.0 以上でサポートされています。

 このチュートリアルでは、で作成された「Hello Constructs」アプリを変更する方法について説明します。[パート 1](walkthrough-part-1.md)。変更により、AWS ソリューションコンストラクトから AWS Lambda から DynamoDB へのパターンを使用してサイトヒットカウンタが追加されます。Hello コンストラクトアプリを変更すると、次の解決策が得られます。

![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/solutions/latest/constructs/images/tutorial-part2.png)


## ヒットカウンタ Lambda コード
<a name="hit-counter-lambda-code"></a>

 まず、ヒットカウンター AWS Lambda 関数のコードを記述します。この関数は、以下を実行します。
+  は、Amazon DynamoDB テーブルの API パスに関連するカウンタをインクリメントします。
+  ダウンストリームの Hello AWS Lambda 関数を呼び出します。
+  を返し、エンドユーザーにレスポンスを返します。

------
#### [ TypeScript ]

という名前のファイルを追加する`lambda/hitcounter.js`項目の変更後:

```
  const { DynamoDB, Lambda } = require('aws-sdk');

exports.handler = async function(event) {
  console.log("request:", JSON.stringify(event, undefined, 2));

  // create AWS SDK clients
  const dynamo = new DynamoDB();
  const lambda = new Lambda();

  // update dynamo entry for "path" with hits++
  await dynamo.updateItem({
    TableName: process.env.DDB_TABLE_NAME,
    Key: { path: { S: event.path } },
    UpdateExpression: 'ADD hits :incr',
    ExpressionAttributeValues: { ':incr': { N: '1' } }
  }).promise();

  // call downstream function and capture response
  const resp = await lambda.invoke({
    FunctionName: process.env.DOWNSTREAM_FUNCTION_NAME,
    Payload: JSON.stringify(event)
  }).promise();

  console.log('downstream response:', JSON.stringify(resp, undefined, 2));

  // return response back to upstream caller
  return JSON.parse(resp.Payload);
};
```

------
#### [ Python ]

という名前のファイルを追加する`lambda/hitcounter.py`項目の変更後:

```
import json
import os
import boto3

ddb = boto3.resource('dynamodb')
table = ddb.Table(os.environ['DDB_TABLE_NAME'])
_lambda = boto3.client('lambda')


def handler(event, context):
    print('request: {}'.format(json.dumps(event)))
    table.update_item(
        Key={'path': event['path']},
        UpdateExpression='ADD hits :incr',
        ExpressionAttributeValues={':incr': 1}
    )

    resp = _lambda.invoke(
        FunctionName=os.environ['DOWNSTREAM_FUNCTION_NAME'],
        Payload=json.dumps(event),
    )

    body = resp['Payload'].read()

    print('downstream response: {}'.format(body))
    return json.loads(body)
```

------

## 新しい依存関係をインストールする
<a name="install-the-new-dependencies"></a>

**注記**  
AWS ソリューション構築と AWS CDK の両方で使用する正しい一致するバージョンを`VERSION_NUMBER`各コマンドのプレースホルダフィールドです。これは、このウォークスルーの最初の部分で依存関係に使用されるバージョン番号と同じである必要があります。パッケージ間でバージョンが一致しないと、エラーが発生する可能性があります。

 いつものように、まずソリューションのアップデートに必要な依存関係をインストールする必要があります。まず、DynamoDB コンストラクトライブラリをインストールします。

------
#### [ TypeScript ]

```
      npm install -s @aws-cdk/aws-dynamodb@VERSION_NUMBER
```

------
#### [ Python ]

```
      pip install aws_cdk.aws_dynamodb==VERSION_NUMBER
```

------

 最後に、AWS ソリューションコンストラクトをインストールします。`aws-lambda-dynamodb`モジュールとそのすべての依存関係をプロジェクトに追加します。

------
#### [ TypeScript ]

```
      npm install -s @aws-solutions-constructs/aws-lambda-dynamodb@VERSION_NUMBER
```

------
#### [ Python ]

```
      pip install aws_solutions_constructs.aws_lambda_dynamodb==VERSION_NUMBER   
```

------

## リソースを定義します。
<a name="define-the-resources"></a>

 それでは、新しいアーキテクチャに対応するためにスタックコードを更新してみましょう。

 まず、新しい依存関係をインポートし、「Hello」関数を`aws-apigateway-lambda`パート1で作成したパターンです。

------
#### [ TypeScript ]

ファイルを編集します。`lib/hello-constructs.ts`項目の変更後:

```
import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as api from '@aws-cdk/aws-apigateway';
import * as dynamodb from '@aws-cdk/aws-dynamodb';
import { ApiGatewayToLambda, ApiGatewayToLambdaProps } from '@aws-solutions-constructs/aws-apigateway-lambda';
import { LambdaToDynamoDB, LambdaToDynamoDBProps } from '@aws-solutions-constructs/aws-lambda-dynamodb';

export class HelloConstructsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    const helloFunc = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'hello.handler'
    });

    const api_lambda_props: ApiGatewayToLambdaProps = {
      lambdaFunctionProps: {
        code: lambda.Code.fromAsset('lambda'),
        runtime: lambda.Runtime.NODEJS_12_X,
        handler: 'hello.handler'
      },
      apiGatewayProps: {
        defaultMethodOptions: {
          authorizationType: api.AuthorizationType.NONE
        }
      }
    };

    new ApiGatewayToLambda(this, 'ApiGatewayToLambda', api_lambda_props);
  }
}
```

------
#### [ Python ]

ファイルを編集します。`hello_constructs/hello_constructs_stack.py`項目の変更後:

```
from aws_cdk import (
    aws_lambda as _lambda,
    aws_apigateway as apigw,
    aws_dynamodb as ddb,
    core,
)

from aws_solutions_constructs import (
    aws_apigateway_lambda as apigw_lambda,
    aws_lambda_dynamodb as lambda_ddb
)

class HelloConstructsStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here

        self._handler = _lambda.Function(
          self, 'HelloHandler',
          runtime=_lambda.Runtime.PYTHON_3_7,
          handler='hello.handler',
          code=_lambda.Code.asset('lambda'),
        )

        apigw_lambda.ApiGatewayToLambda(
            self, 'ApiGatewayToLambda',
            lambda_function_props=_lambda.FunctionProps(
                runtime=_lambda.Runtime.PYTHON_3_7,
                code=_lambda.Code.asset('lambda'),
                handler='hello.handler',
            ),
            api_gateway_props=apigw.RestApiProps(
                default_method_options=apigw.MethodOptions(
                    authorization_type=apigw.AuthorizationType.NONE
                )
            )
        )
```

------

 次に、我々は追加しようとしています`aws-lambda-dynamodb`パターンを使用して、更新されたアーキテクチャのヒットカウンターサービスを構築します。

![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/solutions/latest/constructs/images/tutorial-part2a.png)


 以下の次の更新では、`aws-lambda-dynamodb`パターンを使用して AWS Lambda 関数をヒットカウンターハンドラで定義します。さらに、Amazon DynamoDB テーブルは`Hits`と、パーティションキー`path`。

------
#### [ TypeScript ]

ファイルを編集します。`lib/hello-constructs.ts`項目の変更後:

```
import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as api from '@aws-cdk/aws-apigateway';
import * as dynamodb from '@aws-cdk/aws-dynamodb';
import { ApiGatewayToLambda, ApiGatewayToLambdaProps } from '@aws-solutions-constructs/aws-apigateway-lambda';
import { LambdaToDynamoDB, LambdaToDynamoDBProps } from '@aws-solutions-constructs/aws-lambda-dynamodb';

export class HelloConstructsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    const helloFunc = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'hello.handler'
    });

    // hit counter, aws-lambda-dynamodb pattern
    const lambda_ddb_props: LambdaToDynamoDBProps = {
      lambdaFunctionProps: {
          code: lambda.Code.asset(`lambda`),
          runtime: lambda.Runtime.NODEJS_12_X,
          handler: 'hitcounter.handler',
          environment: {
              DOWNSTREAM_FUNCTION_NAME: helloFunc.functionName
          }
      },
      dynamoTableProps: {
          tableName: 'Hits',
          partitionKey: { name: 'path', type: dynamodb.AttributeType.STRING }
      }
    };

    const hitcounter = new LambdaToDynamoDB(this, 'LambdaToDynamoDB', lambda_ddb_props);

    const api_lambda_props: ApiGatewayToLambdaProps = {
      lambdaFunctionProps: {
        code: lambda.Code.fromAsset('lambda'),
        runtime: lambda.Runtime.NODEJS_12_X,
        handler: 'hello.handler'
      },
      apiGatewayProps: {
        defaultMethodOptions: {
          authorizationType: api.AuthorizationType.NONE
        }
      }
    };

    new ApiGatewayToLambda(this, 'ApiGatewayToLambda', api_lambda_props);
  }
}
```

------
#### [ Python ]

ファイルを編集します。`hello_constructs/hello_constructs_stack.py`項目の変更後:

```
from aws_cdk import (
    aws_lambda as _lambda,
    aws_apigateway as apigw,
    aws_dynamodb as ddb,
    core,
)

from aws_solutions_constructs import (
    aws_apigateway_lambda as apigw_lambda,
    aws_lambda_dynamodb as lambda_ddb
)

class HelloConstructsStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here

        self.hello_func = _lambda.Function(
          self, 'HelloHandler',
          runtime=_lambda.Runtime.PYTHON_3_7,
          handler='hello.handler',
          code=_lambda.Code.asset('lambda'),
        )

        #  hit counter, aws-lambda-dynamodb pattern
        self.hit_counter = lambda_ddb.LambdaToDynamoDB(
            self, 'LambdaToDynamoDB',
            lambda_function_props=_lambda.FunctionProps(
                runtime=_lambda.Runtime.PYTHON_3_7,
                code=_lambda.Code.asset('lambda'),
                handler='hitcounter.handler',
                environment={
                    'DOWNSTREAM_FUNCTION_NAME': self.hello_func.function_name
                }
            ),
            dynamo_table_props=ddb.TableProps(
                table_name='Hits',
                partition_key={
                    'name': 'path',
                    'type': ddb.AttributeType.STRING
                }
            )
        )

        apigw_lambda.ApiGatewayToLambda(
            self, 'ApiGatewayToLambda',
            lambda_function_props=_lambda.FunctionProps(
                runtime=_lambda.Runtime.PYTHON_3_7,
                code=_lambda.Code.asset('lambda'),
                handler='hello.handler',
            ),
            api_gateway_props=apigw.RestApiProps(
                default_method_options=apigw.MethodOptions(
                    authorization_type=apigw.AuthorizationType.NONE
                )
            )
        )
```

------

 次に、Hit Counter 関数を付与する必要があります。`aws-lambda-dynamodb`パターンは、Hello 関数を呼び出すための権限の上に追加されました。

------
#### [ TypeScript ]

ファイルを編集します。`lib/hello-constructs.ts`項目の変更後:

```
  import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as api from '@aws-cdk/aws-apigateway';
import * as dynamodb from '@aws-cdk/aws-dynamodb';
import { ApiGatewayToLambda, ApiGatewayToLambdaProps } from '@aws-solutions-constructs/aws-apigateway-lambda';
import { LambdaToDynamoDB, LambdaToDynamoDBProps } from '@aws-solutions-constructs/aws-lambda-dynamodb';

export class HelloConstructsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    // hello function responding to http requests 
    const helloFunc = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'hello.handler'
    });

    // hit counter, aws-lambda-dynamodb pattern
    const lambda_ddb_props: LambdaToDynamoDBProps = {
      lambdaFunctionProps: {
          code: lambda.Code.asset(`lambda`),
          runtime: lambda.Runtime.NODEJS_12_X,
          handler: 'hitcounter.handler',
          environment: {
              DOWNSTREAM_FUNCTION_NAME: helloFunc.functionName
          }
      },
      dynamoTableProps: {
          tableName: 'Hits',
          partitionKey: { name: 'path', type: dynamodb.AttributeType.STRING }
      }
    };

    const hitcounter = new LambdaToDynamoDB(this, 'LambdaToDynamoDB', lambda_ddb_props);

    // grant the hitcounter lambda role invoke permissions to the hello function
    helloFunc.grantInvoke(hitcounter.lambdaFunction);

    const api_lambda_props: ApiGatewayToLambdaProps = {
      lambdaFunctionProps: {
        code: lambda.Code.fromAsset('lambda'),
        runtime: lambda.Runtime.NODEJS_12_X,
        handler: 'hello.handler'
      },
      apiGatewayProps: {
        defaultMethodOptions: {
          authorizationType: api.AuthorizationType.NONE
        }
      }
    };

    new ApiGatewayToLambda(this, 'ApiGatewayToLambda', api_lambda_props);
  }
}
```

------
#### [ Python ]

ファイルを編集します。`hello_constructs/hello_constructs_stack.py`項目の変更後:

```
from aws_cdk import (
    aws_lambda as _lambda,
    aws_apigateway as apigw,
    aws_dynamodb as ddb,
    core,
)

from aws_solutions_constructs import (
    aws_apigateway_lambda as apigw_lambda,
    aws_lambda_dynamodb as lambda_ddb
)

class HelloConstructsStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here

        self.hello_func = _lambda.Function(
          self, 'HelloHandler',
          runtime=_lambda.Runtime.PYTHON_3_7,
          handler='hello.handler',
          code=_lambda.Code.asset('lambda'),
        )

        #  hit counter, aws-lambda-dynamodb pattern
        self.hit_counter = lambda_ddb.LambdaToDynamoDB(
            self, 'LambdaToDynamoDB',
            lambda_function_props=_lambda.FunctionProps(
                runtime=_lambda.Runtime.PYTHON_3_7,
                code=_lambda.Code.asset('lambda'),
                handler='hitcounter.handler',
                environment={
                    'DOWNSTREAM_FUNCTION_NAME': self.hello_func.function_name
                }
            ),
            dynamo_table_props=ddb.TableProps(
                table_name='Hits',
                partition_key={
                    'name': 'path',
                    'type': ddb.AttributeType.STRING
                }
            )
        )

        # grant the hitcounter lambda role invoke permissions to the hello function
        self.hello_func.grant_invoke(self.hit_counter.lambda_function)

        apigw_lambda.ApiGatewayToLambda(
            self, 'ApiGatewayToLambda',
            lambda_function_props=_lambda.FunctionProps(
                runtime=_lambda.Runtime.PYTHON_3_7,
                code=_lambda.Code.asset('lambda'),
                handler='hello.handler',
            ),
            api_gateway_props=apigw.RestApiProps(
                default_method_options=apigw.MethodOptions(
                    authorization_type=apigw.AuthorizationType.NONE
                )
            )
        )
```

------

 最後に、オリジナルの`aws-apigateway-lambda`パターンを使用してプロビジョニングされた新しいヒットカウンター関数を利用するには、`aws-lambda-dynamodb`pattern 

------
#### [ TypeScript ]

ファイルを編集します。`lib/hello-constructs.ts`項目の変更後:

```
  import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as api from '@aws-cdk/aws-apigateway';
import * as dynamodb from '@aws-cdk/aws-dynamodb';
import { ApiGatewayToLambda, ApiGatewayToLambdaProps } from '@aws-solutions-constructs/aws-apigateway-lambda';
import { LambdaToDynamoDB, LambdaToDynamoDBProps } from '@aws-solutions-constructs/aws-lambda-dynamodb';

export class HelloConstructsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    // hello function responding to http requests 
    const helloFunc = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'hello.handler'
    });

    // hit counter, aws-lambda-dynamodb pattern
    const lambda_ddb_props: LambdaToDynamoDBProps = {
      lambdaFunctionProps: {
          code: lambda.Code.asset(`lambda`),
          runtime: lambda.Runtime.NODEJS_12_X,
          handler: 'hitcounter.handler',
          environment: {
              DOWNSTREAM_FUNCTION_NAME: helloFunc.functionName
          }
      },
      dynamoTableProps: {
          tableName: 'Hits',
          partitionKey: { name: 'path', type: dynamodb.AttributeType.STRING }
      }
    };

    const hitcounter = new LambdaToDynamoDB(this, 'LambdaToDynamoDB', lambda_ddb_props);

    // grant the hitcounter lambda role invoke permissions to the hello function
    helloFunc.grantInvoke(hitcounter.lambdaFunction);

    const api_lambda_props: ApiGatewayToLambdaProps = {
      existingLambdaObj: hitcounter.lambdaFunction,
      apiGatewayProps: {
        defaultMethodOptions: {
          authorizationType: api.AuthorizationType.NONE
        }
      }
    };

    new ApiGatewayToLambda(this, 'ApiGatewayToLambda', api_lambda_props);
  }
}
```

------
#### [ Python ]

ファイルを編集します。`hello_constructs/hello_constructs_stack.py`項目の変更後:

```
from aws_cdk import (
    aws_lambda as _lambda,
    aws_apigateway as apigw,
    aws_dynamodb as ddb,
    core,
)

from aws_solutions_constructs import (
    aws_apigateway_lambda as apigw_lambda,
    aws_lambda_dynamodb as lambda_ddb
)

class HelloConstructsStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here

        self.hello_func = _lambda.Function(
          self, 'HelloHandler',
          runtime=_lambda.Runtime.PYTHON_3_7,
          handler='hello.handler',
          code=_lambda.Code.asset('lambda'),
        )

        #  hit counter, aws-lambda-dynamodb pattern
        self.hit_counter = lambda_ddb.LambdaToDynamoDB(
            self, 'LambdaToDynamoDB',
            lambda_function_props=_lambda.FunctionProps(
                runtime=_lambda.Runtime.PYTHON_3_7,
                code=_lambda.Code.asset('lambda'),
                handler='hitcounter.handler',
                environment={
                    'DOWNSTREAM_FUNCTION_NAME': self.hello_func.function_name
                }
            ),
            dynamo_table_props=ddb.TableProps(
                table_name='Hits',
                partition_key={
                    'name': 'path',
                    'type': ddb.AttributeType.STRING
                }
            )
        )

        # grant the hitcounter lambda role invoke permissions to the hello function
        self.hello_func.grant_invoke(self.hit_counter.lambda_function)

        apigw_lambda.ApiGatewayToLambda(
            self, 'ApiGatewayToLambda',
            existing_lambda_obj=self.hit_counter.lambda_function,
            api_gateway_props=apigw.RestApiProps(
                default_method_options=apigw.MethodOptions(
                    authorization_type=apigw.AuthorizationType.NONE
                )
            )
        )
```

------

## 変更の確認
<a name="review-the-changes"></a>

 プロジェクトを構築し、これを展開するときに発生するリソースの変更を確認してみましょう。

```
npm run build
cdk diff
```

 出力は次のようになります。

```
Stack HelloConstructsStack
IAM Statement Changes
┌───┬───────────────────────────────────┬────────┬───────────────────────────────────┬────────────────────────────────────┬───────────┐
│   │ Resource                          │ Effect │ Action                            │ Principal                          │ Condition │
├───┼───────────────────────────────────┼────────┼───────────────────────────────────┼────────────────────────────────────┼───────────┤
│ + │ ${HelloHandler.Arn}               │ Allow  │ lambda:InvokeFunction             │ AWS:${LambdaFunctionServiceRole}   │           │
├───┼───────────────────────────────────┼────────┼───────────────────────────────────┼────────────────────────────────────┼───────────┤
│ + │ ${HelloHandler/ServiceRole.Arn}   │ Allow  │ sts:AssumeRole                    │ Service:lambda.amazonaws.com       │           │
├───┼───────────────────────────────────┼────────┼───────────────────────────────────┼────────────────────────────────────┼───────────┤
│ + │ ${LambdaToDynamoDB/DynamoTable.Ar │ Allow  │ dynamodb:BatchGetItem             │ AWS:${LambdaFunctionServiceRole}   │           │
│   │ n}                                │        │ dynamodb:BatchWriteItem           │                                    │           │
│   │                                   │        │ dynamodb:DeleteItem               │                                    │           │
│   │                                   │        │ dynamodb:GetItem                  │                                    │           │
│   │                                   │        │ dynamodb:GetRecords               │                                    │           │
│   │                                   │        │ dynamodb:GetShardIterator         │                                    │           │
│   │                                   │        │ dynamodb:PutItem                  │                                    │           │
│   │                                   │        │ dynamodb:Query                    │                                    │           │
│   │                                   │        │ dynamodb:Scan                     │                                    │           │
│   │                                   │        │ dynamodb:UpdateItem               │                                    │           │
└───┴───────────────────────────────────┴────────┴───────────────────────────────────┴────────────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬─────────────────────────────┬────────────────────────────────────────────────────────────────────────────────┐
│   │ Resource                    │ Managed Policy ARN                                                             │
├───┼─────────────────────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ + │ ${HelloHandler/ServiceRole} │ arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole │
└───┴─────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Resources
[+] AWS::IAM::Role HelloHandler/ServiceRole HelloHandlerServiceRole11EF7C63 
[+] AWS::Lambda::Function HelloHandler HelloHandler2E4FBA4D 
[+] AWS::DynamoDB::Table LambdaToDynamoDB/DynamoTable LambdaToDynamoDBDynamoTable53C1442D 
[+] AWS::IAM::Policy LambdaFunctionServiceRole/DefaultPolicy LambdaFunctionServiceRoleDefaultPolicy126C8897 
[~] AWS::Lambda::Function LambdaFunction LambdaFunctionBF21E41F 
 ├─ [+] Environment
 │   └─ {"Variables":{"DOWNSTREAM_FUNCTION_NAME":{"Ref":"HelloHandler2E4FBA4D"},"DDB_TABLE_NAME":{"Ref":"LambdaToDynamoDBDynamoTable53C1442D"}}}
 ├─ [~] Handler
 │   ├─ [-] hello.handler
 │   └─ [+] hitcounter.handler
 └─ [~] DependsOn
     └─ @@ -1,3 +1,4 @@
        [ ] [
        [+]   "LambdaFunctionServiceRoleDefaultPolicy126C8897",
        [ ]   "LambdaFunctionServiceRole0C4CDE0B"
        [ ] ]
```

## CDK デプロイ
<a name="cdk-deploy-1"></a>

 さて、デプロイの準備が整いました?

```
cdk deploy
```

## スタック出力
<a name="stack-outputs-1"></a>

 デプロイが完了すると、次の行が表示されます。

```
Outputs:
HelloConstructsStack.RestApiEndpoint0551178A = https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod/
```

## アプリのテスト
<a name="testing-your-app-1"></a>

 カールでこのエンドポイントをヒットしようとしましょう。URLをコピーして実行します（プレフィックスとリージョンが異なる可能性があります）。

```
curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod/
```

 出力は次のようになります。

```
Hello, AWS Solutions Constructs! You've hit /
```

 さて、以下を実行します。`Hits`Amazon DynamoDB テーブル。

1.  DynamoDB コンソールに移動します。

1.  テーブルを作成したリージョンにいることを確認します。

1.  Select**テーブル**項目の変更後、**Hits**テーブル。

1.  テーブルを開き、「アイテム」を選択します。

1.  パスごとにヒット数が表示されるはずです。  
![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/solutions/latest/constructs/images/tutorial-part2b.png)

1.  新しいパスを押して、項目ビューを更新してみてください。新しい項目が表示されます。`hits`1 のカウント。

 これがあなたが受け取った出力であれば、あなたのアプリは動作します！

# サンプルユースケース
<a name="sample-use-cases"></a>

 このライブラリには、Constructs アーキテクチャパターンの使用方法を示す機能ユースケース実装のコレクションが含まれています。これらはアーキテクチャパターンと同じ方法で使用することができ、それらのパターンの追加の「高レベル」抽象化として概念化することができます。次のユースケースは、機能的な例として提供されています。

## AWS 静的 S3 ウェブサイト
<a name="aws-static-s3-website"></a>

 このユースケースパターン（`aws-s3-static-website`）は、Amazon CloudFront ディストリビューション、Amazon S3 バケット、および AWS Lambda ベースのカスタムリソースを実装して、Wild Rydes デモウェブサイトの静的ウェブサイトコンテンツ（`aws-serverless-web-app`実装 

**ソースコード（aws-s3-静的ウェブサイト）**  
 [https://github.com/awslabs/aws-solutions-constructs/tree/master/source/use\$1cases/aws-s3-static-website](https://github.com/awslabs/aws-solutions-constructs/tree/master/source/use_cases/aws-s3-static-website) 

## AWS シンプルサーバーレスイメージハンドラー
<a name="aws-simple-erverless-image-handler"></a>

 このユースケースパターン（`aws-serverless-image-handler`) は、Amazon CloudFront ディストリビューション、Amazon API Gateway REST API、AWS Lambda 関数、およびデプロイアカウント内の 1 つ以上の Amazon S3 バケットからイメージコンテンツを提供する機能イメージハンドラー API をプロビジョニングするために必要な権限/ロジックを実装します。

**ソースコード（aws-サーバーレスイメージハンドラー）**  
 [https://github.com/awslabs/aws-solutions-constructs/tree/master/source/use\$1cases/aws-serverless-image-handler](https://github.com/awslabs/aws-solutions-constructs/tree/master/source/use_cases/aws-serverless-image-handler) 

## AWS サーバーレスウェブアプリ
<a name="aws-serverless-web-app"></a>

 このユースケースパターン（`aws-serverless-web-app`）は、ユーザーがWild Rydesフリートからユニコーン乗り物をリクエストできるようにするシンプルなサーバーレス Web アプリケーションを実装しています。アプリケーションは、取得したい場所を示すHTMLベースのユーザーインターフェイスをユーザーに提示し、リクエストを送信して近くのユニコーンをディスパッチするためのRESTful Webサービスとバックエンドにインターフェースします。また、このアプリケーションは、ユーザーがサービスに登録し、乗り物をリクエストする前にログインするための施設を提供します。

**ソースコード（aws-サーバーレス-web-app）**  
 [https://github.com/awslabs/aws-solutions-constructs/tree/master/source/use\$1cases/aws-serverless-web-app](https://github.com/awslabs/aws-solutions-constructs/tree/master/source/use_cases/aws-serverless-web-app) 