- 投稿日:2019-05-21T23:43:45+09:00
AWS認定Big Data勉強記 - 8: Amazon Kinesis
こんにちは、えいりんぐーです
今回は Amazon Kinesis についてまとめます。
一口に Kinesis といっても、 Data Streams, Data Firehose, Data Analytics など特性の異なるサービスがあるのでそれぞれ別記事にしたいと思います。
ひとまずここでは、それぞれの概要と参考記事を集めます。参考資料
- Black Beltオンラインセミナー資料
- 公式ドキュメント
- ブログ
- YouTube
- その他
- [AWS]kinesisまとめ
- こちらの記事も良くまとまっています。
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
- 外部参照テーブルとはジョインしたり、データレコードの補完に利用したりできる。
- ウィンドウで問い合わせができる。
- タンブリングとスライディング。
- 投稿日:2019-05-21T22:30:35+09:00
AWS Cloud9でLaravelの開発環境構築
はじめに
AWS Cloud9でLaravelの開発環境を構築する手順です。
Cloud9の起動
ブラウザでCloud9を起動します。
コンソールの表示
コンソールが表示されていない場合は、F6キーを押下してコンソールを表示します。
コンソールとは、以下のような「bash」とタブに表示されている場所です。
コンソールでは、コマンドでサーバーを操作することが出来ます。
コマンドの実行方法
コマンドの実行方法がわからない場合は、以下の動画を参考にしてください。
PHP7.3のインストール
2019/05/19時点では、EC2のAmazon LinuxにインストールされているPHPのバージョンは5.6.40であるため、PHP7.3にアップデートします。
以下のコマンドを実行します。
sudo amazon-linux-extras install php7.3以下の表示となったら、「y」を入力し、Enterキーを押下します。
以下のように表示されれば完了。
composerのインストール
composerは、PHPのパッケージ管理ツールです。
パッケージ管理ツールがあれば、便利なライブラリを簡単に自分のWebサイトに反映することが出来ます。以下のコマンドを実行します。
curl -sS https://getcomposer.org/installer | php
以下のように表示されるまで待ちます。
以下のコマンドを実行します。
sudo mv composer.phar /usr/local/bin/composer
実行は一瞬で完了して、以下のような表示になります。
以下のコマンドを実行します。
composer以下のように表示されれば、composerのインストールは完了です。
必要なライブラリののインストール
以下のコマンドを実行します。
sudo yum install php php-mbstring php-pdo php-gd php-xml以下の表示となったら、「y」を入力し、Enterキーを押下します。
以下の表示になったらインストールは完了です。
laravelのプロジェクトの作成
以下のコマンドを実行します。(「myproject」の部分は好みの名前に変更してください。)
composer create-project --prefer-dist laravel/laravel myproject "5.5.*"以下のように表示されればlaravelのプロジェクトが完成です。
以下のコマンドでプロジェクトのカレントディレクトリに移動します。(「myproject」は、laravelプロジェクト作成時に指定した名前に変えてください。)
cd myproject
以下のコマンドを実行します。
php artisan key:generate以下のように表示されれば成功です。
Webサーバーの起動
以下のコマンドを実行します。
php artisan serve --port=8080以下のように表示されればWebサーバーの起動に成功
Cloud9の右上の「Preview」をクリックして、Preview Running Applicationをクリックする。
Cloud9内部にブラウザが起動し、Laravelの画面が表示される。
参考
https://laraweb.net/environment/3953/
https://dev.classmethod.jp/cloud/aws/my_first_aws_han/
- 投稿日:2019-05-21T21:32:16+09:00
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
- Systemdファイル作成
- /etc/systemd/system/の下にファイルを置く
- SystemdファイルがServiceとして認識されたか確認する
systemctl list-unit-files --type=service
の出力に現れれば正しく認識されているということ。- enableして起動する
systemctl enable ~~
で認識され、systemctl start ~~
で起動。2. Docker
コード
DockerfileFROM python:3 RUN pip install bottle chainer matplotlib pillow WORKDIR /myvol CMD python index.pydockerコンテナ内に入り、コマンドを入力
+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 をマウントする
- 投稿日:2019-05-21T21:06:35+09:00
APIGatewayとLambdaについてまとめる
API GatewayとAWS Lambda
はじめに
基本的な設定方法は以下のサイトを参考にしてください。
【API Gateway】AWS Lambda統合のPythonでHello, world1.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の設定
2. Lambdaの設定
手順
- 利用するファイルをまとめて圧縮
- 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の設定
- 使うファイルをzipで圧縮
- AWS Lambdaサイト内の「関数の作成」にて関数を設定後、zipファイルを転送
![]()
- AWS Lambda関数のトリガー作成
- 今回はAPI gatewayをトリガーとする。各種設定を行い、二つの機能を接続する
- サイト内の「テスト」にて正常に動くか試す。
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する時のマッピングテンプレートを作成しました
- 投稿日:2019-05-21T17:20:08+09:00
Route53の加重ルーティング機能で、あるALBへのトラフィックを段階的に別のALBに切り替える
やりたいこと
- あるALBへのトラフィックを別のALBに切り替える
- 一気に切り替えるのではなく、段階的に切り替える
- aws Management Consoleでの操作はせずに、CloudFormationでの操作のみ
最初の状態
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: AALBが2つ(old, new)あり、DNSの名前解決の結果はすべてold側のALBになっています。
なお、これ以降の説明では
Route53HostedZoneNakedDomain
とElasticLoadBalancingV2LoadBalancerOld
とElasticLoadBalancingV2LoadBalancerNew
が変化することはありませんので、CloudFormationテンプレートからは省略します。旧ALBのALIASレコードにWeightとSetIdentifierを追加
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のレコードを追加
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-newWeightを0にした状態で新ALBのALIASレコードを追加します。
この時点でもまだRoute53の問い合わせ結果に変化はなく、すべてのAレコード問い合わせに対して旧ALBのIPアドレスを返します。新ALBのALIASレコードのWeight増加 & 旧ALBのALIASレコードのWeight減少
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をゼロにする
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レコードの削除
# 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-newweight=0になっている旧ALBのALIASレコードは不要なので、CloudFormationのリソースを削除します。
新ALBのALIASレコードのWeightとSetIdentifierを削除
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レコードに変化させる方法や、その逆の方法に関する説明があまりなかったので、実際に試してみました。
- 投稿日:2019-05-21T17:16:15+09:00
【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 awscliAmazon Linuxの場合、これだけで済みます。とっても簡単。
CentOS
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 --userpipコマンドで、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を利用することができます。
参考
- 投稿日:2019-05-21T14:45:22+09:00
無料ドメインで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」というドメインを取って構築していきます。ドメイン名設定
Route53を使ってDNSサーバーを設定していきます。
ホストゾーンの作成→ドメイン名に取得したドメインを入力します。
作成したホストゾーンにはNSレコードが自動作成されているのでその値をコピーしておきます。
Freenomに戻ります。
Mabnagement Tools → Nameservers Route53でコピーした4つのNSレコードの値を
それぞれに貼り付けて登録します。これでFreenom→Route53の設定が完了です
SSL
AWSのCertificate Managerを開きます。
ここで注意なのはCloudFrontで使う証明書はリージョンがus-east1(バージニア北部)でなくてはいけません。(何故か)
なのでリージョンの切り替えを忘れずに。証明書を発行したいドメインを入力します。
XXX.mlとサブドメイン分の*.XXX.mlを登録しておきましょう
▶をクリックして証明書のエクスポートを押下、DNS_Configuration.csvというファイルがダウンロードされます。
ファイルにrecordNameとRecordValueが記載されています。
DNS検証を完了するためにRoute53にこの値を登録する必要があります。Route53に戻ります。
レコードセットの作成→名前にcsvのrecordName、値にRecordValueを入力してCNAMEレコードを作成します。
しばらくして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 - -オリジン作成
※オリジンはパブリックアクセスできるものである必要があります。
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」を選択 |
次にアプリケーション側
今回はECSでクラスター組んでいてALBが入り口になっているのでそれを指定します。
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側の値
これでCloudFront → App or S3ができました
Route53→CloudFront
Route53でAレコードを作ります。
ドメインと値を紐づけていくこれでインターネットからアクセスできました。
完了です。
- 投稿日:2019-05-21T14:21:37+09:00
Delphi 10.3 を使用してAWS S3からファイルを取得する
やりたいこと
AWS S3からDelphi10.3を使用して
ファイルの取得を行う環境
Windows 10
Delphi 10.3実装
Formへ
AmazonconnectionInfoを張り付ける
AmazonconnectionInfo1の
プロパティ
AccountKey
AccountName
にAWSにて発行した値を挿入する
対象のコード
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は任意で、好きな値を入れて
- 投稿日:2019-05-21T13:47:22+09:00
AWS CloudFormation Master Class を受けてみた③ 「 CloudFormation Designer でテンプレートの作成」
はじめに
引き続き、Udemy にて Stephane Maarek 氏 が提供している「 AWS CloudFormation Master Class 」コースについて紹介していきます。今回は、CLoudFormation Desinger の機能とその使い方についてです。
- これまでの記事
Using CloudFormation Designer
CloudFormation では、テンプレートをデザインすることができます。
それにより、テンプレートの内容を可視化しながら作成できます。テンプレートのデザイン①
CloudFormation のサービス画面から、左上の「テンプレートのデザイン」を選択します。
テンプレートを作成したいサービスを、左の一覧から選択したら、あとは右側に持ってくるだけです。
ここでは、EC2 インスタンスを例に行っています。
これで、EC2 インスタンスのテンプレートは完了しました。テンプレートのデザイン②
次に、作成した EC2 インスタンスに対して固定 IP を設定してみましょう。
これで固定 IP の設定も完了です。他にも、既存の YAML テンプレを貼り付けることで、YAML の内容を図で確認することができます。
デザインしたテンプレートを使用する際は、左上のアイコンより「アップロード」をクリックします。
テンプレートの選択画面で、「 Amazon S3 テンプレート URL の指定 」に、アップロードしたテンプレートの URL が表示されていることを確認したら、「 次へ 」を押して作成すれば完了です。まとめ
CloudFormation のテンプレートをデプロイする方法は2通りあります。
手動でデプロイ
- CloudFormation Designer でテンプレートを作成
- コンソールからパラメータを入力
自動でデプロイ
- YAML ファイルでテンプレートを編集
- AWS CLI を使用してテンプレートをデプロイ
おわりに
CloudFormation Designer でのテンプレートの作成の紹介については以上です。
このサービスを利用することで、ユーザ自身でテンプレートを自由にデザインし、デプロイすることができます。
次回は、CloudFormation のparameter について紹介していきたいと思います。
- 投稿日:2019-05-21T13:47:22+09:00
AWS CloudFormation Master Class を受けてみた③ 「 CloudFormation Designer でテンプレートの作成 」
はじめに
引き続き、Udemy にて Stephane Maarek 氏 が提供している「 AWS CloudFormation Master Class 」コースについて紹介していきます。今回は、CLoudFormation Desinger の機能とその使い方についてです。
- これまでの記事
Using CloudFormation Designer
CloudFormation では、テンプレートをデザインすることができます。
それにより、テンプレートの内容を可視化しながら作成できます。テンプレートのデザイン①
CloudFormation のサービス画面から、左上の「テンプレートのデザイン」を選択します。
テンプレートを作成したいサービスを、左の一覧から選択したら、あとは右側に持ってくるだけです。
ここでは、EC2 インスタンスを例に行っています。
これで、EC2 インスタンスのテンプレートは完了しました。テンプレートのデザイン②
次に、作成した EC2 インスタンスに対して固定 IP を設定してみましょう。
これで固定 IP の設定も完了です。他にも、既存の YAML テンプレを貼り付けることで、YAML の内容を図で確認することができます。
デザインしたテンプレートを使用する際は、左上のアイコンより「アップロード」をクリックします。
テンプレートの選択画面で、「 Amazon S3 テンプレート URL の指定 」に、アップロードしたテンプレートの URL が表示されていることを確認したら、「 次へ 」を押して作成すれば完了です。まとめ
CloudFormation のテンプレートをデプロイする方法は2通りあります。
手動でデプロイ
- CloudFormation Designer でテンプレートを作成
- コンソールからパラメータを入力
自動でデプロイ
- YAML ファイルでテンプレートを編集
- AWS CLI を使用してテンプレートをデプロイ
おわりに
CloudFormation Designer でのテンプレートの作成の紹介については以上です。
このサービスを利用することで、ユーザ自身でテンプレートを自由にデザインし、デプロイすることができます。
次回は、CloudFormation のparameter について紹介していきたいと思います。
- 投稿日:2019-05-21T10:37:46+09:00
[WIP]AWS WAFの概要
- 投稿日:2019-05-21T09:44:18+09:00
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のパートナーが実施している代行サービス
概算見積もりの注意点
- 見積ツール利用
- 注意点
- 日本語が表示されていない場合は、画面右上の言語選択で「日本語を選択」
- 無料利用枠のチェックを外す
- どのリージョンで見積もりするのかを選択(リージョンで料金差異がある為)
- 投稿日:2019-05-21T01:11:14+09:00
AWSのWAFに設定するWebACLとかRuleとか
WAF を設定するにあたり、コンソールからポチポチやっただけでは全体間をつかめなかったので、設定する要素をUMLで表してみた。
これを書かずとも、公式ドキュメントの AWS WAF の詳細 に概念図があった。
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/how-aws-waf-works.html より
- 投稿日:2019-05-21T00:34:10+09:00
LightsailでSSL化(https通信)できなかった問題
SSL化しているはずなのに,なかなかできなかったので,書いておきます.
環境:Ubuntu 18.04.2"結果からいうと,Lightsailのコンソール画面のファイヤフォールの設定でHTTPSを入れているはずなのに,sshで入って調べてみたら,有効になっていませんでした.
Let’s EncryptでSSLの設定をしたはずなのに,Chromeで
https://hoge.com
を開いてみると,「Chromeで「応答時間が長すぎます」
なぁにいいいいいぃぃぃぃ!!!
今度は
http://hoge.com
を開いてみると,普通に繋がる.
原因はファイヤフォールにありました.(半日くらい調べまくったぜ)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
に繋がりました.