かべぎわブログ

ブログです

S3上のテキストファイルをLambda(Python)で取得する

今回はS3の中に入っているテキストファイルの内容をLambda(Python)で取得してみたいと思います。

S3上には内閣府が公表している国民の休日のcsvファイルの文字コードをutf-8に変換したものを格納しています。

↓これをsjisからutf-8に変換
http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv

コード

python

以下のような結果が返ってくるはずです。

['国民の祝日月日,国民の祝日名称', '2016-01-01,元日', '2016-01-11,成人の日', '2016-02-11,建国記念の日', '2016-03-20,春分の日', '2016-04-29,昭和の日', '2016-05-03,憲法記念日', '2016-05-04,みどりの日', '2016-05-05,こどもの日', '2016-07-18,海の日', '2016-08-11,山の日', '2016-09-19,敬老の日', '2016-09-22,秋分の日', '2016-10-10,体育の日', '2016-11-03,文化の日', '2016-11-23,勤労感謝の日', '2016-12-23,天皇誕生日', '2017-01-01,元日', '2017-01-09,成人の日', '2017-02-11,建国記念の日', '2017-03-20,春分の日', '2017-04-29,昭和の日', '2017-05-03,憲法記念日', '2017-05-04,みどりの日', '2017-05-05,こどもの日', '2017-07-17,海の日', '2017-08-11,山の日', '2017-09-18,敬老の日', '2017-09-23,秋分の日', '2017-10-09,体育の日', '2017-11-03,文化の日', '2017-11-23,勤労感謝の日', '2017-12-23,天皇誕生日', '2018-01-01,元日', '2018-01-08,成人の日', '2018-02-11,建国記念の日', '2018-03-21,春分の日', '2018-04-29,昭和の日', '2018-05-03,憲法記念日', '2018-05-04,みどりの日', '2018-05-05,こどもの日', '2018-07-16,海の日', '2018-08-11,山の日', '2018-09-17,敬老の日', '2018-09-23,秋分の日', '2018-10-08,体育の日', '2018-11-03,文化の日', '2018-11-23,勤労感謝の日', '2018-12-23,天皇誕生日']

解説

s3_get_objectでバケットとファイル名を指定してskyujitsu.csvを取得します。
その結果はresponseのBody部に格納されますのでそれをreadしてデコード、改行コードでsplitしています。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

PythonでHHMM形式の時刻の差分を取得する

PythonでHHMM形式同士の時刻の差分を取得する方法を備忘録的に残しておきます。

python

実行すると以下のように差分が取得できます。

takakabe@MyComputer:~$ python time_diff.py
0:30:00

入門 Python 3

入門 Python 3

LambdaのトリガにCloudWatchを設定した際にWe currently do not support adding policies for $LATEST. のエラーがでた場合の対処法

LambdaのトリガにCloudWatchを設定した際にWe currently do not support adding policies for $LATEST.のエラーがでた場合の対処法をご紹介します。

事象

バージョンが$LATESTのLambda関数のトリガにCloudWatch Eventsを追加しようとしたところ以下のようなエラーが出てしまいました。

We currently do not support adding policies for $LATEST. (Service: AWSLambda; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: 70ce2637-f806-11e7-91e6-098e8967446a)

f:id:kabegiwakun:20180112202053p:plain

原因

雑な日本語訳をすると「$LATESTのポリシーの追加はサポートされていない」といったようなメッセージのようです。

これの原因はCloudWatchルールにデフォルトの場合、以下のように設定されているためです。
f:id:kabegiwakun:20180113111713p:plain

バージョン/エイリアスの設定の箇所がデフォルトになっており、エイリアスが非修飾のLambda関数を呼び出すようになっているためです。
CloudWatchルールのターゲットはLambda関数のバージョンまたはエイリアス単位で設定してあげる必要あります。
つまり、$LATESTなんてバージョンはしらねーぞというエラーみたいです。

解決策

このエラーを解決するためにはCloudwatchルールのターゲットでこのLambdaの$LATESTの設定を入れてあげればいいわけですが、そのままでは以下のように「項目がありません」と言われてしまいます。
f:id:kabegiwakun:20180113112602p:plain

これを解決するためにLambdaで$LATESTのエイリアスをつくってあげる必要があります。

Lambdaの設定(エイリアス作成)

マネジメントコンソールでLambdaのページに戻り、バージョンで$LATESTを選び、アクションから「エイリアスの作成」を選択します。
f:id:kabegiwakun:20180113112919p:plain

新しいエイリアスの作成ウインドウが開きますのでエイリアスの名前を適当に決め、バージョンで$LATESTを選択します。
f:id:kabegiwakun:20180113113056p:plain

CloudWatchの設定

上記のLambdaの設定を行うと、ターゲットで先程追加したエイリアスが選択できるようになっています。
f:id:kabegiwakun:20180113113410p:plain

これでバージョンが$LATESTのLambda関数のトリガにCloudWatch Eventsを追加することができます!

おわり

まあ言われてみれば当たり前といえば当たり前なんですが、わすれがちです。
デフォルトのエイリアスで非修飾のエイリアスが$LATESTになっているので、特に意識しなくてもいいようにはなっているんですが、特殊な設定をしたいといったときには有効です。

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る

停止中のインスタンスのIAMロールを置換するとエラーになる

だいたいタイトルのとおりです。
停止中のEC2インスタンスのIAMロールを置換しようとするとエラーがでて、置換することができません。

以下のようなエラーがでます。

when calling the ReplaceIamInstanceProfileAssociation operation: The association iip-assoc-000000000012345678 is not the active association

そんなときは一度IAMロールをデタッチしてあげる必要があります。
IAMロールA→ロールなし→IAMロールB
といったかんじです。
 

なんでこんなことしなきゃいけないんだと思って調べていたらIAMロールの置換ができるのは実行中のインスタンスのIAMロールだけとのこと。

IAM ロールを置き換える 実行中のインスタンスの IAM ロールを置き換えることができます。

docs.aws.amazon.com

CLIなどでスクリプトを組む際は注意しなきゃいけませんね!

Amazon Web Services 業務システム設計・移行ガイド

Amazon Web Services 業務システム設計・移行ガイド

  • 作者: NRIネットコム株式会社:佐々木拓郎,林晋一郎,株式会社野村総合研究所:瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る

AWSCLI describe-instances でよく使うコマンドまとめ【随時更新】

EC2インスタンスの一覧を見るAWS CLIのdescribe-instancesコマンドでよくつかっているコマンドを紹介します。

リージョン内のすべてのインスタンスの情報を取得

aws ec2 describe-instances

特定のインスタンスIDの情報を取得

aws ec2 describe-instances --instance-ids i-xxxxxxxx

複数指定の場合はスペース区切りでインスタンスIDを列挙する。

aws ec2 describe-instances --instance-ids i-xxxxxxxx i-yyyyyyyy i-zzzzzzzz

起動中のインスタンスのみ取得

aws ec2 describe-instances --filter "Name=instance-state-name,Values=running"

停止中の場合はValues=stoppingで取得可能。
他にもpending,shutting-down,terminated,stoppingが指定可能です。

特定のインスタンスタイプのみ取得

aws ec2 describe-instances --filter "Name=instance-type,Values=t2.micro"

特定のVPC内のインスタンスのみ取得

 aws ec2 describe-instances --filter "Name=vpc-id,Values=vpc-xxxxxxxx"

タグが一致するものを取得

以下の例だとNameタグがwawawaのインスタンスの情報を取得します。

aws ec2 describe-instances --filter "Name=tag:Name,Values=wawawa

リージョン内のインスタンスIDの一覧を取得

aws ec2 describe-instances  --query 'Reservations[].Instances[].InstanceId'

インスタンスIDとインスタンスタイプを取得

aws ec2 describe-instances --query 'Reservations[].Instances[].{instanceid:InstanceId,instancetype:InstanceType}'

インスタンスIDとNameタグを取得

aws ec2 describe-instances --query 'Reservations[].Instances[].{instanceid:InstanceId,Tags:Tags[?Key==`Name`].Value|[0]}'

インスタンスIDとそれにアタッチされているEBSを取得

aws ec2 describe-instances --query 'Reservations[].Instances[].{instanceid:InstanceId,ebs:BlockDeviceMappings[].Ebs.VolumeId}'

インスタンスIDとそれにアタッチされているセキュリティグループを取得

aws ec2 describe-instances --query 'Reservations[].Instances[].{instanceid:InstanceId,security_groups:SecurityGroups[].GroupName[]}'

インスタンスIDとプライベートIPアドレスを取得

aws ec2 describe-instances --query 'Reservations[].Instances[].{ipaddress:NetworkInterfaces[].PrivateIpAddress[]',instanceid:InstanceId}

昇順でソートしてインスタンスIDを取得

aws ec2 describe-instances --query 'sort(Reservations[].Instances[].InstanceId)'

降順でソートしてインスタンスIDを取得

aws ec2 describe-instances --query 'reverse(sort(Reservations[].Instances[].InstanceId))'

インスタンスIDで昇順でソートして、インスタンスIDとプライベートIPを取得

aws ec2 describe-instances --query 'sort_by(Reservations[].Instances[].{ipaddress:NetworkInterfaces[].PrivateIpAddress[],instanceid:InstanceId,name:Tags[?Key==`Name`].Value|[0]},&instanceid)'

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る

IPアドレスを2進数に分解するシェルスクリプト

IPアドレスとサブネットマスクでどこまでがネットワークアドレスなのかがわからなくなることが多かったので作りました。

ちょっとしたひまつぶしに作成したのでエラー処理等まじめにやっていないです。

実行例

こんなかんじで引数にIPアドレスをCIDR表記でわたしてあげるとそれぞれ2進数に変換してくれます。

./address.sh 192.168.10.1/25
Netmask: 11111111 11111111 11111111 10000000
Address: 11000000 10101000 00001010 00000000

コード

ShellScript

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

  • 作者: ブルース・ブリン,Bruce Blinn,山下哲典
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2003/02
  • メディア: 単行本
  • 購入: 18人 クリック: 331回
  • この商品を含むブログ (64件) を見る

冷蔵庫の中身をTrelloでゆるく管理する

さて、今回は我が家のTrello活用法をご紹介します。

我が家ではタイトルにも書いたとおり冷蔵庫の中身をTrelloでゆるーく管理しています。
うまく説明できないのでTrelloの画面をそのままみせるとこんな感じ。

f:id:kabegiwakun:20171212005427p:plain

冷蔵庫、冷凍庫、常温保存している食材をそれぞれ記載しています。

ただし、冷蔵庫の中身をすべて記載するのではなく、管理したいなー腐らせちゃいそうだなーと思うものだけを記載しています。
全部書こうと思うとキリがないですからね。(以前全部管理しようとして挫折しました…)

期限の日付はそのまま賞味期限です。
冷凍庫の場合は冷凍庫に移動させてから1ヶ月後などてきとーに設定しています。
f:id:kabegiwakun:20171212005658p:plain

冷蔵庫をTrelloで管理することのメリット

  • 冷蔵庫の中身がひとめでだいたいわかる
  • 賞味期限もぱっとわかるので便利
  • 冷凍庫も管理することで無限に冷凍庫の奥底で謎の肉が眠っているような状態を防ぐことができる

まとめ

まぁ多少はめんどくさいです。

でも便利!!!

カンバン仕事術

カンバン仕事術

  • 作者: Marcus Hammarberg,Joakim Sundén,原田騎郎,安井力,吉羽龍太郎,角征典,?木正弘
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/03/26
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (7件) を見る

JMeterが無応答になるときの解決方法【GUI】

性能評価や負荷試験でJMeterを利用することも多いかと思いますが、JMeterで負荷かけ開始から30秒~60秒くらいした後にJMeterClientのサーバがCPU使用率100%の応答なし状態になってしまう事象がありました。

解決方法

スレッドグループの「結果をツリーで表示」を無効にする。
f:id:kabegiwakun:20171212003428p:plain

JMeterを利用していて動作が不安定になったときははヒープサイズを上げるという方法が一般的ですが、この「結果をツリーで表示」するが有効の場合ではヒープサイズをいくら上げても意味が無いことがおおいです。

そもそも

CUIでやりなさいよってはなしなのかもしれないですけれどね。

Amazon Web Services負荷試験入門―クラウドの性能の引き出し方がわかる (Software Design plusシリーズ)

Amazon Web Services負荷試験入門―クラウドの性能の引き出し方がわかる (Software Design plusシリーズ)

S3で一定期間が経過したファイルをGlacierに格納する

S3上にアクセスログを定期的に書き込むようなシステムがあったとして、古いアクセスログも残しておこなければならないんだけどそんなに頻繁に利用するわけではないから安価に保存したいといった場合があります。

これらを実現するために S3バケットにライフサイクルルールを設定し、古いログを削除するよう設定します。

ライフサイクルルールの設定手順

ライフサイクルルールの設定はバケット単位で設定します。

バケットの「管理」の「ライフサイクル」から「ライフサイクルルールの追加」を選択します。
f:id:kabegiwakun:20171123200009p:plain

ライフサイクルルールの「ルール名」に任意のルールを設定します。
フィルターの追加も任意で構いません。
これを設定するとtest/ディレクトリ以下のオブジェクトにのみライフサイクルを設定するといった設定ができます。
f:id:kabegiwakun:20171123200434p:plain

移行の設定で「現行バージョン」にチェックを入れ、オブジェクト作成から「AmazonGlacierへの移行の期限」を選択します。
オブジェクト作成からの日数にGlacierへ移行するまでの日数を入力します。
今回は確認のために1日としています。 f:id:kabegiwakun:20171123204855p:plain

設定の失効はとくに何も設定せずそのまま「次へ」でかまいません。
f:id:kabegiwakun:20171123204915p:plain

設定の内容が正しいことを確認して「保存」します。
f:id:kabegiwakun:20171123205219p:plain

S3の設定は以上で完了です。

実行結果

これが f:id:kabegiwakun:20171204162249p:plain
こうなります。
f:id:kabegiwakun:20171204162101p:plain

ストレージクラスがGlacierとなっているのがわかります。
Glacierに新たにボールドが作成されるわけでなく、S3から各オブジェクトを確認することになります。

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Ubuntu16.04で拡張ネットワーキングをONにする【AWS】

EC2で拡張ネットワーキングを有効化する設定方法をご紹介します。

そもそも拡張ネットワーキングとは?

拡張ネットワーキングは、高い帯域幅、1 秒あたりのパケット (PPS) の高いパフォーマンス、常に低いインスタンス間レイテンシーを実現します。拡張ネットワーキングは追加料金なしで使用できます。

Linux の拡張ネットワーキング - Amazon Elastic Compute Cloud

ということです。
つまり有効にするだけで通信が早くなるというすぐれものです。

設定方法

Ubuntuでネットワーキングを有効にする方法を記載します。

環境

  • Ubuntu Server 16.04 LTS (HVM), SSD Volume Type - ami-15872773

ネットワークインターフェイスドライバーを確認する

ethtoolコマンドでネットワークインターフェースで利用されているドライバーを確認します。

driverの箇所がixgbevfとなっていたらOKです。「拡張ネットワーキングの設定を行う」まで読み飛ばしてもらって構いません。
以下の場合はvifとなっているのでネットワークインターフェースの設定を実施する必要があります。

$ ethtool -i ens3
driver: vif
version:
firmware-version:
expansion-rom-version:
bus-info: vif-0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

ixgbevfモジュールをインストールする

まずixdbevfのモジュールのソースをwgetでダウンロードします。

wget "sourceforge.net/projects/e1000/files/ixgbevf stable/2.16.4/ixgbevf-2.16.4.tar.gz"

ダウンロードしてきたファイルを解凍します。

tar -zxvf ixgbevf-2.16.4.tar.gz

パッケージを/usr/srcの移動させます。
dkmsがこのパッケージをビルドできるようにするためです。

sudo mv ixgbevf-2.16.4 /usr/src/.

dkms.confを作成して以下のように値を設定します。
そのままコピーで大丈夫です。

sudo vim /usr/src/ixgbevf-2.16.4/dkms.conf

PACKAGE_NAME="ixgbevf"
PACKAGE_VERSION="2.16.4"
CLEAN="cd src/; make clean"
MAKE="cd src/; make BUILD_KERNEL=${kernelver}"
BUILT_MODULE_LOCATION[0]="src/"
BUILT_MODULE_NAME[0]="ixgbevf"
DEST_MODULE_LOCATION[0]="/updates"
DEST_MODULE_NAME[0]="ixgbevf"
AUTOINSTALL="yes"

dkmsを利用してモジュールを追加します。

sudo dkms add -m ixgbevf -v 2.16.4

モジュールをビルドします。

sudo dkms build -m ixgbevf -v 2.16.4

モジュールをインストールします。

sudo dkms install -m ixgbevf -v 2.16.4

拡張ネットワーキングの設定を行う

インスタンスに拡張ネットワーキングの設定を行うには、AWSCLIで以下のコマンドを実行します。

$ aws ec2 modify-instance-attribute --instance-id i-xxxxxxxxxxxxxxxxx --sriov-net-support simple

以下のAWSCLIを実行し、SriovNetSupportValuesimpleとなっていればOKです。

$ aws ec2 describe-instance-attribute --instance-id i-xxxxxxxxxxxxxxxxx --attribute sriovNetSupport
{
    "SriovNetSupport": {
        "Value": "simple"
    },
    "InstanceId": "i-xxxxxxxxxxxxxxxxx"
}

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

S3で一定期間が経過したファイルをライフサイクルで削除したい

S3上にアクセスログを定期的に書き込むようなシステムがあったとして、古いアクセスログを自動的に消す仕組みを作ってみたいと思います。

これらを実現するために S3バケットにライフサイクルルールを設定し、古いログを削除するよう設定します。

ライフサイクルルールの設定手順

ライフサイクルルールの設定はバケット単位で設定します。

バケットの「管理」の「ライフサイクル」から「ライフサイクルルールの追加」を選択します。

ライフサイクルルールの「ルール名」に任意のルールを設定します。
フィルターの追加も任意で構いません。
これを設定するとtest/ディレクトリ以下のオブジェクトにのみライフサイクルを設定するといった設定ができます。

以降の設定は今回はそのまま「次へ」を選択します。
Glacierなどに以降するライフサイクルを設定する場合にはここで設定を行います。

ライフサイクルルールで削除の設定を行います。
「オブジェクトの現行バージョンを執行する」の箇所が重要です。
たとえば30日より前のログが不要である場合には30を設定します。
今回はテストのために1日経過したオブジェクトを削除するように設定しています。

設定を確認して、「保存」を選択します。

実行結果

これが

一日後…

「s3_index.html」が削除されていることがわかります。

まとめ

ライフサイクル機能をつかうことで手動で過去ログを削除するといったわずわらしさから開放されます。

消し忘れや誤った削除も発生しませんので是非活用してみてください。

S3で有効期限付きの署名付きURLを作成する

S3で署名付きURLを利用してユーザごとに別々のURLを発行できるようにしてみたいと思います。

手順

対象のディレクトリに対するアクセス権を無効にする

まずは署名付きURLを利用するコンテンツを配置するディレクトリに誰もアクセス出来ないようにアクセス権を設定します。

基本的にはなにもしなくてOKです。
バケットポリシーに何も指定しなければ暗黙的拒否扱いになり、オブジェクトへのアクセスは拒否されます。

署名付きURLをつくる

署名付きURLを作成していきます。
例として「/wawawa/s3_index.html」というコンテンツに署名URLを作成していきます。

署名付きURLはAWSCLIを使うことで作成できます。
以下のようなコマンドを実行します。

aws s3 presign s3://kabegiwa-secret/wawawa/s3_index.html --expires-in 3600

実行すると以下のようなURLが応答されます。
URLはコマンドを実行するたびに新しいものが生成されます。

https://kabegiwa-secret.s3.amazonaws.com/wawawa/s3_index.html?AWSAccessKeyId=AKIAJ4M6D6DG7LQHQ53A&Expires=1511184525&Signature=mFMiY7%2BMoJm%2FOsWB1D6Wp0jWqj8%3D

ちなみにコマンドのオプションの--expires-in 3600はこの署名付きURLは3600秒有効だという意味です。
URLの生成から3600秒=1時間経過するとこのURLは無効となり、アクセスできなくなります。

Amazon Web Services企業導入ガイドブック -企業担当者が知っておくべきAWSサービスの全貌から、セキュリティ概要、システム設計、導入プロセス、運用まで-

Amazon Web Services企業導入ガイドブック -企業担当者が知っておくべきAWSサービスの全貌から、セキュリティ概要、システム設計、導入プロセス、運用まで-

  • 作者: 荒木靖宏,大谷晋平,小林正人,酒徳知明,高田智己,瀧澤与一,山本教仁,吉羽龍太郎
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2016/06/10
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

S3へのアクセスログを記録する

S3にはアクセスログを記録する機能があります。
その機能を有効にすると、別のS3バケットにログを記録することができます。

手順

ログ格納用のバケットを作成する

まずはログを格納するためのバケットを作成します。
バケットの名前はなんでもよいです。
今回は「kabegiwalog」という名前のバケットを作成しました。
f:id:kabegiwakun:20171119221235p:plain

バケットのログ記録を有効にする

アクセスログを記録したいバケットで「ログ記録」機能を有効にします。

アクセスログを記録したいバケットに移動し「プロパティ」タブを選択、「サーバーアクセスのログ記憶」を選択して、さきほど作成したバケットをターゲットバケットに指定します。
ターゲットプレフィックスは特に指定がなければそのままで構いません。
f:id:kabegiwakun:20171119221634p:plain

アクセスログを確認してみる

上記の設定をして1時間くらいするとログが書き出されるようになりますのでしばらく待ちます。

1時間後…
アクセスログが無事格納されました!
f:id:kabegiwakun:20171119232814p:plain

ログの中身については以下の公式ドキュメントが役に立ちます。

docs.aws.amazon.com

まとめ

S3でアクセスログを記録することができました。
ただ、このログの記録はベストエフォートであり、確実に記録される保証はありません。(実際はほとんど欠落することはないようですが)

即座に保存されるわけではなく、保存されるのにしばらく時間がかかるのもデメリットです。

ですが、かんたんでログの記録そのものには料金はかかりませんので、検討してみるのもいいかもしれません。

Amazon Web Services パターン別構築・運用ガイド 一番大切な知識と技術が身につく

Amazon Web Services パターン別構築・運用ガイド 一番大切な知識と技術が身につく

S3と独自ドメインでウェブサーバを構築する

S3にはストレージとして利用する以外にもうひとつの使い方があります。
それは静的コンテンツを公開するWebサーバとしての使い方です。

S3には静的ウェブホスティング機能というものがあり、この機能を有効にするとS3に保存したファイルをWebサイトとして公開することができます。

手順

独自ドメイン名でS3バケットを作成する

独自ドメイン名でS3バケットを作成します。
たとえば当ブログのドメイン名でもある「www.kabegiwablog.com」で運用するのであれば「www.kabegiwablog.com」というバケットを作成します。
f:id:kabegiwakun:20171119112612p:plain

静的ウェブホスティングを有効にする

作成したバケットのプロパティを開き「Static website hosting」を選択します。
設定項目が開くので「このバケットを使用してウェブサイトをホストする」を選択し、「保存」します。
「インデックスドキュメント」と「エラードキュメント」はそれぞれ「index.html」と「error.html」で構いません。
f:id:kabegiwakun:20171119113158p:plain

バケットポリシーを設定する

現時点ではアクセス許可をだれにもしていない状態ですのでバケットポリシーでオブジェクトへのアクセス許可を与えます。

バケットの「アクセス権限」から「バケットポリシー」を選択してバケットポリシーエディターに以下のように入力します。
f:id:kabegiwakun:20171119114628p:plain

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.example.com/*"
        }
    ]
}

"Resource": "arn:aws:s3:::www.example.com/*"の箇所は自分のバケットのARNに読み替えてください。

実際に設定されたかどうか確認してみます。
S3に任意の内容の「index.html」ファイルをアップロードし、S3のエンドポイントのURLを指定してブラウザでアクセスしてみると、以下のようにファイルの中身が見れるはずです。
f:id:kabegiwakun:20171119115557p:plain

S3のエンドポイントのURLは静的ウェブホスティングを有効にした際と同じく、バケットのプロパティを開き「Static website hosting」を選択したところに記載があります。
f:id:kabegiwakun:20171119115800p:plain

Route53で独自ドメインを設定する

S3へのアクセスはできるようになりました。
つづいて独自ドメインでアクセスできるように設定します。

具体的にはAレコードのAlias機能を利用します。

Route53で「Create Record Set」を選択して、それぞれ以下のように設定します。

  • Name - www.
  • Type - A - IPv4 address
  • Alias Target - バケットの一覧が出てくるので今回作成したバケットを選択

f:id:kabegiwakun:20171119121310p:plain
 

以上で設定は完了です。
さて、独自ドメインでアクセスしてみると、S3上のオブジェクトにアクセスできるようになっているはずです。
f:id:kabegiwakun:20171119121559p:plain

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス

JMeterを複数サーバで実行する

今回はjmeterを複数のサーバで同時に実行する方法をご紹介します。

JMeterとは?

システムのパフォーマンス測定や負荷テストを実施できるOSSのソフトです。
HTTPレスポンスの内容を判定することもできるのでWebコンテンツの妥当性確認にも利用することができます。

JMeterを複数サーバで実行する

さて、JMeterを複数サーバで実行してみたいと思います。

JMeter試験構成

今回は以下のようにJMeter-Clientから指示を出してJMeter-ServerがWeb-Serverへ負荷テストを実行するような構成を取ってみます。

f:id:kabegiwakun:20171118215150p:plain

JMeter-Clientの設定

JMeterの設定ファイルを編集します。
JMeterをダウンロードしたフォルダ配下のbin/jmeter.propatiesをテキストエディタで開きremote-hostsの部分にJMeter-ClientのIPアドレスを入力します。

remote_hosts=172.1.1.1:1099,172.1.1.2:1099,172.1.1.3:1099

JMeter-Serverの設定

基本的に設定するものはありません。

実際に動かしてみる

テスト内容は普段のJMeterの設定方法と同じように設定またはjmxファイルをJMeter-Clientに読み込ませます。  

JMeter-Serverのサービスを起動

jmeter-server.batを起動します。

JMeter-Clientのサービスを起動

GUIを使う方法

jmeter.batを起動します。
赤枠のリモートで起動のボタンを押下します。
f:id:kabegiwakun:20171118223214p:plain

CUIを使う方法

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

jmeter -n -t test.jmx -r

Amazon Web Services負荷試験入門―クラウドの性能の引き出し方がわかる (Software Design plusシリーズ)

Amazon Web Services負荷試験入門―クラウドの性能の引き出し方がわかる (Software Design plusシリーズ)