20190521のAWSに関する記事は14件です。

AWS認定Big Data勉強記 - 8: Amazon Kinesis

こんにちは、えいりんぐーです

今回は Amazon Kinesis についてまとめます。

一口に Kinesis といっても、 Data Streams, Data Firehose, Data Analytics など特性の異なるサービスがあるのでそれぞれ別記事にしたいと思います。
ひとまずここでは、それぞれの概要と参考記事を集めます。

参考資料

Amazon Kinesis Data Streams

Q: Amazon Kinesis Data Streams とは何ですか?

Amazon Kinesis Data Streams を使用すると、特定のニーズに合わせてストリーミングデータを処理、分析するカスタムアプリケーションを構築できます。クリックストリーム、アプリケーションログ、ソーシャルメディアなどのさまざまなタイプのデータを何十万ものソースから Amazon Kinesis データストリームに連続して追加できます。ほんの数秒後には、Amazon Kinesis アプリケーションで、ストリームからデータを読み取って処理できます。

概要
  • データ種類や処理に応じてストリームを作成。
    • ストリームには1つ以上のシャード。
    • 保存されるデータをデータレコードと呼ぶ。
      • 1データレコードのサイズは1MBまで
    • 保存期間はデフォルトの24時間から7日
    • 送信側キャパシティは秒あたりシャードあたり1MBまたは1,000PUT
    • 処理側キャパシティは秒あたりシャードあたり2MBまたは5回のリードトランザクション
  • パーティションキーでシャードへ分散。
    • レコードにはシーケンス番号をアサインする。
    • シーケンス番号でアクセスできる。
  • Kinesis Agent
    • Kinesisにデータを送るOSSのJavaアプリ。
      • モニタするファイルパターンや送信先を指定できる。
      • ファイルのローテート処理や失敗時の再試行を管理できる。
      • フォーマット変換やログパースなどの前処理も提供。
      • Streams と Firehose への送信が可能
  • KPL
    • Kinesisにデータを送るOSS。
      • 複数のデータを1レコードにするAggregationや複数レコードをバッファリングするCollectionが可能。Fluent pluginもある
  • KDG
    • テストデータを送信できる。HTML/JavaScriptのOSS。
  • KCL
    • EC2インスタンスなどにデプロイして利用。
    • Record Processor Factory, Record Processor (シャードから取り出したデータを処理するプロセッサの単位), Worker (個々のアプリケーションインスタンスとマッピングする処理単位)といったコンポーネントからなる。

Amazon Kinesis Data Firehose

ストリームデータをS3, Redshift, ESへ配信する。簡単。バッチ処理・圧縮・暗号化が行える。

Q: Amazon Kinesis Data Firehose とは何ですか?

Amazon Kinesis Data Firehose は、ストリーミングデータをデータストアや分析ツールにロードする最も簡単な方法です。ストリーミングデータをキャプチャして変換し、Amazon S3、Amazon Redshift、Amazon Elasticsearch Service、Splunk にロードして、現在お使いのビジネスインテリジェンスツールやダッシュボードでほぼリアルタイムに分析できます。フルマネージドサービスのため、データスループットに応じて自動的にスケールされ、継続的な管理は不要です。ロード前にデータのバッチ処理、圧縮処理、暗号化が行われるため、送信先でのストレージ量を最小化し、セキュリティを強化できます。

概要
  • 送信側からはエンドポイントで接続する。
  • 配信先に応じて配信ストリームを作成する。
  • シャード作成やパーティションキーの指定は不要。
  • データレコードの最大サイズは1MB。
  • オートスケールする。
  • StreamsからFirehoseに直接データを送れる。

Amazon Kinesis Data Analytics

Q: Amazon Kinesis Data Analytics とは何ですか?

Amazon Kinesis Data Analytics は、ストリーミングデータの分析、実用的なインサイトの取得、ビジネスやお客様のニーズへのリアルタイムでの対応を最も簡単に行えるサービスです。Amazon Kinesis Data Analytics を利用すると、ストリーミングアプリケーションを構築し、管理し、AWS のサービスと統合する作業がシンプルになります。一般的な処理関数のための組み込みのテンプレートや演算子を利用し、SQL クエリと高度な Java アプリケーションを簡単に構築し、あらゆる規模のデータを整理、変換、集計、分析できます。

概要
  • 分析単位でアプリケーションを作成する。
    • 入出力のストリーミングソース・デスティネーションを設定。
  • クエリの前処理としてLambdaを設定可能。
    • Lambdaはデータレコードの補完や返還に利用できる。
      • Ok: 前処理成功。
      • Dropped: 意図的なレコードの排除。
      • ProcessingFailed: 前処理失敗。エラーストリームへ流れる。
  • SQLを記述。
  • 1行の最大サイズは50KB。
  • 参照ソースの最大サイズは1GB
    • 外部参照テーブルとはジョインしたり、データレコードの補完に利用したりできる。
  • ウィンドウで問い合わせができる。
    • タンブリングとスライディング。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Cloud9でLaravelの開発環境構築

はじめに

AWS Cloud9でLaravelの開発環境を構築する手順です。

Cloud9の起動

ブラウザでCloud9を起動します。

コンソールの表示

コンソールが表示されていない場合は、F6キーを押下してコンソールを表示します。

コンソールとは、以下のような「bash」とタブに表示されている場所です。

キャプチャ.PNG

コンソールでは、コマンドでサーバーを操作することが出来ます。

コマンドの実行方法

コマンドの実行方法がわからない場合は、以下の動画を参考にしてください。

https://youtu.be/saAc-cO9AuU

PHP7.3のインストール

2019/05/19時点では、EC2のAmazon LinuxにインストールされているPHPのバージョンは5.6.40であるため、PHP7.3にアップデートします。

以下のコマンドを実行します。

sudo amazon-linux-extras install php7.3

以下の表示となったら、「y」を入力し、Enterキーを押下します。

キャプチャ.PNG

以下のように表示されれば完了。

キャプチャ.PNG

composerのインストール

composerは、PHPのパッケージ管理ツールです。
パッケージ管理ツールがあれば、便利なライブラリを簡単に自分のWebサイトに反映することが出来ます。

以下のコマンドを実行します。

curl -sS https://getcomposer.org/installer | php

以下のように表示されるまで待ちます。

キャプチャ.PNG

以下のコマンドを実行します。

sudo mv composer.phar /usr/local/bin/composer

実行は一瞬で完了して、以下のような表示になります。

キャプチャ.PNG

以下のコマンドを実行します。

composer

以下のように表示されれば、composerのインストールは完了です。

キャプチャ.PNG

必要なライブラリののインストール

以下のコマンドを実行します。

sudo yum install php php-mbstring php-pdo php-gd php-xml

以下の表示となったら、「y」を入力し、Enterキーを押下します。

キャプチャ.PNG

以下の表示になったらインストールは完了です。

キャプチャ.PNG

laravelのプロジェクトの作成

以下のコマンドを実行します。(「myproject」の部分は好みの名前に変更してください。)

composer create-project --prefer-dist laravel/laravel myproject "5.5.*"

以下のように表示されればlaravelのプロジェクトが完成です。

キャプチャ.PNG

以下のコマンドでプロジェクトのカレントディレクトリに移動します。(「myproject」は、laravelプロジェクト作成時に指定した名前に変えてください。)

cd myproject

以下のコマンドを実行します。

php artisan key:generate

以下のように表示されれば成功です。

キャプチャ.PNG

Webサーバーの起動

以下のコマンドを実行します。

php artisan serve --port=8080

以下のように表示されればWebサーバーの起動に成功

キャプチャ.PNG

Cloud9の右上の「Preview」をクリックして、Preview Running Applicationをクリックする。

キャプチャ.PNG

Cloud9内部にブラウザが起動し、Laravelの画面が表示される。

キャプチャ.PNG

参考

https://laraweb.net/environment/3953/
https://dev.classmethod.jp/cloud/aws/my_first_aws_han/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2についてまとめる(EC2内の設定のみ)

1.1. やろうとしていること

EC2ではlambdaからきたpostを受取り、推論サーバーに渡して推論を行った後結果を返す。

EC2内の動きで必要になるポイントは、
1. サーバーを立ち上げた後自動的にアプリケーションが実行されてほしい
2. 簡単に環境を整えたい

の2つである。これに対して私は、
1. Systemdを用いてサーバ起動時の動作を設定する。
2. Dockerを用いて環境を設定する。

1.2. サービスの説明

1. Systemdについて[1]

Systemd : Linuxの起動処理やシステム管理を行う仕組み

Systemdファイルの基本構成要素は Unit, Service, Install の3つ。
Unit, Install にユニットファイルの共通的な設定内容を書き、Service で自ユニットファイルの実行内容の設定を行う。

ファイルの書き方について

Unit
  • Description : ユニットの説明を書く
  • After/Before : 指定したユニットの実行順番の依存関係を設定
  • Requires/Wants : ユニットの依存関係の定義
    2つのコマンドの違いは、依存関係のユニットが失敗したときの処理
    • Wantsの場合、依存ユニットが失敗したときでも自ユニットは失敗にならない。
Service
  • Type : 5種類存在する。デフォルトはsimple
    • simple
    • forking
    • oneshot
    • notify
    • dbus
  • ExecStart : 実行するコマンドラインを書く
Install
  • WantedBy/RequiredBy : ”systemctl enable ~~" でユニットをenableしたときに、.wants, .requires にシンボリックリンクを作る。 動作としては"Wants=", "Requires="と同じような感じになる。

2. Dockerについて

Docker : Linuxのコンテナ機能を使ったアプリケーションの実行環境を構築/運用するためのプラットフォーム[2]

今回は、pythonをベースに
1. WebフレームワークであるBottleでpostに対するレスポンスを設定した。
2. DLフレームワークであるchainerで推論部分の動作を作成した。

そしてこれをdockerにいれて動作するような環境を作成した。

1.3. サービスの設定方法

1. Systemd

コード
dl_app.service
[Unit]
Description=start_dl_app
Requires=docker.service
After=docker.service

[Service]
Type=simple
ExecStartPre=-/usr/bin/docker container rm dl_app
ExecStart=-/usr/bin/docker container run -i -v /home/ec2-user/document/server:/myvol -p 8080:8080 --name dl_app dl_app
[Install]
WantedBy=multi-user.target
  1. Systemdファイル作成
  2. /etc/systemd/system/の下にファイルを置く
  3. SystemdファイルがServiceとして認識されたか確認する systemctl list-unit-files --type=serviceの出力に現れれば正しく認識されているということ。
  4. enableして起動する systemctl enable ~~で認識され、systemctl start ~~で起動。

2. Docker

コード
Dockerfile
FROM python:3

RUN pip install bottle chainer matplotlib pillow

WORKDIR /myvol
CMD python index.py

dockerコンテナ内に入り、コマンドを入力
+ docker image build -t dl_app ./ Dockerfile
+ docker container run -it -p 8080:8080 -v [マウントするパス]:./myvol --name dl_app dl_app

(注意)EC2サーバーの設定[3][4]

まず、dockerをinstallする必要あり
また、各ファイルをEC2内に入れるためにS3とマウントする。
最後にマウントしてあるディレクトリから推論サーバー作成に必要なファイルを移して終了

参考サイト

[1] systemdの*.serviceファイルの書き方
[2] いまさらDockerに入門したので分かりやすくまとめます
[3]EC2インスタンスにS3をマウントする
[4]s3fs を使って EC2 に S3 の Bucket をマウントする

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

APIGatewayとLambdaについてまとめる

API GatewayとAWS Lambda

はじめに

基本的な設定方法は以下のサイトを参考にしてください。
【API Gateway】AWS Lambda統合のPythonでHello, world

1.1. やろうとしていること

このパートでは、クライアントからの要求をAPI gatewayを通してLambdaで処理して何らかの反応を返すというもの

1.2. サービスの説明

1. API gatewayについて[1]

API gateway : APIの作成と管理が簡単にできるサービス

◯APIの作成:AWS Lambda、EC2、もしくはAWS外でパブリックとして公開されているアプリケーションをAPIとして公開することができます。

◯APIの管理:Amazon API Gatewayは、APIの管理に必要な以下のような事項をお客様側での実施が必要なく、AWS側で提供しています。

2. AWS Lambdaについて[2]

Lambda : AWSに関するなにかしらのイベントによって処理を実行する環境

関数として処理を定義する。

3. bottleについて

bottle : Pythonで一番軽量なWEBフレームワーク

lambda関数内の処理や、htmlの"form"から送られたpostの処理に利用する。特に考えるのはrequestオブジェクト。

各サブクラスについて

BaseRequestが親クラスとなって様々なサブクラスが作成される。
1. query
2. forms
3. files
4. params
5. json

特に送信データが写真のときはmultipart/form-dataになる。その場合用いるのは"files"クラス

filesクラス

メソッド
+ .get("KEY") : KEYに対応するVALUEのオブジェクトが取得できる
+ .filename : ファイル名が取得できる
+ .name : html内の"form"のnameが取得できる
+ .file : fileObject(BytesIO buffer or temporary file)を開くことができる

1.3. サービスの設定方法

1. API gatewayの設定

  1. RESTfum APIの設定

    - メソッドの設定

    /(GET)
     ┗/check(POST)
    

    api_gateway_1_2.jpg

  2. 「Lambdaプロキシ統合の使用」にチェック
    • これによってレスポンスの種類ごとにテンプレートを変更しなくて済む api_gateway_2_2.jpg
  3. 「メソッドレスポンス」の設定変更
    • 「200のレスポンス本文」を”text/html”に変更 →htmlファイルを表示させるため api_gateway_4_2.jpg
  4. それぞれのメソッドのテスト

2. Lambdaの設定

手順

  1. 利用するファイルをまとめて圧縮
  2. AWS Lambdaの設定

1. 利用するファイルをまとめて圧縮

今回使用したファイル集
・sample/
├ bottle.py      # webフレームワーク
├ text_test.py    # text送信の場合
├ photo_test.py   # 画像送信の場合
└ views/      # htmlファイル
  ├ text_login.html
  ├ text_check.html
  └ photo_login.html
各コードサンプル
1. テキストを送信する場合
text_test.py
text_test.py
# coding:utf-8
from bottle import template
import urllib


# htmlファイルを返す関数
def login(event, context):
    return {
        "statusCode": 200,
        "headers": {"Content-Type": "text/html"},
        "body": template('text_login')
    }

# postされた情報を加えたhtmlファイルを返す関数
def check(event, context):
    body = event['body']
    # application/x-www-form-urlencordedから適切な形に変換する
    body2 = urllib.parse.parse_qs(body)

    username = body2['username'][0]
    email = body2['email'][0]

    return {
            "statusCode": 200,
            "headers": {"Content-Type": "text/html"},
            "body": template('text_check', username=username, email=email)
    }
text_login.html
text_login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>メールアドレスと名前を送信してください</h1>
        <form method="post" enctype="application/x-www-form-urlencoded" action="/check">
            <input placeholder="名前" name="username" type="text"/>
            <input placeholder="メール" name="email" type="text"/>
            <input value="送信" type="submit"/>
        </form>
</body>
</html>
text_check.html
text_check.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>確認</h1>
        <h2>名前</h2>
            <p>{{ username }}</p>
        <h2>メールアドレス</h2>
            <p>{{ email }}</p>
</body>
</html>
2. 画像を送信する場合
photo_test.py
photo_test.py
# coding:utf-8
from bottle import template


# htmlファイルを返す関数
def show_page(event, context):
    return {
        "statusCode": 200,
        "headers": {"Content-Type": "text/html"},
        "body": template('photo_login')
    }


# postされた画像の生データを表示
def check(event, context):
    photo_data = event['body']
    return {
            "statusCode": 200,
            "headers": {"Content-Type": "application/json"},
            "body": {"message": photo_data}
    }
photo_login.html
photi_login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PhotoTest</title>
</head>
<body>
<h1>Test</h1>
<h2>画像を挿入してください</h2>
<form method="post" enctype="multipart/form-data" action="/photo">
    <input placeholder="画像" name="photo" type="file" />
    <input placeholder="送信" type="submit" />
</form>
</body>
</html>
  • 注意:htmlファイルのformタグの”action”はAPI gatewayでの「APIのデプロイ」が完了してから追加記入すること。宛先が異なると正しく動作しない。

2. AWS Lambdaの設定

  1. 使うファイルをzipで圧縮
  2. AWS Lambdaサイト内の「関数の作成」にて関数を設定後、zipファイルを転送 lambda_1_2.jpg
  3. AWS Lambda関数のトリガー作成
    • 今回はAPI gatewayをトリガーとする。各種設定を行い、二つの機能を接続する
  4. サイト内の「テスト」にて正常に動くか試す。

1.4. 注意すべき部分

IAMロールについて

AWSのサービス(API gateway, Lambdaなど)を利用する際、権限を設定する必要がある。

一般には標準的なもので間に合うが、S3を用いたりEC2と通信したい場合は適切なIAMロールに変更する必要がある。

proxyと本文マッピングテンプレートについて

API gatewayではレスポンスの形を適切に変更することが可能である。主に2つの整形方法がある。
1. プロキシ統合
2. マッピングテンプレートの利用

今回は1.のプロキシ統合を用いた。これにより、レスポンスの形が統一されるためLambdaで処理する方法が統一されるからである。
ただ、2.であればレスポンスを適切な形に整形してLambdaに送れるため処理が用意になるというメリットもある。[3]

以下はformでpostしたデータを整形するためのマッピングテンプレートである。[4]

"queryParameters" : {
#set( $tmpstr = $input.body )
#foreach( $keyandvaluestr in $tmpstr.split( '&' ) )
#set( $keyandvaluearray = $keyandvaluestr.split( '=' ) )
        "$keyandvaluearray[0]" : "$keyandvaluearray[1]"#if( $foreach.hasNext ),#end
#end
}

参考サイト

[1] 5分でわかるAmazon API Gateway

[2] AWS Lambda超入門

[3] API Gatewayの本文マッピングテンプレートを理解する

[4] API Gateway + Lambda にFormからPOSTする時のマッピングテンプレートを作成しました

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Route53の加重ルーティング機能で、あるALBへのトラフィックを段階的に別のALBに切り替える

やりたいこと

  • あるALBへのトラフィックを別のALBに切り替える
  • 一気に切り替えるのではなく、段階的に切り替える
  • aws Management Consoleでの操作はせずに、CloudFormationでの操作のみ

最初の状態

スクリーンショット 2019-05-21 14.09.40.png

Resources:
  Route53HostedZoneNakedDomain:
    Type: "AWS::Route53::HostedZone"
    Properties:
      Name: !Ref NakedDomain

  ElasticLoadBalancingV2LoadBalancerOld:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: old-alb
      Scheme: 'internet-facing'
      Subnets:
        - !Ref DummySubnetId1
        - !Ref DummySubnetId2

  ElasticLoadBalancingV2LoadBalancerNew:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: new-alb
      Scheme: 'internet-facing'
      Subnets:
        - !Ref DummySubnetId1
        - !Ref DummySubnetId2

  Route53RecordSetTest:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.CanonicalHostedZoneID
      Type: A

ALBが2つ(old, new)あり、DNSの名前解決の結果はすべてold側のALBになっています。

なお、これ以降の説明では Route53HostedZoneNakedDomainElasticLoadBalancingV2LoadBalancerOldElasticLoadBalancingV2LoadBalancerNew が変化することはありませんので、CloudFormationテンプレートからは省略します。

旧ALBのALIASレコードにWeightとSetIdentifierを追加

スクリーンショット 2019-05-21 14.13.20.png

  Route53RecordSetTest:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.CanonicalHostedZoneID
      Type: A
      Weight: 100 # 追加
      SetIdentifier: alb-old # 追加

旧ALBのALIASレコードにWeightとSetIdentifierを追加することによって、ALIASレコードを加重ALIASレコードに変化させます。
この時点ではまだRoute53へのAレコードの問い合わせ結果に変化はありません。

Weight=0で新ALBのレコードを追加

スクリーンショット 2019-05-21 14.13.57.png

  Route53RecordSetTest:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.CanonicalHostedZoneID
      Type: A
      Weight: 100
      SetIdentifier: alb-old

  Route53RecordSetTest2: # 追加
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.CanonicalHostedZoneID
      Type: A
      Weight: 0
      SetIdentifier: alb-new

Weightを0にした状態で新ALBのALIASレコードを追加します。
この時点でもまだRoute53の問い合わせ結果に変化はなく、すべてのAレコード問い合わせに対して旧ALBのIPアドレスを返します。

新ALBのALIASレコードのWeight増加 & 旧ALBのALIASレコードのWeight減少

スクリーンショット 2019-05-21 14.14.04.png

  Route53RecordSetTest:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.CanonicalHostedZoneID
      Type: A
      Weight: 100 # 変化
      SetIdentifier: alb-old

  Route53RecordSetTest2:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.CanonicalHostedZoneID
      Type: A
      Weight: 100 # 変化
      SetIdentifier: alb-new

新ALBと旧ALBのWeightを変化させることによって、Route53が新ALBのIPアドレスを返るようになります。
新旧どちらの結果がRoute53から返されるのかは確率的に決まり、それらの確率の比はweightパラメータで制御されます。
それぞれのWeightの比を徐々に変化させることによってトラフィックを徐々に新ALBに流すことができます。
以下のコマンドを実行することによって、実際のDNS問い合わせの結果の比率を確認することができます。

sort <(for i in {1..1000} ; do dig @権威DNS +norec +short A 調べたいドメイン ; done) | uniq -c | sort -rn -k1

なお、この時に問い合わせ結果に加重がつくのはRoute53の権威DNSサーバーとキャッシュDNSサーバーの間の問い合わせのみであり、キャッシュDNSサーバーとスタブリゾルバーの間の問い合わせ結果には加重が付きません。

旧ALBのALIASレコードのWeightをゼロにする

スクリーンショット 2019-05-21 14.14.12.png

  Route53RecordSetTest:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerOld.CanonicalHostedZoneID
      Type: A
      Weight: 0 # 変化
      SetIdentifier: alb-old

  Route53RecordSetTest2:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.CanonicalHostedZoneID
      Type: A
      Weight: 100 # 変化
      SetIdentifier: alb-new

新ALBへのトラフィックを徐々に増やしながら旧ALBのトラフィックを徐々に減らすということを進めると、最終的には旧ALBのweightがゼロになります。
この時点で旧ALBへのトラフィックがゼロになる気もしますが、実際にはキャッシュDNSサーバー内のキャッシュが無効化されるまで待つ必要があります。
ALIASレコードのTTLは60secなので、最大で60秒程度の待ち時間があります。

ここまでの手順でトラフィックの切り替えはなされたので、後は中途半端になってしまったリソース達のお掃除です。

旧ALBのALIASレコードの削除

スクリーンショット 2019-05-21 14.14.20.png

# Route53RecordSetTest: ← 削除

  Route53RecordSetTest2:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.CanonicalHostedZoneID
      Type: A
      Weight: 100
      SetIdentifier: alb-new

weight=0になっている旧ALBのALIASレコードは不要なので、CloudFormationのリソースを削除します。

新ALBのALIASレコードのWeightとSetIdentifierを削除

スクリーンショット 2019-05-21 14.14.48.png

  Route53RecordSetTest2:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref Route53HostedZoneNakedDomain
      Name: !Ref NakedDomain
      AliasTarget:
        DNSName: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.DNSName
        HostedZoneId: !GetAtt ElasticLoadBalancingV2LoadBalancerNew.CanonicalHostedZoneID
      Type: A
#     Weight: 100 削除
#     SetIdentifier: alb-new 削除

新ALBのALIASレコードのWeightとSetIdentifierは不要になったので削除します。

まとめ

Route53の加重ルーティング機能を使うことでALBの切り替えを行うことができました。
ドキュメントには通常のALIASレコードを加重ALIASレコードに変化させる方法や、その逆の方法に関する説明があまりなかったので、実際に試してみました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SigV4対応】AWS CLI アップグレード方法

こんにちは。streampackのtsuchiです。

はじめに

AWS S3署名バージョン2が廃止される予定です。
そこで実際に行った対応について、簡単に残しておきます。

具体的にいうと、あるEC2インスタンス内で利用している
AWS CLIのバージョンが古かったため、最新版にアップグレードしました。

どんな対応が必要?

まず、AWSドキュメントを読んでみます。

Amazon S3 の AWS 署名バージョン 2 がオフ (廃止)

このうち、AWS CLIに限った部分を抜粋します。

この SDK または製品を使用する場合 この SDK バージョンにアップグレード Sigv4 を使用するために、クライアントでコード変更が必要ですか。
AWS CLI 1.11.108 にアップグレード はい

これを要約すると、下記のようになります。

AWS CLIが【1.11.108】より古いバージョンの場合、
S3へのAPIリクエストが「署名バージョン2」になっているため、アップデートが必要になる。


ちなみに、現在のS3署名バージョンを確認する方法は、
下記の記事を参考にさせていただきました。

Athena で S3 署名バージョン2の利用状況レポートを作成する

対応(pip install --upgrade awscli)

OS別に対応を記載します。

Amazon Linux

Amazon Linux に AWS CLI をインストールする

# aws --version
# pip install --upgrade awscli

Amazon Linuxの場合、これだけで済みます。とっても簡単。

CentOS

Linux に AWS CLI をインストールする

CentOSの場合、ひと手間かかってしまいます。

# aws --version
# pip install awscli --upgrade --user

ここまでは、Amazon Linuxとあまり変わらず。

# export PATH=~/.local/bin:$PATH
# source ~/.bash_profile

環境変数を設定すると、awsコマンドが使えるようになります。

# vi ~/.bash_profile
# source ~/.bash_profile

.bash_profile を直接変更しても問題ありません。

他の方法(シンボリックリンク設定)

「環境変数を変更するのは嫌だ」という方は
元々の場所に新規ファイルのシンボリックリンクを設定することで、解決します。

実際に/usr/bin/aws が置かれているEC2インスタンスで、下記を実施しました。

前提

  • aws-cliは、pipではなくzipファイルでインストール済み。
  • OSは、CentOS 6.8。
# which aws
/usr/bin/aws

/usr/bin/aws があります。

# pip install awscli --upgrade --user

pipコマンドで、AWS CLIをアップグレードします。

# find / -name aws
/root/.local/bin/aws
/usr/bin/aws

/root/.local/bin/ に新しい aws が作られます。

# mv /usr/bin/aws /usr/bin/aws.bak
# ln -s /root/.local/bin/aws /usr/bin/aws

# ls -la /usr/bin/aws
lrwxrwxrwx 1 root root 20  5月  8 15:00 2019 /usr/bin/aws -> /root/.local/bin/aws

古い aws をバックアップ用として残しておき、
シンボリックリンクを設定して、新しい aws に置き替えます。

この方法だと環境変数を変えることなく、新しいAWS CLIを利用することができます。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

無料ドメインでAWS Route53 + CloudFront + アプリケーション or S3(静的サイト)を構築する

はじめに

  • アプリケーションサーバーはAWS内で構築済みの前提
  • S3の静的サイトを作る場合の設定は以下に書きました

Amazon S3 での静的ウェブサイトのホスティング方法
https://qiita.com/mekappi/items/1354e20b275906f31e10

  • 最終ゴールはインターネット経由で→CloudFront→ アプリケーション or S3(静的サイト)にアクセスできるようにすること
  • この記事の設定例はアプリケーションの静的コンテンツをCloudFront経由で配信できるようにしていくものですが、静的サイトの運用の場合にも応用できると思います。

ドメイン取得

まずはドメインを取る
無料でドメイン取得ができるmlドメインとかを使う

Freenom
https://my.freenom.com/

好きなドメインを検索して登録します。
(この時点では何も設定しなくて良い)
今回はこの記事用に「champ-dev.ml」というドメインを取って構築していきます。

aa.JPG

ドメイン名設定

Route53を使ってDNSサーバーを設定していきます。

ホストゾーンの作成→ドメイン名に取得したドメインを入力します。

a6.JPG

作成したホストゾーンにはNSレコードが自動作成されているのでその値をコピーしておきます。
a7.JPG

Freenomに戻ります。

MyDomains
a3.JPG

ManageDomains
a5.JPG

Mabnagement Tools → Nameservers Route53でコピーした4つのNSレコードの値を
それぞれに貼り付けて登録します。

a8.JPG

これでFreenom→Route53の設定が完了です

SSL

AWSのCertificate Managerを開きます。
ここで注意なのはCloudFrontで使う証明書はリージョンがus-east1(バージニア北部)でなくてはいけません。(何故か)
なのでリージョンの切り替えを忘れずに。

パブリック証明書のリクエスト
a10.JPG

証明書を発行したいドメインを入力します。
XXX.mlとサブドメイン分の*.XXX.mlを登録しておきましょう
a11.JPG

DNSの検証
a12.JPG

▶をクリックして証明書のエクスポートを押下、DNS_Configuration.csvというファイルがダウンロードされます。
a13.JPG

ファイルにrecordNameとRecordValueが記載されています。
DNS検証を完了するためにRoute53にこの値を登録する必要があります。

a15.JPG

Route53に戻ります。
レコードセットの作成→名前にcsvのrecordName、値にRecordValueを入力してCNAMEレコードを作成します。
a14.JPG

しばらくしてCertificate Managerに戻ると状態が発行済になります。

S3バケットを作る

バケットを作り、
静的サイトの場合はhtmlファイル等をアップロードします。
アプリケーションの静的リソースをCloudFront + S3で配信したい場合もファイル作成してアップロードしておきましょう

CloudFrontを作る

ディストリビューションとオリジンとbehaviorを作ります
それぞれはこんなイメージ
- ディストリビューション : 全体設定
- オリジン : 個別のサービスの設定
- behavior : オリジンのルーティングルール

ディストリビューション作成

作成済みのキャプチャですが、新規作成時はディストリビューションとオリジンを同時に作成する画面になります。

  • Altername Doiman Names 独自ドメインを使用する場合に設定
  • SSL Certificate SSLでアクセスする場合、証明書を設定する独自ドメインを利用する場合は「Custom SSL Certificate」を選択し、独自ドメインの証明書を指定する
  • Default Root Object デフォルトのルートオブジェクトを設定 デフォルトはindex.html
  • Logging ログを取得するかを選択、S3バケットにリクエストログを出力してくれる。有料だが本番環境やデバッグの時はONにしたほうがよい
  • Bucket for Logs ログを配置するS3のバケットを選択
  • Log prefix ログファイル名の先頭に付ける文字列を指定
  • Cookie Logging ログにCookieも記録するか選択
  • Distribution State Distributionの使用準備が整った後、自動的に有効にするかを選択

ちなみにログはこんな感じ(このサンプルではcookieは出力していない)

#Version: 1.0
#Fields: date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version fle-status fle-encrypted-fields
2019-05-21  06:29:14    NRT12-C3    333 124.146.227.61  GET dd108ihzlobta.cloudfront.net    /content/css/loading.css    304 http://champ-dev.ml/    Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/74.0.3729.157%2520Safari/537.36 -   -   Hit L5QfLg4DgAfaKnpgpRZPHaS_JyP8ThrcfHACWu5fyd4VLSaJ2yY0EQ==    champ-dev.ml    http    467 0.001   -   -   -   Hit HTTP/1.1    -   -
2019-05-21  06:29:14    NRT12-C3    2885    124.146.227.61  GET dd108ihzlobta.cloudfront.net    /   200 -   Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/74.0.3729.157%2520Safari/537.36 -   -   Miss    g0Tk2y7e_nOCihKH-XOeCPhJzRKH4DAYj8Tn4ztBR3YNawhpL_qXmQ==    champ-dev.ml    http    442 0.335   -   -   -   Miss    HTTP/1.1    -   -
2019-05-21  06:29:14    NRT12-C3    2885    124.146.227.61  GET dd108ihzlobta.cloudfront.net    /   200 -   Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/74.0.3729.157%2520Safari/537.36 -   -   Miss    UR6HFZku3uxcY9nGa7gHKRJVB9WUaWMpvnBC3A7SQbfWurt3REncdA==    champ-dev.ml    http    423 0.154   -   -   -   Miss    HTTP/1.1    -   -
2019-05-21  06:29:14    NRT12-C3    333 124.146.227.61  GET dd108ihzlobta.cloudfront.net    /content/css/loading.css    304 http://champ-dev.ml/    Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/74.0.3729.157%2520Safari/537.36 -   -   Hit RZCyKJrRemWJVl_nlTg7D2JG8i4KdFyjXpZbReUgaiq-VD5R6m-__w==    champ-dev.ml    http    448 0.001   -   -   -   Hit HTTP/1.1    -   -
2019-05-21  06:29:14    NRT12-C3    333 124.146.227.61  GET dd108ihzlobta.cloudfront.net    /content/images/logo-jhipster.png   304 http://champ-dev.ml/content/css/loading.css Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/74.0.3729.157%2520Safari/537.36 -   -   Hit 5b6CMCNfUCSL_wtbXW5jKch_WrkjUfGxwjWIUtzday7CG6FzB9BG2A==    champ-dev.ml    http    501 0.000   -   -   -   Hit HTTP/1.1    -   -
2019-05-21  06:29:16    NRT12-C3    2885    124.146.227.61  GET dd108ihzlobta.cloudfront.net    /api/scoreboards    200 http://champ-dev.ml/    Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/74.0.3729.157%2520Safari/537.36 gameGroupId=1&page=0&size=20    -   Miss    AA1nM01jaGRfOCsrxt_MPCkIbPaDuAIcmuDsDTP7uvdqgKvXqPYmXg==    champ-dev.ml    http    383 0.344   -   -   -   Miss    HTTP/1.1    -   -
2019-05-21  06:29:27    NRT12-C3    2885    124.146.227.61  GET dd108ihzlobta.cloudfront.net    /   200 -   Mozilla/5.0%2520(iPhone;%2520CPU%2520iPhone%2520OS%252010_3_1%2520like%2520Mac%2520OS%2520X)%2520AppleWebKit/603.1.30%2520(KHTML,%2520like%2520Gecko)%2520Version/10.0%2520Mobile/14E304%2520Safari/602.1   -   -   Miss    i99Bzkx76Z9EpTGceIwh5W4qlAWQz8MjNDeLHsTn0vSfrAj68RWIKg==    champ-dev.ml    http    488 0.312   -   -   -   Miss    HTTP/1.1    -   -
2019-05-21  06:29:27    NRT12-C3    4066    124.146.227.61  GET dd108ihzlobta.cloudfront.net    /content/css/loading.css    200 http://champ-dev.ml/    Mozilla/5.0%2520(iPhone;%2520CPU%2520iPhone%2520OS%252010_3_1%2520like%2520Mac%2520OS%2520X)%2520AppleWebKit/603.1.30%2520(KHTML,%2520like%2520Gecko)%2520Version/10.0%2520Mobile/14E304%2520Safari/602.1   -   -   Hit u5gXWVHEh_Rs7j-RvopmIl_5OdaOxBgwzU1-7CC3p8zP25S8BMbZSg==    champ-dev.ml    http    412 0.001   -   -   -   Hit HTTP/1.1    -   -
2019-05-21  06:29:27    NRT12-C3    127664  124.146.227.61  GET dd108ihzlobta.cloudfront.net    /app/polyfills.bundle.js    200 http://champ-dev.ml/    Mozilla/5.0%2520(iPhone;%2520CPU%2520iPhone%2520OS%252010_3_1%2520like%2520Mac%2520OS%2520X)%2520AppleWebKit/603.1.30%2520(KHTML,%2520like%2520Gecko)%2520Version/10.0%2520Mobile/14E304%2520Safari/602.1   -   -   Hit JwvBqo2wVdt6X0OMfe63Sx-ywm6fZyMgRJs6ntz6ZE4ngQRwIeEe5g==    champ-dev.ml    http    397 0.001   -   -   -   Hit HTTP/1.1    -   -

d1.JPG

d2.JPG

オリジン作成

※オリジンはパブリックアクセスできるものである必要があります。
ALBがパブリックなので、設定してもcloudFront経由でアクセスも、ALBに直接アクセスも可能になります。
ALBの直接アクセスを封じたい場合は以下を参照

CloudFrontのELBオリジンへ直接アクセスする通信を制限する方法
https://dev.classmethod.jp/cloud/aws/how-to-restrict-elb-origin/

  • origin domain name オリジンを指定、ここではS3
  • origin path cloudFrontへのリクエストをオリジンサーバーの特定のパスにルーティングしたい場合に設定。 「/foo/index.html」に誘導したい場合は「/foo/index.html」と入力する。 |
  • origin path このディストリビューションを区別するための名前を設定(好きなものでOK) |
  • Restrict Bucket Access オリジンがS3の場合のみ有効 S3バケットのコンテンツへのアクセスをCloudFrontからのみに制限する場合は「Yes」を選択。S3のエンドポイントへ直接アクセスした場合もコンテンツを表示できるようにしておく場合は「No」を選択 |

まずはS3側
a1.JPG

次にアプリケーション側
今回はECSでクラスター組んでいてALBが入り口になっているのでそれを指定します。
a2.JPG
aaaa.JPG

behavior作成

  • Path Pattern このオリジンを有効にするリクエストのパスパターンを指定
  • Allowed HTTP Methods エンドユーザに許可するHTTPメソッドを選択
  • Cached HTTP Methods CloudFrontでのキャッシュが有効になるHTTPメソッドを選択
  • Forward Headers CloudFrontがオリジンサーバーに転送するリクエストヘッダーの指定と、ヘッダー値に基づいてオブジェクトをキャッシュするかの設定を行う。「Whitelist」を選択すると、ヘッダー値によってキャッシュする内容をコントロールすることが可能になる。
  • Object Caching Cloud Frontがキャッシュを保持する時間の設定。オリジンサーバーで追加したCache-Controlの時間に応じてキャッシュを保存する場合は、今回の値を設定する。ヘッダーに依存せずに時間を決める場合は「Customize」を選択し、Minimum TTLを設定する
  • Forward Cookies CloudFrontからオリジンサーバーに転送するCookieを指定。動的に作成されたコンテンツでもCookieの値が同じであればCloudFrontでキャッシュすることができる。効果的に使えばアクセスが速くなり、オリジンサーバーの負荷も下がる。なお、S3はCookieを処理できないため、オリジンサーバがS3の場合はこの機能は無効
  • Forward Query String クエリ文字列をオリジンサーバーに転送するか選択、「Yes」にすることでクエリ文字列が一致した場合はキャッシュを返すことが可能になる
  • Smooth Streaming Microsoftスムーズストリーミング形式のメディアファイルを配信する場合はYes
  • Restrict Viewer Access 署名付きURLを利用するかの選択。例えば認証されたユーザーのみにコンテンツを配信する場合等に「Yes」を選択する

S3側の値

b1.JPG
b2.JPG

アプリケーション側
bb1.JPG
bb2.JPG

これでCloudFront → App or S3ができました

Route53→CloudFront

Route53でAレコードを作ります。
ドメインと値を紐づけていく

r1.JPG

これでインターネットからアクセスできました。
完了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Delphi 10.3 を使用してAWS S3からファイルを取得する

やりたいこと

AWS S3からDelphi10.3を使用して
ファイルの取得を行う

環境

Windows 10
Delphi 10.3

実装

Formへ
AmazonconnectionInfoを張り付ける
image.png

AmazonconnectionInfo1の
プロパティ
AccountKey
AccountName
にAWSにて発行した値を挿入する
image.png

対象のコード

const
  BUCKET_NAME = 'your-bucket-name';
function TForm1.getUsersData(selectDir: TSelectDirOpt; userId : String):boolean;
var
  s3 : TAmazonStorageService;
  stream : TStringStream;
  objFolder : string;
  LFileName : String;
begin
  s3 := TAmazonStorageService.Create(AmazonConnectionInfo1);
  stream := TStringStream.Create;
  objFolder := 'your-folder/';
  LFileName := objFolder + your-file-name + '.json';
  if s3.GetObject(BUCKET_NAME, LFileName, stream) then
  begin
    stream.SaveToFile('c:\' + LFileName)
  end else
  begin
    showmessage('Download failed(score landmark)');
  end;
end;

※LFileNameには取得したいファイル名を記述してください。

所要時間

5分でできた。

追記

シンプルに書くとこんな感じ

GetObject from S3

procedure TForm1.btnDownloadClick(Sender: TObject);
var
  s3 :TAmazonStorageService;
  strstr : TStringStream;
begin
  s3 := TAmazonStorageService.Create(AmazonConnectionInfo1);
  strstr := TStringStream.Create;
  try
    if s3.GetObject(BUCKET_NAME, OBJ_NAME, strstr) then
      ShowMessage(strstr.DataString)
    else
      ShowMessage('Download failed');
  finally
    strstr.Free;
    s3.Free;
  end;
end;

uploadObject to S3

procedure TForm1.btnUploadClick(Sender: TObject);
var
  s3 :TAmazonStorageService;
  strstr : TStringStream;
begin
  s3 := TAmazonStorageService.Create(AmazonConnectionInfo1);
  strstr := TStringStream.Create(edit1.Text);
  try
    if s3.UploadObject(BUCKET_NAME, OBJ_NAME, strstr.Bytes) then
      ShowMessage('OK')
    else
      ShowMessage('Upload failed');
  finally
    strstr.Free;
    s3.Free;
  end;
end;

※ edit1.textは任意で、好きな値を入れて

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS CloudFormation Master Class を受けてみた③ 「 CloudFormation Designer でテンプレートの作成」

はじめに

引き続き、Udemy にて Stephane Maarek 氏 が提供している「 AWS CloudFormation Master Class 」コースについて紹介していきます。今回は、CLoudFormation Desinger の機能とその使い方についてです。

Using CloudFormation Designer

image.png
CloudFormation では、テンプレートをデザインすることができます。
それにより、テンプレートの内容を可視化しながら作成できます。

テンプレートのデザイン①

image.png
CloudFormation のサービス画面から、左上の「テンプレートのデザイン」を選択します。

image.png
テンプレートを作成したいサービスを、左の一覧から選択したら、あとは右側に持ってくるだけです。
ここでは、EC2 インスタンスを例に行っています。
これで、EC2 インスタンスのテンプレートは完了しました。

テンプレートのデザイン②

次に、作成した EC2 インスタンスに対して固定 IP を設定してみましょう。
image.png
これで固定 IP の設定も完了です。

セキュリティグループの設定も、同じ様に行うことができます。
image.png

他にも、既存の YAML テンプレを貼り付けることで、YAML の内容を図で確認することができます。
image.png

image.png
デザインしたテンプレートを使用する際は、左上のアイコンより「アップロード」をクリックします。

image.png
テンプレートの選択画面で、「 Amazon S3 テンプレート URL の指定 」に、アップロードしたテンプレートの URL が表示されていることを確認したら、「 次へ 」を押して作成すれば完了です。

まとめ

CloudFormation のテンプレートをデプロイする方法は2通りあります。
image.png

  • 手動でデプロイ

    • CloudFormation Designer でテンプレートを作成
    • コンソールからパラメータを入力
  • 自動でデプロイ

    • YAML ファイルでテンプレートを編集
    • AWS CLI を使用してテンプレートをデプロイ

おわりに

CloudFormation Designer でのテンプレートの作成の紹介については以上です。
このサービスを利用することで、ユーザ自身でテンプレートを自由にデザインし、デプロイすることができます。
次回は、CloudFormation のparameter について紹介していきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS CloudFormation Master Class を受けてみた③ 「 CloudFormation Designer でテンプレートの作成 」

はじめに

引き続き、Udemy にて Stephane Maarek 氏 が提供している「 AWS CloudFormation Master Class 」コースについて紹介していきます。今回は、CLoudFormation Desinger の機能とその使い方についてです。

Using CloudFormation Designer

image.png
CloudFormation では、テンプレートをデザインすることができます。
それにより、テンプレートの内容を可視化しながら作成できます。

テンプレートのデザイン①

image.png
CloudFormation のサービス画面から、左上の「テンプレートのデザイン」を選択します。

image.png
テンプレートを作成したいサービスを、左の一覧から選択したら、あとは右側に持ってくるだけです。
ここでは、EC2 インスタンスを例に行っています。
これで、EC2 インスタンスのテンプレートは完了しました。

テンプレートのデザイン②

次に、作成した EC2 インスタンスに対して固定 IP を設定してみましょう。
image.png
これで固定 IP の設定も完了です。

セキュリティグループの設定も、同じ様に行うことができます。
image.png

他にも、既存の YAML テンプレを貼り付けることで、YAML の内容を図で確認することができます。
image.png

image.png
デザインしたテンプレートを使用する際は、左上のアイコンより「アップロード」をクリックします。

image.png
テンプレートの選択画面で、「 Amazon S3 テンプレート URL の指定 」に、アップロードしたテンプレートの URL が表示されていることを確認したら、「 次へ 」を押して作成すれば完了です。

まとめ

CloudFormation のテンプレートをデプロイする方法は2通りあります。
image.png

  • 手動でデプロイ

    • CloudFormation Designer でテンプレートを作成
    • コンソールからパラメータを入力
  • 自動でデプロイ

    • YAML ファイルでテンプレートを編集
    • AWS CLI を使用してテンプレートをデプロイ

おわりに

CloudFormation Designer でのテンプレートの作成の紹介については以上です。
このサービスを利用することで、ユーザ自身でテンプレートを自由にデザインし、デプロイすることができます。
次回は、CloudFormation のparameter について紹介していきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[WIP]AWS WAFの概要

概要

先日、業務でDoS攻撃をくらったため、AWS WAFを導入することになりました。
導入に伴っていろいろ勉強したこと、AWSサービスに標準搭載されているAWS Shield standardで防げるもの/防げないものについて記載していこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS構築の見積もりについて

AWSでシステムを動かしたい。費用は?という点からオンデマンドセミナーを見ての備忘録。

「料金設定のベストプラクティス・見積もり作成ハンズオン オンデマンドセミナー」から
※2017年12月9日時点の料金体系
https://aws.amazon.com/jp/blogs/news/on-demand-quotation-handson/

AWSおさらい

  • 初期投資が不要
  • 低額な利用料金
  • 従量課金(実際の使用分のみ支払い)
  • セルフサービス(使いたいときに使いたい分だけ)
  • リソース増強も自由度がある 見積もりで大変な部分は、従量課金部分で事前予測が難しいという声が多い。その声を解消するためのセッション

見積の考え方

  • 基本的にAWS利用平均値は、9割が EC2 or RDS。この2つを軸に見積を考える
  • 商用環境は、365日24時間で見積ことが大多数。これは、月額固定費として扱うことができる。
  • EBS=確保した容量分の料金がかかる。アタッチされたEC2の起動・停止に関係なく費用が掛かる。
  • S3 = EBSとことなり、利用している容量にのみ費用がかかる(事前に容量を確保しない)。
  • リージョンごとに料金が異なります。
  • ユーザーアクセスに対してレイテンシーが関係ない場合は、アメリカリージョンのほうが若干安くなる。
  • AZ間の通信は、1ms程度
  • データ転送 = 一番計算しずらい・・・が全体の10%ないに収まってる統計となってる。
  • 動画配信等は、ちょっと違うのでアマゾン担当者にご相談くださいとのこと。
  • インスタンスを停止している分は、料金は発生しない。
  • スペック、ライセンスによって時間単価が変わる
  • 料金ツールは、最大24時間のずれが生じている
  • 料金の閾値をウォッチしてアラート送信が可能
  • Amazon Linux に限っては、1秒単位での課金になっている。
  • RDSのMulti-AZ は、2インスタンス分の料金がかかります。

データ転送

  • 基本的にAWS利用の10%内で収まるコスト
  • リージョンに対する下り通信にのみ料金がかかる。リージョンに対する上り通信は、料金がかからない。
  • リージョン内の通信(AZ間の通信も微細な費用がかかるが、見積もりに含めないのが一般的)。
  • 通信先リージョンで料金が異なる。

サポート料金

  • 24時間365日(メール・電話・チャットでの日本語サポートを提供)
  • デベロッパー(開発者向け、開発環境向け)
  • ビジネス(商用環境向け)AWS利用料金の10%がかかる
  • エンタープライズ(専用テクニカルアカウントマネージャがアサインされる)

概算算出時のポイント

  • 物理環境とおなじ間隔でサイジングしない
    • 検証環境やスタンバイ機を常に用意しておく必要はない
  • AWS内部ネットワーク構成は費用にほぼ影響しない
  • 割引オプションやボリュームディスカウントを見積環境後に比較考慮
  • EC2 = 70%、RDS = 20%。商用環境は、24時間稼働なので月額費用として見積もる。
    • この2サービスの見積もり精度を高めることが最初のミッション
  • マネージドサービスの積極利用
    • エンジニアのオペレーションなどの費用削減効果

お支払い方法について

  • 原則クレジットカード払い
  • 価格は、ドル表記
  • Visa, MasterCard ならカード会社へ円請求への変更が可能
  • クレジットカード払いから海外送金払いに切り替えが可能(請求書払い)
  • 月2000ドルを超える支払いが継続して確実に見込める場合>営業に問合せ
  • 請求代行会社によるお支払い
  • AWSのパートナーが実施している代行サービス

概算見積もりの注意点

  • 見積ツール利用
  • 注意点
    • 日本語が表示されていない場合は、画面右上の言語選択で「日本語を選択」
    • 無料利用枠のチェックを外す
    • どのリージョンで見積もりするのかを選択(リージョンで料金差異がある為)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSのWAFに設定するWebACLとかRuleとか

WAF を設定するにあたり、コンソールからポチポチやっただけでは全体間をつかめなかったので、設定する要素をUMLで表してみた。

Untitled Diagram.png

これを書かずとも、公式ドキュメントの AWS WAF の詳細 に概念図があった。

WAFの構成要素の概念図

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/how-aws-waf-works.html より

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LightsailでSSL化(https通信)できなかった問題

SSL化しているはずなのに,なかなかできなかったので,書いておきます.
環境:Ubuntu 18.04.2"

結果からいうと,Lightsailのコンソール画面のファイヤフォールの設定でHTTPSを入れているはずなのに,sshで入って調べてみたら,有効になっていませんでした.

Let’s EncryptでSSLの設定をしたはずなのに,Chromeでhttps://hoge.comを開いてみると,

「Chromeで「応答時間が長すぎます」

なぁにいいいいいぃぃぃぃ!!!

今度はhttp://hoge.comを開いてみると,普通に繋がる.
原因はファイヤフォールにありました.(半日くらい調べまくったぜ)

スクリーンショット 2019-05-21 0.24.19.png

Lightsailのコンソールでは許可しているのに,

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)

おいいいいいいぃぃぃぃ!!!
HTTPS(433)が許可されてねぇじゃねぇかあああああ!!!

ということで,

$ sudo ufw allow 443

で追加し,

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

こうなれば,https://hoge.comに繋がりました.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む