[AWS CloudFront] 入門

CloudFrontでVPCを作成する

01_create_vpc.yaml

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  FirstVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16

CloudFrontでCreate Stackとします。

作成したyamlファイルをuploadします。

Option等は設定せずに、create stackとします。
すると、cloudFormationで作成されたVPCが出来上がっています。
なお、cloudformationのstackを削除すると、vpcも削除されます。

CloudFormationの項目
– Format Version
– Description
– Metadata
– Parameters
– Mappings
– Resources
– Outputs

Resources部分

Resources:
	<Logical ID>:
		Type: <Resource type>
		Properties:
			<Set of properties...>

Logical IDはテンプレート内で一意のID
Resource typeは作成するリソースのタイプ
Resource propertiesはリソースの作成時に指定するプロパティ

リソースに命名する時

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  FirstVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Name
        Value: first-VPC

stackをupdate

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  FirstVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Name
        Value: first-VPC
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Name
        Value: FirstVPC-IGW
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref FirstVPC
      InternetGatewayId: !Ref InternetGateway
  FrontendRouteTable:
    Type: AWS::EC2::RouteTable
    DependsOn: AttachGateway
    Properties:
      VpcId: !Ref FirstVPC
      Tags:
      - Key: Name
        Value: FirstVPC-FrontendRoute
  FrontendRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref FrontendRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  FrontendSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: AttachGateway
    Properties:
      CidrBlock: 10.0.1.0/24
      MapPulicIpOnLaunch: 'true'
      VpcId: !Ref FirstVPC
      Tags:
      - Key: Name
        Value: FirstVPC-FrontendSubnet
  FrontendSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref FrontendSubnet
      RouteTableId: !Ref FrontendRouteTable

[AWS CloudFront] 基礎

CloudFrontとはプログラミング言語やテキストファイルを使用してAWSリソースを自動で構築するサービス
具体的には、リソースの設定、プロビジョニングをコード化したテンプレートを作成できる
Infrastructure as code
EC2やELBといったAWSリソースの環境構築を設定ファイルを元に自動化できる
テンプレートに基づき、各リソースが起動

### cloudFormationのメリット
一度テンプレートを作成すれば、同じ構成を再現できる
ベストプラクティスが盛り込まれたテンプレートが使える
起動時にパラメータを渡せる
利用料金は無料

### cloudformationの使い方
– AWSマネジメントコンソールにあるAWS CloudFormation Designerを使う方法
– AWSマネジメントコンソールからJSON/YAML形式でテキストファイルでテンプレート作成する方法

JSON/YAML -> Framework -> AWSサービスの設定

テンプレートとはJSON形式、YAML形式で作成する
テンプレートはリージョンごとに条件が異なる
プロビジョニングされるリソースの集合をスタックと呼ぶ
スタック単位でリソース管理が可能 スタック破棄を実行すると、リソースを破棄することが可能
(1)クイックスタート、(2)サンプルコード&テンプレート、(3)独自テンプレート作成 などがある
クイックスタートはベストプラクティス
テンプレートは色々ある e.g.サーバレスアプリケーションモデルなど
リソース間の依存関係はCloudFormationが自動判別する

### Resourceとは
EC2、ELB、RDSなど起動するサービスを指定
### Parametersとは
スタック構築時に値を定義できる
Type, Default, NoEcho, AllowValues, AllowdPattern, MaxLength, MinLength, MaxValue, MinValue, MinValue, Description, ConstraintDescription
パラメータの値はテンプレートの中で”ref”により参照
### Function
パラメータの参照やMapの山椒はFunctionを利用する
### 擬似パラメータ(Pseudo Parameter) ※予め定義
– AWS::Region
– AWS::StackId
– AWS::StackName
– AWS::AccountId
– AWS::NotificationARNs
– AWS::NoValue
### Mapping
キーと値のマッピングテーブルを管理できる
Functionの”Find::InMap”を使って値を取得
### Condition
条件名と成立条件を列挙
### Outputs
スタック構築後に取得・表示したい情報の定義

テンプレート作成ツールにCloudFormerがある
CloudFormation Designer

テンプレートとスタックの設計

### デメリット
部分的な修正でもテンプレートを修正しなければならない
-> コンソールで修正した方が操作は楽

運用者にcloudformationの知識が求めらる
部分的な修正でもテンプレートを修正しなければならない為、新規に機能追加などがあるサービスの運用としてはややハードルが高いか
EOLが決まっているサービス、ほぼ改修がないようなサービスで、インフラ構成を変えない場合はcloudformationで導入するのもありか

[AWS] cloudfrontとS3で静的サイトを構築する

1. ドメイン取得
2. Certified Managerでrequest(リージョンをus-east-1で取得する)
      ※regionがTokyoだとCloudfrontでCertified Managerの設定ができない
3. ドメイン管理画面のDNS設定でAWS Certified Managerで取得したCNAMEを設定する
4. S3にbucketを作成し、HTML, JS, img, cssファイルなどを保存
5. CloudFrontでcreate distribution
 L origin domainにS3を設定
 L Alternate domain name (CNAME) にドメインを指定

cloudfrontでルーティングも実装できるのね。

[AWS CloudFront] 使ってみる

ユーザへの配信を行うサーバを「エッジサーバ」といい、CloudFrontドメイン(*.cloudfront.net)のようなCloudFrontドメインへアクセスさせることにより、CloudFrontのエッジサーバを経由した配信が行える。

ユーザがCloudFrontにアクセスすると、最寄りのエッジサーバIPが返される。このIPにアクセスして、高速な配信が受けられる。

# CloudFrontの使い方
### ディストリビューション作成
Create Distribution

origin-domain-pathは適当に、s3の laravel8-test.s3.amazonaws.com にします。

その他の項目はデフォルトのまま。項目だけ一応見ておく。
– Origin Settings
Enable Origin Shield, Origin ID, Restrict Bucket Access, Origin Connection Attempts, Origin Connection Timeout, Origin Custom Headers
– Default Cache Behavior Settings
Path Pattern, Viewer Protocol Policy, Allowed HTTP Methods, Field-level Encryption Config, Cached HTTP Methods, Cache and origin request settings, Cache Policy, Origin Request Policy, Smooth Streaming, Restrict Viewer Access, Compress Objects Automatically, Lambda Function Associations, Enable Real-time Logs
– Distribution Settings
Price Class, AWS WAF Web ACL, Alternate Domain Names(CNAMEs), SSL Certificate, Supported HTTP Versions, Default Root Object, Standard Logging, S3 Bucket for Logs, Log Prefix, Cookie Logging, Enable IPv6, Comment, Distribution State

ファイルパスを叩く
d2*.cloudfront.net/hoge.jpg
-> S3と同じ画像が表示される。

sugeeeeeeeeee
画像はキャッシュされる
-> 更新のない画像で、海外からのアクセスが多い場合に高速化を発揮する
-> 逆に、更新が多い場合は、キャッシュした画像は更新されない

なるほど、根本的な使い方を勘違いしてたかも

古いCloudFront APIバージョンの廃止

古いCloudFront APIバージョンの廃止があるらしい。

Full list of versions to be deprecated on June 6, 2019:
2008-06-30, 2009-04-02, 2009-09-09, 2009-12-01, 2010-03-01, 2010-05-01, 2010-06-01, 2010-07-15, 2010-08-01,  2010-11-01, 2012-03-15, 2012-05-05,  2012-07-01, 2013-05-12, 2013-08-26, 2013-09-27, 2013-11-11, 2013-11-22, 2014-01-31, 2014-05-31, 2014-08-31, 2014-10-21,  2014-11-06, 2015-04-17, 2015-07-27, 2015-09-17, 2015-12-22

For more information regarding this deprecation and the actions you should take, refer to our Developer Forum post here:
https://forums.aws.amazon.com/ann.jspa?annID=6697

で、CloudFrontを使っているから、って調べていたんだが、CloudFrontとCloudFront APIは違うんだね。すげー勘違いしていた。。。CloudFront APIは、その名の通り、CloudFrontにAPI接続する仕様。

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.316.0.min.js"></script>
<script>
var config = new AWS.Config({
	accessKeyId : xxxxxxxxxxxxxxx,
	secretAccessKey : xxxxxxxxxxxxxxx,
	region : xxxxxxxxxxxx
});
cloudfront = new AWS.CloudFront(config)
</script>

うーん、なんだかなー

AWS cloudfrontによるアクセスログの解析

AWS cloudfrontによるアクセスログの解析をしたい

まずS3にバケットを作成します
バケット名は適当にaccess-logdataとします。

続いてcloudfrontを開きます

あれ、なんか英語だ。。 

Select a delivery method for your content
Create a web distribution if you want to:なのでWebを選択

Create Distribution
– origin domain name, origin path?
 

なんだこれは。。
viewer protocol policy, allowed http methodなど細かく設定できるようです。
すげーなこれは。

Amazon CloudFrontとは?

AWS CoudFrontは、CDNサービス
DDos軽減のため、Shield, S3のオリジンとしてELB、edgeなどと連携

DDos攻撃とは、複数のコンピュータから標的のサーバに、ネットワークを介した大量の処理要求を送ることでサービスを停止させてしまう攻撃。

— フラッド型
プロトコルを攻略して大量データを送り付けることで、攻撃対象が処理できない状態に持ち込む

— 脆弱性型
サーバやアプリケーションの脆弱性を利用して不正処理を行わせる

F5アタック:httpリクエストはキャッシュを保存せずに情報をリクエストできる

CloudFrontの料金

CloudFrontの料金を見てみましょう。
cloudfront

ページ中段のオンデマンド料金(GB単位)
10TBまで 0.110USD
10TB-50TB 0.105
50-150TB 0.090
150-500TB 0.08
500TB-1024TB 0.060
1PB-5PB 0.050
5TB超 0.04
ん? GB単位ってことは、3GBで3.4USDくらい!? なんかCDNにしては高いような気がする。

HTTPメソッドのリクエスト料金 1万件あたり0.060USD
100万リクエストで6ドル? 100万リクエストなんて、直ぐに行くでしょうから、これもそこそこ高いような。。

専用IPカスタムSSL 毎月600ドル
SSL証明書だと、ものによるが、1年で数万もかからないのに、謎に高いな。
CRSなんて簡単につくれるのに、いやーなビジネスのにおいがしますね。

オリジンサーバーからCloudFrontへオリジンフェッチ
エッジロケーションへのデータ転送が無料? 

Webソケットは無料
インターネットでは、TCP/IPと呼ぶ通信プロトコルを使用するが、そのTCP/IPを利用するには特別な出入り口が必要なる。その出入口がソケット
電話番号や郵便のようなイメージ

ソケット通信を使用すると、HTTPよりも下を使用することができる。
なんか、Cloudfrontとは別の話になってしまいましたね。