AWSCloudFormation公式サイトの「CloudFront テンプレート」を読み解いてみた。


https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/quickref-cloudfront.html

上記公式ドキュメントを読んで、個人的にコメントで内容が分かるように整理してみました。(json)

__これから「CloudFormation 」「CloudFront 」を活用してみようという方々向けに内容を整理しました。
少しでも、AWSCloudFormation公式サイトの理解を深める「きっかけ」になりましたら幸いです。__

Amazon S3 オリジンを使用した Amazon CloudFront Distribution リソース
--
{
/* "AWSTemplateFormatVersion" : "2010-09-09" : この行は、CloudFormationテンプレートのバージョンを示しています。*/

    "AWSTemplateFormatVersion" : "2010-09-09",

/* "Resources" : { } : この行で、テンプレート内で定義されるAWSリソースを示しています。ここでは、"myDistribution"という名前のリソースが定義されています。*/

    "Resources" : {
        "myDistribution" : {

/* "Type" : "AWS::CloudFront::Distribution" : この行で、リソースの種類を示しています。ここでは、CloudFrontディストリビューションが定義されています。*/

            "Type" : "AWS::CloudFront::Distribution",

/* "Properties" : { } : この行で、リソースのプロパティを示しています。ここでは、ディストリビューションの設定を定義しています。*/

            "Properties" : {
                "DistributionConfig" : {

/* "Origins" : [ ] : この行で、ディストリビューションのオリジンを示しています。ここでは、S3バケットをオリジンとして設定しています。*/

                    "Origins" : [ {
                        "DomainName" : "mybucket.s3.amazonaws.com",
                        "Id" : "myS3Origin",
                        "S3OriginConfig" : {
                            "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
                        }
                    }],

/* "Enabled" : "true" : この行で、ディストリビューションの有効化を示しています。*/

                    "Enabled" : "true",

/* "Comment" : "Some comment" : この行で、ディストリビューションに対するコメントを示しています。*/

                    "Comment" : "Some comment",

/* "DefaultRootObject" : "index.html" : この行で、デフォルトのルートオブジェクトを示しています。*/

                    "DefaultRootObject" : "index.html",

/* "Logging" : { } : この行で、ディストリビューションのログ出力設定を示しています。*/

                    "Logging" : {
                        "IncludeCookies" : "false",
                        "Bucket" : "mylogs.s3.amazonaws.com",
                        "Prefix" : "myprefix"
                    },

/* "Aliases" : [ ] : この行で、ディストリビューションに対するエイリアスの設定を示しています。*/


                    "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],

/* 
"DefaultCacheBehavior" 
この行で、ディストリビューションのデフォルトのキャッシュ動作を示しています。

"AllowedMethods"
CloudFrontディストリビューションが許可するHTTPメソッドを定義します。この例では、"DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" が許可されています。

"TargetOriginId"
CloudFrontディストリビューションがデータを取得するオリジンを指定します。この例では、"myS3Origin" という名前のS3バケットが指定されています。

"ForwardedValues"
クライアントから送信されたリクエストをどのように転送するかを定義します。この例では、クエリ文字列は転送せず、クッキーも転送せずに設定されています。

"TrustedSigners"
CloudFrontディストリビューションが信頼する署名者のリストを定義します。この例では、"1234567890EX"と"1234567891EX"という2つの署名者が指定されています。

"ViewerProtocolPolicy"
クライアントのリクエストがhttpまたはhttpsであるかどうかを定義します。この例では、"allow-all"という設定になっており、クライアントがhttpまたはhttpsである場合に両方を許可しています。
*/


                    "DefaultCacheBehavior" : {
                        "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                        "TargetOriginId" : "myS3Origin",
                        "ForwardedValues" : {
                            "QueryString" : "false",
                            "Cookies" : { "Forward" : "none" }
                        },
                        "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
                        "ViewerProtocolPolicy" : "allow-all"
                    },

/* "PriceClass" : "PriceClass_200" : この行で、ディストリビューションの価格設定クラスを示しています。*/


                   "PriceClass" : "PriceClass_200",

/* "Restrictions" : { } : この行で、ディストリビューションのアクセス制限を示しています。*/


                   "Restrictions" : {
                       "GeoRestriction" : {
                           "RestrictionType" : "whitelist",
                           "Locations" : [ "AQ", "CV" ]
                       }
                   },

/* "ViewerCertificate" : { } : この行で、ディストリビューションのビューア証明書を示しています。*/


                   "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }  
                }
            }
        }
    }
}


カスタムオリジンを使用した Amazon CloudFront Distribution リソース
--

{
/* "AWSTemplateFormatVersion" : "2010-09-09"：テンプレートのAWS CloudFormationフォーマットバージョンを指定します。*/

    "AWSTemplateFormatVersion" : "2010-09-09",

/* "Resources"：リソースを定義するセクションです。*/

    "Resources" : {

/* "myDistribution"：作成するAWS CloudFrontディストリビューションの論理IDを指定します。*/

        "myDistribution" : {

/* "Type" : "AWS::CloudFront::Distribution"：作成するリソースのタイプを指定します。*/

            "Type" : "AWS::CloudFront::Distribution",

/* "Properties" : {...}：リソースのプロパティを指定します。*/

            "Properties" : {

/* "DistributionConfig" : {...}：ディストリビューションの構成を指定します。*/

                "DistributionConfig" : {

/* "Origins" : [{...}]：ディストリビューションのオリジンを指定します。この場合、1つのカスタムオリジンが指定されています。*/

                    "Origins" : [ {

/* "DomainName" : "www.example.com"：カスタムオリジンのドメイン名を指定します。*/

                            "DomainName" : "www.example.com",

/* "Id" : "myCustomOrigin"：カスタムオリジンの論理IDを指定します。*/

                            "Id" : "myCustomOrigin",

/* "CustomOriginConfig" : {...}：カスタムオリジンの設定を指定します。この場合、HTTPとHTTPSのポートと、オリジンプロトコルポリシーが指定されています。*/

                            "CustomOriginConfig" : {
                                "HTTPPort" : "80",
                                "HTTPSPort" : "443",
                                "OriginProtocolPolicy" : "http-only"
                            }
                    } ],

/* "Enabled" : "true"：ディストリビューションを有効にするかどうかを指定します。*/

                    "Enabled" : "true",

/* "Comment" : "Somecomment"：ディストリビューションに関するコメントを指定します。*/

                    "Comment" : "Somecomment",

/* "DefaultRootObject" : "index.html"：デフォルトのルートオブジェクトを指定します。*/

                    "DefaultRootObject" : "index.html",

/* "Logging" : {...}：アクセスログを保存するS3バケットとプレフィックスを指定します。この場合、クッキーを含めるように指定されています。*/

                    "Logging" : {
                        "IncludeCookies" : "true",
                        "Bucket" : "mylogs.s3.amazonaws.com",
                        "Prefix": "myprefix"
                    },

/* "Aliases" : ["mysite.example.com", "*.yoursite.example.com"]：ディストリビューションの別名を指定します。この場合、2つの別名が指定されています。*/

                    "Aliases" : [
                        "mysite.example.com",
                        "*.yoursite.example.com"
                    ],

/* "DefaultCacheBehavior" : {...}：ディストリビューションのデフォルトキャッシュ動作を指定します。この場合、カスタムオリジンが指定され、許可されるHTTPメソッド、転送される値、署名済みURL、ViewerProtocolPolicyなどが指定されています。*/

                    "DefaultCacheBehavior" : {
                        "TargetOriginId" : "myCustomOrigin",
                        "SmoothStreaming" : "false",  
                        "ForwardedValues" : {
                            "QueryString" : "false",
                            "Cookies" : { "Forward" : "all" }
                        },
                        "TrustedSigners" : [
                            "1234567890EX",
                            "1234567891EX"
                        ],
                        "ViewerProtocolPolicy" : "allow-all"
                    },

/*
 "CustomErrorResponses" : [{...}]：カスタムエラーページを指定します。この場合、404エラーに対するカスタムエラーページが指定されています。「CustomErrorResponses」は、CloudFrontのディストリビューションでエラーが発生した場合に、カスタムエラーページを指定するために使用されます。このテンプレートの場合、「CustomErrorResponses」には1つの要素が含まれています。これは、HTTPエラーコード「404」に対応するカスタムエラーページを定義しています。

プロパティ
「ErrorCode」：HTTPエラーコードを指定します。この場合は「404」です。「ResponsePagePath」：カスタムエラーページのパスを指定します。この場合は「/error-pages/404.html」です。「ResponseCode」：HTTPステータスコードを指定します。この場合は「200」です。エラーページを返すためにCloudFrontは、HTTPステータスコードが「4xx」または「5xx」であるレスポンスを必要とします。しかし、カスタムエラーページを返すために、CloudFrontは200番台のステータスコードを使用します。「ErrorCachingMinTTL」：エラーページをキャッシュするための最小のTTL（Time To Live）を指定します。この場合は「30」秒です。このように、「CustomErrorResponses」プロパティを使用することで、CloudFrontのディストリビューションでエラーが発生した場合に、カスタムエラーページを提供できます。
*/

                    "CustomErrorResponses" : [ {
                        "ErrorCode" : "404",
                        "ResponsePagePath" : "/error-pages/404.html",
                        "ResponseCode" : "200",
                        "ErrorCachingMinTTL" : "30"
                    } ],
/* 
"PriceClass"は、CloudFrontディストリビューションが利用可能な価格クラスを指定するプロパティです。価格クラスには、"PriceClass_All"、"PriceClass_200"、"PriceClass_100"の3つのオプションがあります。
"PriceClass_All"は、全世界にわたる全てのエッジロケーションでCloudFrontが利用可能であることを保証するために最も高価格です。これに対して、"PriceClass_100"は最も安価で、一部のエッジロケーションでのみCloudFrontが利用可能であることがあります。"PriceClass_200"は、世界中の主要なエッジロケーションでCloudFrontが利用可能であり、価格とパフォーマンスのバランスがとれた価格です。
ディストリビューションの価格クラスを指定することで、エッジロケーションの範囲に応じてコストを削減することができますが、エンドユーザーのパフォーマンスが低下する可能性があります。価格クラスは、ビジネスニーズや予算に合わせて選択することができます。
*/

                   "PriceClass" : "PriceClass_200",
                   "Restrictions" : {
                       "GeoRestriction" : {
                           "RestrictionType" : "whitelist",
                           "Locations" : [ "AQ", "CV" ]
                       }
                   },

/* 
「ViewerCertificate」はCloudFrontディストリビューションに関する証明書を指定するプロパティです。このプロパティで指定された証明書を使用して、HTTPS接続を介してエンドユーザーに配信されるコンテンツを保護することができます。
このテンプレートの「ViewerCertificate」プロパティでは、「CloudFrontDefaultCertificate」を「true」としています。これは、CloudFrontデフォルトの証明書を使用してエンドユーザーにコンテンツを配信することを意味します。デフォルトの証明書は、Amazonが発行したサーバー名として知られている証明書であり、AWSのすべてのリージョンで使用できます。
*/

                   "ViewerCertificate": { "CloudFrontDefaultCertificate" : "true" }

                }
            }
        }
    }
}

複数のオリジンをサポートする Amazon CloudFront ディストリビューション
--
{
/* AWSTemplateFormatVersion：テンプレートの形式バージョンを指定します。*/

    "AWSTemplateFormatVersion" : "2010-09-09",

/* Resources：AWS CloudFormationが管理するリソースを定義します。この場合、AWS CloudFrontの配布が定義されています。*/

    "Resources" : {

/* myDistribution：AWS CloudFrontの配布のリソース名を定義します。*/

        "myDistribution" : {

/* Type：リソースのタイプを定義します。この場合、AWS::CloudFront::Distribution。*/

            "Type" : "AWS::CloudFront::Distribution",

/* Properties：AWS CloudFrontの配布のプロパティを定義します。*/

            "Properties" : {
                "DistributionConfig" : {

/* Origins：オリジン（リソースの元）の設定を定義します。S3バケットのオリジンとカスタムオリジンが定義されています。*/

                    "Origins" : [ {
                        "Id" : "myS3Origin",
                        "DomainName" : "mybucket.s3.amazonaws.com",
                        "S3OriginConfig" : {
                            "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
                        }
                     }, 
                     {
                         "Id" : "myCustomOrigin",
                         "DomainName" : "www.example.com",
                         "CustomOriginConfig" : {
                             "HTTPPort" : "80",
                             "HTTPSPort" : "443",
                             "OriginProtocolPolicy" : "http-only"
                         }
                     }
                   ],

/* Enabled：AWS CloudFrontの配布が有効化されているかどうかを指定します。*/

                   "Enabled" : "true",

/* Comment：AWS CloudFrontの配布の説明を指定します。*/

                   "Comment" : "Some comment",

/* DefaultRootObject：デフォルトのルートオブジェクトを指定します。*/

                   "DefaultRootObject" : "index.html", 

/* Logging：AWS CloudFrontの配布のログの設定を指定します。*/

                   "Logging" : {
                       "IncludeCookies" : "true",
                       "Bucket" : "mylogs.s3.amazonaws.com",
                       "Prefix" : "myprefix"
                   },            

/* Aliases：AWS CloudFrontの配布のエイリアスを指定します。*/

                   "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],

/* DefaultCacheBehavior：AWS CloudFrontの配布のデフォルトのキャッシュ動作を指定します。オリジンID、フォワードバリュー、トラストサイン、ビューアプロトコルポリシー、最小TTL、SmoothStreamingが設定されています。*/

                   "DefaultCacheBehavior" : {
                       "TargetOriginId" : "myS3Origin",
                       "ForwardedValues" : {
                           "QueryString" : "false",
                           "Cookies" : { "Forward" : "all" }
                        },
                       "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                       "ViewerProtocolPolicy" : "allow-all",
                       "MinTTL" : "100",
                       "SmoothStreaming" : "true"
                   },

/* CacheBehaviors：AWS CloudFrontの配布のキャッシュ動作を定義します。許可されるメソッド、オリジンID、フォワードバリュー、トラストサイン、ビューアプロトコルポリシー、最小TTL、PathPatternが設定されています。*/

                   "CacheBehaviors" : [ {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myS3Origin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images1/*.jpg"
                        }, 
                        {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myCustomOrigin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images2/*.jpg"
                        }
                   ],

/* CustomErrorResponses：AWS CloudFrontの配布のカスタムエラーレスポンスを指定します。*/

                   "CustomErrorResponses" : [ {
                       "ErrorCode" : "404",
                       "ResponsePagePath" : "/error-pages/404.html",
                       "ResponseCode" : "200",
                       "ErrorCachingMinTTL" : "30"
                   } ],

/* PriceClass：AWS CloudFrontの配布の価格クラスを指定します。*/

                   "PriceClass" : "PriceClass_All",

/* ViewerCertificate：AWS CloudFrontの配布のビューア証明書を指定します。*/

                   "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }

                }
            }
        }
    }
}



更に、公式サイトの内容を読み込んだ後、例を考えてみた。
=
AWS CloudFormationを使用してAmazon CloudFrontを設定するためのテンプレート例
--
S3バケットを作成し、そのS3バケットをCloudFrontディストリビューションのオリジンとして追加し、デフォルトのルートオブジェクトをindex.htmlに設定し、クエリ文字列を転送するように設定し、HTTPSにリダイレクトするように設定します。
~~~
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "MyBucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "my-bucket-name"
      }
    },
    "MyDistribution": {
      "Type": "AWS::CloudFront::Distribution",
      "Properties": {
        "DistributionConfig": {
          "Origins": [
            {
              "DomainName": {
                "Fn::Join": [
                  "",
                  [
                    {
                      "Ref": "MyBucket"
                    },
                    ".s3.amazonaws.com"
                  ]
                ]
              },
              "Id": "MyS3Origin",
              "S3OriginConfig": {}
            }
          ],
          "Enabled": true,
          "DefaultRootObject": "index.html",
          "DefaultCacheBehavior": {
            "ForwardedValues": {
              "QueryString": true
            },
            "TargetOriginId": "MyS3Origin",
            "ViewerProtocolPolicy": "redirect-to-https"
          },
          "ViewerCertificate": {
            "CloudFrontDefaultCertificate": true
          }
        }
      }
    }
  }
}
~~~
このテンプレートでは、AWS::S3::Bucketリソースを使用してS3バケットを作成し、AWS::CloudFront::Distributionリソースを使用してCloudFrontディストリビューションを作成しています。S3バケットをCloudFrontディストリビューションのオリジンとして追加するには、Originsプロパティを使用します。

DefaultRootObjectプロパティは、デフォルトのルートオブジェクトをindex.htmlに設定します。DefaultCacheBehaviorプロパティは、クエリ文字列を転送するように設定し、ViewerProtocolPolicyプロパティをredirect-to-httpsに設定して、HTTPSにリダイレクトするように設定します。

最後に、ViewerCertificateプロパティを使用して、CloudFrontが使用するSSL/TLS証明書を設定します。この例では、CloudFrontDefaultCertificateプロパティをtrueに設定して、CloudFrontがAWSが提供するデフォルトの証明書を使用するようにします。


AWS CloudFormationを使用してAPI Gatewayを設定するためのテンプレート例
--
API Gatewayにリソース、メソッド、およびLambdaバックエンドを追加しています。
~~~
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "ApiGatewayRestApi": {
      "Type": "AWS::ApiGateway::RestApi",
      "Properties": {
        "Name": "MyApiGateway"
      }
    },
    "ApiGatewayResource": {
      "Type": "AWS::ApiGateway::Resource",
      "Properties": {
        "RestApiId": { "Ref": "ApiGatewayRestApi" },
        "ParentId": { "Fn::GetAtt": ["ApiGatewayRestApi", "RootResourceId"] },
        "PathPart": "myresource"
      }
    },
    "ApiGatewayMethod": {
      "Type": "AWS::ApiGateway::Method",
      "Properties": {
        "RestApiId": { "Ref": "ApiGatewayRestApi" },
        "ResourceId": { "Ref": "ApiGatewayResource" },
        "HttpMethod": "GET",
        "AuthorizationType": "NONE",
        "Integration": {
          "IntegrationHttpMethod": "POST",
          "Type": "AWS_PROXY",
          "Uri": {
            "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations"
          }
        }
      }
    },
    "LambdaFunction": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Code": {
          "S3Bucket": "my-lambda-bucket",
          "S3Key": "my-lambda-code.zip"
        },
        "Handler": "index.handler",
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Runtime": "nodejs14.x"
      }
    },
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "lambda.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "Path": "/",
        "Policies": [
          {
            "PolicyName": "lambda-execution-policy",
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                  ],
                  "Resource": "arn:aws:logs:*:*:*"
                }
              ]
            }
          }
        ]
      }
    }
  }
}

~~~

"AWSTemplateFormatVersion": "2010-09-09" は、CloudFormationテンプレートのバージョンを定義しています。

 "Resources" は、テンプレートで定義されるAWSリソースのセクションです。このテンプレートでは、AWS API Gateway、AWS Lambda、およびIAMロールを定義しています。

 "ApiGatewayRestApi" リソースは、API Gateway REST APIを定義します。プロパティ "Name" によって、APIの名前を設定しています。

 "ApiGatewayResource" リソースは、API Gatewayのリソースを定義します。 "RestApiId" には、API Gateway REST APIのリソースIDが参照され、"ParentId" には、API GatewayのルートリソースIDが Fn::GetAtt関数で取得され、"PathPart" には、リソースのパスの一部を設定します。

  "ApiGatewayMethod" リソースは、API Gatewayメソッドを定義します。 "RestApiId" には、API Gateway REST APIのリソースIDが参照され、 "ResourceId" には、API GatewayリソースのIDが参照され、 "HttpMethod" には、HTTPメソッドが設定されます。"Integration" セクションでは、AWS Lambdaとの統合方法が定義されています。AWS_PROXY は、AWS LambdaにAPI Gatewayリクエストを転送する統合タイプです。"Uri"には、AWS Lambda関数のARNがサブストリング関数を使用して取得されています。

 "LambdaFunction" リソースは、AWS Lambda関数を定義します。 "Code" には、Lambda関数コードがS3バケットから取得される場所が指定されています。 "Handler" には、Lambda関数のエントリポイントが指定されています。 "Role" には、Lambda関数を実行するIAMロールのARNが参照されます。

 "LambdaExecutionRole" リソースは、Lambda関数を実行するためのIAMロールを定義しています。 "AssumeRolePolicyDocument" セクションで、ロールを引き受けることができるAWSサービスが定義されています。 "Policies" セクションでは、Lambda関数が使用するロググループとログストリームへのアクセスを許可するポリシーが定義されています。