0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS日記23 (CloudFront)

0
Last updated at Posted at 2021-01-31

はじめに

今回は AWS CloudFront を試します。
AWS サポートの記事を参考に、独自の CloudFront ディストリビューションで API Gateway を設定しました。

[Lambda関数・SAMテンプレート]
(https://github.com/tanaka-takurou/serverless-cloudfront-page-go)

準備

AWS SAM の準備をします

[AWS CloudFrontの資料]
AWS CloudFront

AWS SAM テンプレート作成

AWS SAM テンプレートで API-Gateway , Lambda, AWS CloudFront の設定をします。

[参考資料]
AWS SAM テンプレートを作成する

AWS CloudFront の設定は以下の部分

  CloudFrontCachePolicy:
    Type: AWS::CloudFront::CachePolicy
    Properties:
      CachePolicyConfig:
        DefaultTTL: 86400
        MaxTTL: 31536000
        MinTTL: 0
        Name: !Ref CloudFrontCachePolicyName
        ParametersInCacheKeyAndForwardedToOrigin:
          CookiesConfig:
            CookieBehavior: 'none'
          EnableAcceptEncodingBrotli: false
          EnableAcceptEncodingGzip: false
          HeadersConfig:
            HeaderBehavior: 'none'
          QueryStringsConfig:
            QueryStringBehavior: 'none'
  CloudFrontDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        DefaultCacheBehavior:
          CachePolicyId: !Ref CloudFrontCachePolicy
          TargetOriginId: !Ref DistributionOriginId
          ViewerProtocolPolicy: 'redirect-to-https'
        Enabled: true
        Origins:
          - Id: !Ref DistributionOriginId
            DomainName: !Join [ '', [ !Ref FrontPageApi, '.execute-api.',!Ref 'AWS::Region','.amazonaws.com'] ]
            OriginPath: !Join [ '', [ '/',!Ref FrontPageApiStageName] ]
            CustomOriginConfig:
              OriginProtocolPolicy: 'https-only'
              OriginKeepaliveTimeout: 5
              OriginReadTimeout: 30

Lambda関数作成

※ Lambda関数は aws-lambda-go を利用しました。
AWS CloudFront の操作は aws-sdk-go-v2/service/cloudfront を利用しました。

Distribution の一覧を取得するには ListDistributions を使う

func getDistribution(ctx context.Context)(string, error) {
	if cloudfrontClient == nil {
		cloudfrontClient = cloudfront.NewFromConfig(getConfig(ctx))
	}
	input := &cloudfront.ListDistributionsInput{}

	result, err := cloudfrontClient.ListDistributions(ctx, input)
	if err != nil {
		log.Print(err)
		return "", err
	}

	distributionSummaries := result.DistributionList.Items
	if len(distributionSummaries) < 1 {
		return "", errors.New("No DistributionSummary")
	}
	originsString := ""
	for _, v := range distributionSummaries[0].Origins.Items {
		originsString = originsString + aws.ToString(v.DomainName) + ","
	}
	originsString = originsString[:len(originsString) - 1]
	resultJson, err := json.Marshal(DistributionSummaryData{
		DomainName: aws.ToString(distributionSummaries[0].DomainName),
		Origins: originsString,
		Status: aws.ToString(distributionSummaries[0].Status),
	})
	if err != nil {
		log.Print(err)
		return "", err
	}
	return string(resultJson), nil
}

注意点

  • 東京リージョンの設定で進めたところ、CloudFront ディストリビューションを作成時にエラーが発生したため、米国東部 (バージニア北部) リージョンに変更しました。
    AWS サポートの参考記事

  • AWS::CloudFront::Distribution の LambdaFunctionAssociations を設定して進めたところ、Go言語はサポートしていない旨のエラーが発生したため、設定を消しました。

終わりに

独自の CloudFront ディストリビューションで API Gateway を設定しました。
API Gateway でエッジ最適化された API エンドポイント よりも詳細に制御できます。

参考資料
[カスタム CloudFront ディストリビューションで API Gateway をセットアップする](https://aws.amazon.com/jp/premiumsupport/knowledge-center/api-gateway-cloudfront-distribution/)

CloudFormationでAPI Gateway+LambdaなAPIを作成する

AWS::CloudFront::Distribution

AWS::CloudFront::CachePolicy

cloudfront · pkg.go.dev

ファイルの無効化

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?