Amazon Linux 2 を VirtualBox でオンプレミスの開発環境に使用する

概要

  • Amazon Linux 2 が発表
  • EC2だけでなく、Docker や VMwareやVirtualBox、Hyper-V などの仮想環境で使用可能
  • ローカルの開発環境で使いたい!

Amazon Linux 2 とは

↓ここを参照
Amazon Linux 2
Introducing Amazon Linux 2

イメージのダウンロード

↓ここから
Amazon Linux 2 virtual machine images

VirtualBox で Amazon Linux 2 起動する

ポイント

ログインユーザーのパスワードやSSHの公開鍵は cloud-init で設定する

↓詳しくは
README.cloud-init

cloud-init のファイルを格納したISOイメージを作成

以下の作業は Amazon Linux AMI 2017.09.1 のEC2インスタンスで作業しました。
( genisoimage が使用できればどこでも良いはず)

genisoimage コマンドのインストール

$ sudo yum -y install genisoimage

meta-data ファイルを作成

meta-data ファイルの内容
(ホスト名はお好みで)

local-hostname: localhost.localdomain

user-data ファイルを作成

user-data ファイルの内容
(パスワードに secret を設定する場合)

#cloud-config

chpasswd:
  list: |
    ec2-user:secret

ISOイメージの作成

$ genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

注意: ボリュームIDは cidata を指定

VirtualBox に新規仮想マシンを追加

  1. ハードディスクにダウンロードした Amazon Linux 2 のイメージを指定

新規仮想マシンの追加

  1. cloud-init のファイルを格納したISOイメージを起動ドライブにマウント

ストレージ設定

VirtualBox の仮想マシンを起動

ユーザー ec2-user / パスワード user-data で指定したパスワード でログインできます

その他

SSHで使用する公開鍵を user-data で登録する方法

↓設定方法のサンプル
Cloud config examples — Cloud-Init 17.1 documentation > Configure instances ssh-keys

まとめ

Amazon Linux がオフラインの開発にも使用できるようになりました。
現在はまだ LTS Candidate ということなので、LTS バージョンがリリースされるのが楽しみです。

参考

続きを読む

CodeCommitのリポジトリをghqでクローンする

使ったもの

AWS CodeCommit

AWSの提供するソースコントルーロサービス、GithubやBitbucketのようにGitリポジトリを管理できます。
https://aws.amazon.com/jp/codecommit/

小規模であれば無料枠で収まりそうなのと、CodePipelineなどのサービスとの連携が楽そうなので使ってみることにしました。
https://aws.amazon.com/jp/codecommit/pricing/
http://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/integrations.html

ghq

ghqはリポジトリの管理を楽にしてくれるツール、pecoやfzfと合わせて使うのがおすすめです。
https://github.com/motemen/ghq

細かい紹介はしませんが気になる方は他の記事をどうぞ。
https://qiita.com/search?q=ghq&sort=stock

やったこと

CodeCommitのリポジトリを作成

コンソールからリポジトリ名を決めて作成するだけ。

もしくはcliから aws codecommit create-repository --repository-name hoge としてもOK。
プロファイルで設定しているリージョンにリポジトリが作成されます。
http://docs.aws.amazon.com/cli/latest/reference/codecommit/create-repository.html

CodeCommitに接続するためにIAMユーザーにsshキーを設定

sshキーを作成しパブリックキーをIAMユーザーに登録します。
このIAMユーザーはCodeCommitにアクセスできるようポリシーを設定しておく必要があります。
http://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-unixes.html

コンソールから作業していれば以下のように接続方法が表示されるのでわかりやすいと思います。

スクリーンショット 2017-12-14 14.15.13.png

ここまで終わればsshでリポジトリに接続できるようになります。

ghqでリポジトリをクローン

CodeCommitのリポジトリをクローンするにあたって上にあるように git clone でもいいのですが、せっかくなので普段から使っているghqを使いたいですね。

ghqでは以下のようにすればクローンできました。

$ ghq get ssh://git-codecommit.REGION.amazonaws.com/v1/repos/REPO

ここで注意するのは -p オプションをつけないことです。
-p オプションをつけるとsshのユーザーがgitになってしまい、CodeCommit用のユーザーと違うので Please make sure you have the correct access rights となってしまいます。

コマンドを実行してもらうとわかりますが -p をつけた場合 ssh://git@ となっています。

# 成功
$ ghq get ssh://git-codecommit.REGION.amazonaws.com/v1/repos/REPO
git clone ssh://git-codecommit.REGION.amazonaws.com/v1/repos/REPO
# 失敗
$ ghq get -p ssh://git-codecommit.REGION.amazonaws.com/v1/repos/REPO
git clone ssh://git@git-codecommit.REGION.amazonaws.com/v1/repos/REPO
# これも失敗
$ ghq get -p https://git-codecommit.REGION.amazonaws.com/v1/repos/REPO
git clone ssh://git@git-codecommit.REGION.amazonaws.com/v1/repos/REPO

あるいはIAMユーザーにHTTPS Git 認証情報を設定しておけばユーザー名とパスワードでも接続できます。

$ ghq get https://git-codecommit.REGION.amazonaws.com/v1/repos/REPO
Username for 'xxxx':
Password for 'xxxx':

error Could not find version control system というエラーが出る場合はREADMEにあるように .gitconfig に以下の記述をしておけばOKです。

[ghq "CODECOMMIT-URL"]
  vcs = git

続きを読む

aws ec2で、pythonスクリプトを定期自動実行するまで

はじめに

pythonで書いたスクリプトを、定期実行したかったのでサーバ上に動くようにしました。スクリプトの内容はスクレイピングとブログに自動投稿です。毎日一回だけなので、最初は手動でやっていましたが、勉強も兼ねてaws ec2を借りて動かしてみました。初めてのクラウド体験。

EC2インスタンスを起動まで

EC2インスタンスを作成するにはこの記事を参照すると良いと思います。無料枠で作成する場合は、設定なども参考になると思います。AWS側も丁寧に誘導してくれるので、そこに乗っかればいけました。

ec2インスタンスを作成した後

インスタンス上でpythonスクリプトを動かすのに行うことは、以下のことです。

  1. サーバにSSHでログイン
  2. サーバ上にpythonをインストール、仮想環境(venv)を作成
  3. ローカル開発環境にあるファイルやライブラリをサーバ上に同期
  4. スクリプトを定期実行するために、サーバ上のcronの設定

以上の作業でローカルにあるpythonスクリプトを、ec2インスタンス上で自動実行することができました。
それぞれ方法を見ていきましょう。

サーバにSSHでログイン

~/.ssh/config内
Host ec2:
 HostName <インスタンスのIPアドレス>
 User ubuntu
 IdentiFile <ダウンロードしたキーペア名.pemへのパス>

~/.ssh/config内に記述して、以下のコマンドでログインできます。

ssh ec2

サーバ上にpythonをインストール、仮想環境(venv)を作成

サーバ上にpythonとvenvをインストール/作成しましょう。

sudo apt-get install -y python3 python3.4-venv
python3 -V
python3 -m venv sample  仮想環境作成
. sample/bin/active 仮想環境に入る

ローカル開発環境にあるファイルやライブラリをサーバ上に同期

ローカルのファイルをサーバ上に同期するにはいくつか方法があると思いますが、今回はrsyncを使用します。

rsync -av <ファイル> ec2:パス

後は同期するファイルをこのコマンドで叩けば良いだけです。

同期するのは、ライブラリ集であるpip freeze実行するスクリプトです。前者は以下のようにテキストファイル化すると良いと思います。

pip freeze > requirements.txt 

スクリプトを定期実行するために、サーバ上のcronの設定

サーバ上で自動実行を行うためにはcronを設定します。そのためには/etc/crontabを編集しましょう。殆どがコメントになっていると思いますが、自動実行する時刻とコマンドをここに書くことで実装できます。

設定するには、左から分、時、日、月、曜日、ユーザ、コマンド内容の順番で記載していきます。以下の例は、毎日22時42分にコマンドを実行する例です。
また、実行するコマンドは分かりやすくシェルスクリプトにまとめてますが、まとめなくても大丈夫かもしれません。

# m h dom mon dow user  command
42 22   * * *   ubuntu  /home/ubuntu/run_script.sh > /tmp/run_script.log 2>&1

これでサーバ上で定期自動実行できました。

終わりに

awsの無料枠というのはec2起動時間が月に750時間までらしいです。なので一つのインスタンスを月にずっと起動してたら730時間なので、それだけで埋まってしまいます。
日に一度のみの定期実行したいだけならば、他の方法があると思うので調べてます。
aws lambdaがそれっぽい。

続きを読む

Amazon Linux 2を見る

Amazon Linux 2


       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|___|___|

https://aws.amazon.com/amazon-linux-2/

Amazon Linux 2が発表されました。
https://aws.amazon.com/jp/about-aws/whats-new/2017/12/introducing-amazon-linux-2/

ec2-metadata

[root@ip-10-5-32-70 ~]# ec2-metadata
ami-id: ami-2a34b64c
ami-launch-index: 0
ami-manifest-path: (unknown)
ancestor-ami-ids: not available
block-device-mapping:
         ami: /dev/xvda
         root: /dev/xvda
instance-id: i-071c4a39e70ae745b
instance-type: t2.nano
local-hostname: ip-10-5-32-70.ap-northeast-1.compute.internal
local-ipv4: 10.5.32.70
kernel-id: not available
placement: ap-northeast-1a
product-codes: not available
public-hostname: ec2-13-112-183-81.ap-northeast-1.compute.amazonaws.com
public-ipv4: 13.112.183.81
public-keys:
keyname:galaxy
index:0
format:openssh-key
key:(begins from next line)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCehg0RkIeCPg94jpFM7hqQXYWD8BdVyewE3836SnSA2lKsiHKmo+dhzZg8u70eDaevOXvQNrumXdJUWN76gemO9JB1IfjNjECZqRXOFc3yHheQMWbimcLAT3W39/MjXja2Amjy539qjfJ5blknQUPi3InnGae0TDutXQN1UX6oU3y5JBZOoi1kQi8Jth34LpoS5qXs/+i7DFlhNA7YXNzAqTnksbXPA6G7Ww0+xFLLTaXUfbhQydM3rkCU7ABGEUlodhU6BKFMmDltXEC9Q7nCghETZdFgF3lVTOOM3Tsb+e890+OcW7Nf3CGR57LABX+FwxvW2jGNarhWP9oR/8T1 galaxy
ramdisk-id: not available
reservation-id: r-0f55ec655c1e51a0b
security-groups: lithium-prod-web
user-data: not available

ami-id: ami-2a34b64c

uname

[root@ip-10-5-32-70 ~]# uname -a
Linux ip-10-5-32-70.ap-northeast-1.compute.internal 4.9.62-10.57.amzn2.x86_64 #1 SMP Wed Dec 6 00:07:49 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

amzn2

systemd support

[root@ip-10-5-32-70 ~]# ps u -p 1
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.8  1.0 125280  5256 ?        Ss   04:28   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21

Python

記事にはこう書いてあります。

Additional software packages, including the newer versions of popular software packages such as Python, MariaDB, Node.js, are available for installation using the Amazon Linux Extras repository.

さぞ新しいバージョンが入っていることでしょう。

the newer versions

[root@ip-10-5-32-70 ~]# python --version
Python 2.7.5

これだから…

続きを読む

【インターン】実際に依頼した仕事と今後の課題を列挙するよ(2017年12月版)

はじめに

この記事は、【インターン】実際に依頼した仕事と感想を列挙するよ(だいたい技術要素ベース)の続編です。
2ヶ月の間の特筆すべき差分と、今後の課題などを記載します。

想定読者など

  • 学生:インターンを検討している人/参加している人

    • 技術的な意味で、インフルのエンジニアインターンでどのような事をするのか、なんとなくわかります。
    • 他の人がどんな事をしていたのか、網羅的になんとなくわかります。
  • その他企業の人:インターン実施を検討している人
    • うまくインターンの学生を集めれば、このような作業を依頼できるかも?という実例を知る事ができます。

株式会社インフルについて

2017年1月創業、3月より本格始動して、自社Webサービスを複数展開している会社です。各サービスの詳細は割愛しますが、自社サービスのアジャイル的な開発・運営を軸として、基幹システムやその他業務システムの受託開発もやっています。

依頼した仕事など

前回までで、以下のような技術を用いた作業を依頼していました。(各技術の概要などは前回記事を参照ください。)

  • 実装関連

    • 開発環境構築

      • 多段ssh/portforward(ssh tunnel)
      • git/bitbucket(ソース管理)
      • PyCharm/WebStorm etc.(IDE)
      • SequelPro(MySQL管理ツール)
      • alembic(DBバージョン管理)
      • node
    • python
      • flask(軽量WEBフレームワーク)
      • SQLalchemy(ORM)
      • ※redis(redisはインメモリDB)
      • WTForm(フォーム、バリデーション)
      • PyBabel(i18n)
      • ※GrabzIt(画像出力API)
      • ※opencv(画像処理)
      • xlrd(エクセル加工)
      • apscheduler(スケジューラ)
      • pytest(単体テスト)
      • pandas(データフレーム処理)
      • Apriori(aprioriアルゴリズム:アソシエーションルール)
    • TypeScript/JavaScript
      • angular(定番)
      • react
      • react-redux
      • d3(データビジュアライズ)
      • highcharts(チャート)
      • introjs(チュートリアル的な奴)
      • snowshoe(電子スタンプ、通信先必須)
      • wScratchPad(スクラッチ削る奴)
      • japan-map(日本地図)
      • jquery-gantt(ガントチャート)
      • jcrop(画像切り抜き)
      • add to homescreen(ホーム画面に追加を促すバルーン)
      • add to calendar(カレンダーに追加する機能)
      • bootstrap-tagsinput(タグ入力的な奴)
      • bootstrap-colorpicker(カラーピッカー、色を選ぶ奴)
      • image-picker(画像とか選ぶ箱)
      • slick(スライダー)
      • exif.js(EXIF取得)
    • テストほか
      • locust(負荷試験)
      • owasp zap(脆弱性診断)
      • squash-tm(テスト管理)
      • circle ci(CI環境)

以下、前回との特筆すべき差分です。

本番環境構築

本番環境を顧客別に用意する場面が出たので、管理監督しながら、全くゼロの状態からの構築を実際にやって貰いました。具体的な内容は以下のようなことです:

NAT用インスタンスの作成、設定

EC2インスタンスの作成

RDSの開始、設定

ElastiCache(Redis)の設定

EC2のサーバーにansible使って関連ツール、製品のデプロイ

S3の開始、設定

SESの開始
、設定

zabbixの設定

bugsnagの設定

これらは全て手順までQiita:Teamにまとめてもらったので、誰でも本番環境(相当の環境)を構築できるようになりました。

(モバイル)ネイティブアプリ作成

cordova + vue

android

製品の利用

FileMakerを用いた業務システム開発

クライアントの自動テストの仕組み構築

ざっくりとした指示だけで、以下の様なものを組み合わせてTypeScriptのUT環境を作ってもらいました。

karma

jasmine

istanbul

他社API連携

決済インターフェイス構築

進捗のあった課題

情報共有

当初はポータルサイトの充実+slackの充実を考えていたのですが、インターン生の提案によりQiita:Teamを採用しました。
いま記事数で125件かな?半分ぐらい私が書いていますが、10000件を超えると消えてしまう無料slackのダイレクトメッセージを探すよりは生産的になったかなあと思います。
slackを有料にするのと、Qiita:Teamを使うのとでコスト的な比較は難しいですが…
ただ、インターン生が圧倒的多数を占めるような会社においては、個人の利用時間と金額のバランスが通常の会社よりも不利なので、ちょっと優しくしてくれる仕組みがあってもいいのになーと思っています。

課題整理・進捗管理

一部では課題管理表を使い始めました。全員で使っている訳ではありません。
現状、通常運用に乗っているサービスはJooto、乗ってないサービスの開発中の課題は課題管理表、という感じです。

顧客からの様々なヒアリング方法

インターン生とは全員と漏れなく機密保持契約を結んでいるので、業務上必要な範囲でQiita:Teamに議事録に相当する資料や、見積記録等を記載するようにしています。

「仕事」の仕方、自分自身のコスト意識

可能な範囲でちょいちょい仕事の仕方についての言及を含めるようにしました。
あとは、少し緩めの設計資料(例えばエンドポイントの一覧表、APIとDBの項目のマッピング一覧表、などのようなもの)を、WBSとしても使えるよう明示的に作成指示するようにしました。

勉強会の開催

各人が主体的に成果を発表するという意味での勉強会は開催していないのでまだ足りずですが、とりあえず設計講習会を開催してみました。記録は以下:

https://youtu.be/_knn0zoYbho
https://youtu.be/RmoMgraSTtk

進捗のあまりない課題・新しい課題

インターン生内のソースレビュー構造(?)

最終的な確認は逃せないとしても、その手前ぐらいまでのレビューぐらいまでは任せて、自律的な集団にしたい。(組織構造を入れる、のに近いのかな)

結合以上のテストの自動テスト

全く手付かず。テストシナリオとかも手付かず…

詳細設計の書き方

ほぼ手付かず。

単体テストケースの書き方(境界値とか、C0とか、0件・1件・複数件とか、の概念も含む)

ほぼ手付かず。網羅的に微妙なバグを潰す作業よりも、まだまだ根本的に新しい機能の実装を優先することが多い状況。

面談

ちゃんとフィードバックの面談をしないといけないのですが、忙しいという理由をつけてちゃんと実施出来ていないので、きちんとやらないといけません。。。うーん。

その他、感想など

飲み会でオールする人はだいぶ少ない

時代の流れなのかな?まだ警戒されているのかしら、、、
まあ、みんな結構忙しいので、あんまりオールとかできないのかなーという感じもしますが。

医学部生でもインターンを探している

複数名、医学部生の方が作業をしていますが、偉いですね。

4〜5月も9月も応募数はほとんど変わらない

1日1名以上のペースで応募がありました。弊社は渋谷から南麻布(白金高輪)に移転したのですが、それぐらいの移動だと場所はほとんど関係ないように感じました。

おしまい

有給インターンがもっと増えますように!

続きを読む

Fargateって秒速何センチメートルでスケールアウトするの?

2018年早々には、昨年の大ヒット作が地上波初登場!
この機会に同監督の過去作を見直してみるのはいかがでしょうか。


はい。
そんなわけでFargateです。

約1年ほどECSでサービスを運用してきました。
コンテナを起動した時の驚き。Vagrantとは次元が違う爆速感。

これはDockerの時代くるわ〜

と手元の開発環境をDocker化。勢い余ってサーバーサイドまでコンテナ化しました。
が、ふと我に返って足元を覗き込んで見ると、ECSはマネージドというにはあまりに急造に組んだ足場よろしくその土台にあるEC2がスケスケ。
定期的にEC2のAMIとコンテナのイメージ双方で、yum updateやらapt updateやらapk updateしちゃったりしなかったりして、これって単にお守りする層が二倍になってるんちゃうん!?
と疑心暗鬼にとらわれておりました。
Lambda使ってAMIをアップデートする例なんかも公開されてますけど、なんかこう違うんですよ。

AMI にパッチを適用し、Auto Scaling グループを更新する
http://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-asgroup.html

そんなとこにリソースを割きたくないんですよぉぉ。箸より重いものを持ちたくないんですよぉぉぉぉ。

そこに颯爽と登場したのが、我らがFargateです。
実際チュートリアルに従ってFargate製クラスタをつくってみても、EC2のページはもぬけの殻。
これだ!
これを求めていたんだ!

気になるお値段に関しては既に素晴らしいポストが並んでおります。

俺はSSHをしたくない ~ Fargate vs ECS+SpotFleet のPrice比較 ~
http://tech-blog.abeja.asia/entry/fargate-ecs-spotfleet

新しいマネージドコンテナサービスAWS Fargateの価格は高いか安いか?ECS/Fargateのコスト最適化を考えてみよう
https://qiita.com/sudoyu/items/cde059bf98f3d32cfa61

次はスケール速度だっ!
ECS+EC2の時は、Cloudwatchのアラーム発報からオートスケール発動、EC2の起動完了まで約5分、そこからECSのAgentが最適な数にコンテナを増やすまでさらに5分で体感10分くらい待っていた感じでしたがはたして….。

前提

AWS FargateでNginxを動かしてみる
https://qiita.com/riywo/items/b223bdad2b3ae3bebf55

恥ずかしげもなく2日目の記事の内容を完全トレースして環境を構築します。
その後、またまた本記事記載のスケールアウト方法を試してその結果をストップウォッチで計測。
せめてecs-clitimeで計測しろや〜とはごもっともなご意見ですが、残念ながら秒速で起動!というほどには爆速ではないのはわかりきっているので省エネです。ご容赦を。

結果

回数 要した時間(分:秒)
1 2:21
2 1:11
3 2:20
4 0:59
5 1:45
6 1:11
7 1:53
8 1:47
9 2:15
10 2:14

ばらつきはありますが、ざっくり2分程度待てばスケールする模様。アラート発報からの待ち時間を考えても5分もあればスケールしてくれるんではないでしょうか。ECS+EC2の時のざっくり半分くらいのイメージです。ざっくりいいすぎですみません。

sorryページを青ざめながら眺める時間が半減するのであれば、それだけでもFargateに乗り換える価値ありかもしれません!

はよ東京リージョンにこい〜!

続きを読む

KubernetesをAWSで運用するときの前提条件を満たす

EKSが発表された今、AWSでのKubernetesを見直したい。

AWSで運用するときの前提条件

KubernetesをAWSで運用しようというとき、比較的忘れがちなのが以下の条件です。

m4よりm3というのは、EBSよりアクセスが安定していて高速なインスタンスストアが利用できるからですね。
インスタンス終了とともに消えてしまうインスタンスストアですが、コンテナは揮発性なので、それが乗っかるホストのディスクも揮発性でいいでしょという…1

また、Dockerのストレージドライバでdevicemapperを使用している際、loop-lvmモードは本番環境で推奨されていません。
http://docs.docker.jp/engine/userguide/storagedriver/device-mapper-driver.html

ループバックデバイスを使っていると、コンテナの展開は遅くなり、コンテナ内のファイル読み書き速度も劣化するはずですが、RHEL系のOSだと多くの場合、デフォルトの設定がdevicemapperloop-lvmです2

https://www.school.ctc-g.co.jp/columns/nakai/nakai68.html

そういうわけで、この記事では、

  • インスタンスストアのあるm3.largeでKubernetesクラスタを構築し、
  • インスタンスストアにDockerストレージを置きdevicemapperdirect-lvmモードを使う

という条件でKubernetesのクラスタを構築してみます。クラスタ構築にはkubeadmを使用します。

デフォルトのストレージドライバ

とはいえ、よく使われている構成ツールの場合はDockerストレージをループバックデバイスに作ることはないようです。

kubeadmや手作業でクラスタを構築する場合、dockerインストールは自分でやる必要があるので、RHEL系で普通にセットアップするとdocker infoの結果が以下のようになります。

# CentOSに普通にdockerをyumでインストールした場合

$ sudo docker info
Storage Driver: devicemapper
 Pool Name: docker-202:1-4210412-pool
 Pool Blocksize: 65.54 kB
 ...
 Deferred Deleted Device Count: 0
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.

WARNINGで怒られてますね。これを正しくセットアップしようというのがこの記事の主旨になります。

一方、メジャーな構成ツールであるkopsでk8sクラスタを構築すると以下の通りです。

# kopsで構成した場合のDocker Storage

Server Version: 1.13.1
Storage Driver: overlay
 Backing Filesystem: xfs

kube-awsはContainer Linuxを使用していますが、以下の様にContainer LinuxはデフォルトでDockerストレージが正しく設定されているので大丈夫そうです。

# Container Linux

Server Version: 1.12.6
Storage Driver: overlay
 Backing Filesystem: extfs

kubesprayも、インストールプロセスでエラーが出たので実際の挙動は見てませんが、コード上だとdocker-storge-setupというDockerストレージのセットアップ実行コードがあったので大丈夫そうですね。

プロダクション運用を考えた際overlay2overlayを使用するのが本当は良さそうですが、overlay2にカーネルv4.0以降が必要なことやCentOSでdevicemapperが推奨されていること、Dockerの公式ページであまりoverlayを推奨してないことから、今回はdevicemapperdirect-lvmをセットアップします。

https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/
https://docs.docker.com/engine/userguide/storagedriver/selectadriver/#docker-ce

(あと、別のディスクにDockerストレージをセットアップすることで、Dockerストレージの使用率が増えてきたときもOS、Kubernetesの動作に与える影響が少なく、安定することが期待できそう)

m3系のインスタンスを作成し、インスタンスストアをアタッチする

まず、AWSでインスタンスを作成して、インスタンスストアをアタッチします。
今回はmaster(&etcd)1台、worker1台で構成するので2つインスタンスを立ち上げます。
パブリックサブネットに、通常通りm3.largeのインスタンスを立ち上げますが、以下のようにインスタンスストアもアタッチしておきます。

スクリーンショット 2017-12-13 12.04.33.png

セキュリティグループは、面倒だったので今回はインスタンス間全通しで行きます。
スクリーンショット 2017-12-13 12.10.53.png

Dockerのセットアップ

kubeadmは、実行前にクラスタのノードにdockerkubeletをインストールしておく必要があります。

https://kubernetes.io/docs/setup/independent/install-kubeadm/

ここでdockerをインストールした際に、Dockerストレージのセットアップも実行しておきます。

$ ssh centos@k8s-master

$ sudo su -

$ yum install -y docker

awsのインスタンスストアは以下のようにマウント済みなので、そのままDockerストレージとしてセットアップしようとすると失敗します。
そのため、前もってアンマウントします。

$ lsblk

NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0  30G  0 disk /mnt

$ umount /mnt
$ lsblk

NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0  30G  0 disk 

インスタンスストアの/dev/xvdbデバイスをDockerストレージとしてセットアップします。

# 設定ファイルの作成
$ cat << EOT > /etc/sysconfig/docker-storage-setup
DEVS=/dev/xvdb
VG=docker-vg
WIPE_SIGNATURES=true
EOT

# 以下コマンドでDockerストレージをセットアップ
$ docker-storage-setup

INFO: Volume group backing root filesystem could not be determined
INFO: Wipe Signatures is set to true. Any signatures on /dev/xvdb will be wiped.
/dev/xvdb: 2 bytes were erased at offset 0x00000438 (ext3): 53 ef
INFO: Device node /dev/xvdb1 exists.
  Physical volume "/dev/xvdb1" successfully created.
  Volume group "docker-vg" successfully created
  Using default stripesize 64.00 KiB.
  Rounding up size to full physical extent 32.00 MiB
  Thin pool volume with chunk size 512.00 KiB can address at most 126.50 TiB of data.
  Logical volume "docker-pool" created.
  Logical volume docker-vg/docker-pool changed.

$ lsblk

NAME                              MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda                              202:0    0   8G  0 disk 
└─xvda1                           202:1    0   8G  0 part /
xvdb                              202:16   0  30G  0 disk 
└─xvdb1                           202:17   0  30G  0 part 
  ├─docker--vg-docker--pool_tmeta 253:0    0  32M  0 lvm  
  │ └─docker--vg-docker--pool     253:2    0  12G  0 lvm  
  └─docker--vg-docker--pool_tdata 253:1    0  12G  0 lvm  
    └─docker--vg-docker--pool     253:2    0  12G  0 lvm  

Dockerストレージがセットアップできました。dockerサービスを起動します。

$ systemctl enable docker && systemctl start docker
$ docker info

Storage Driver: devicemapper
 Pool Name: docker--vg-docker--pool
 Pool Blocksize: 524.3 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file: 
 Metadata file: 
 Data Space Used: 19.92 MB
 Data Space Total: 12.81 GB
 Data Space Available: 12.79 GB
 Metadata Space Used: 45.06 kB
 Metadata Space Total: 33.55 MB
 Metadata Space Available: 33.51 MB
 Thin Pool Minimum Free Space: 1.281 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
 Library Version: 1.02.140-RHEL7 (2017-05-03)

このように、ループバックデバイスに関するWARNINGが消えていることが確認できました。

同様の処理をworkerに対しても実施します。

kubeadmによるクラスタの初期化

https://kubernetes.io/docs/setup/independent/install-kubeadm/

ドキュメントを参考に、kubeadmでクラスタを初期化します。

kubeadmはまだβ段階で、プロダクション運用にはまだ早いですが、簡単にクラスタを構築できるのでここではkubeadmでクラスタを構築してみます。

kubernetesのmasterを初期化

kubeadm initコマンドでmasterを初期化します。
なお、kubeadm initコマンドが成功した際に表示される、

kubeadm join --token xxxx

というコマンドは後でWorkerを追加する際に必要になるので控えておきます。

# yumリポジトリの追加
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# k8s関連パッケージの追加
yum install -y kubelet kubeadm kubectl

# kubeletの開始
systemctl enable kubelet && systemctl start kubelet

# kubeadmのセットアップはselinuxを無効化する必要があるようです
$ setenforce 0

# kubeadmでmasterを初期化
$ kubeadm init --pod-network-cidr=10.244.0.0/16

# 以下コマンドが表示されるので控えておく(Worker追加の際に使用する)
# kubeadm join --token xxx

# kubectlをAPIサーバーへアクセスできるよう設定
$ mkdir -p $HOME/.kube
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config

# podネットワーク用のadd-onを追加(今回はflannelを使用)
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

# masterがReadyになるのを待つ
watch kubectl get nodes

kubernetesのworkerを追加

worker用に作成したec2インスタンスにsshログインし、上記で初期化したクラスタにJOINさせます。

$ ssh centos@k8s-worker
$ sudo su -

# yumリポジトリの追加
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# kubeadmのセットアップはselinuxを無効化する必要があるようです
$ setenforce 0

# k8s関連パッケージの追加
yum install -y kubelet kubeadm kubectl

# kubeletの開始
systemctl enable kubelet && systemctl start kubelet

# kubeadmでWorkerを追加する。
# kubeadm initコマンドの完了時に表示されたコマンドをworkerインスタンスで実行する
$ kubeadm join --token xxxx 10.0.157.43:6443 --discovery-token-ca-cert-hash xxx

kubeadm join --token 2f80ec.3db07de32fde6f62 10.0.157.43:6443 --discovery-token-ca-cert-hash sha256:5db1f5a2fb1694bd9ad986a8367351632499d9668f30373797d1b74d85456b40
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[preflight] Running pre-flight checks
[preflight] WARNING: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Starting the kubelet service
[discovery] Trying to connect to API Server "10.0.157.43:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://10.0.157.43:6443"
[discovery] Requesting info from "https://10.0.157.43:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "10.0.157.43:6443"
[discovery] Successfully established connection with API Server "10.0.157.43:6443"
[bootstrap] Detected server version: v1.8.5
[bootstrap] The server supports the Certificates API (certificates.k8s.io/v1beta1)

Node join complete:
* Certificate signing request sent to master and response
  received.
* Kubelet informed of new secure connection details.

Run 'kubectl get nodes' on the master to see this machine join.

master側で、workerがjoinしたことを確認します。

$ ssh centos@k8s-master
$ sudo su -

$ watch kubectl get nodes

NAME                                  STATUS    ROLES     AGE   VERSION
ip-x.ap-northeast-1.compute.internal  Ready     <none>    45m   v1.8.5
ip-x.ap-northeast-1.compute.internal  Ready     master    1h    v1.8.5

nginxでも走らせてみますか。

# masterで
$ kubectl run my-nginx --image=nginx --replicas=2 --port=80
$ kubectl expose deployment my-nginx --type=NodePort
$ kubectl describe services my-nginx

Name:                     my-nginx
Namespace:                default
Labels:                   run=my-nginx
Annotations:              <none>
Selector:                 run=my-nginx
Type:                     NodePort
IP:                       10.99.129.58
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32017/TCP
Endpoints:                10.244.1.2:80,10.244.1.3:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

# NodePortでアクセスして表示されることを確認
$ curl http://$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4):32017

というわけで、Dockerストレージをdirect-lvmモードで動かしてkubernetesクラスタを動かすことができました。

まとめ

Kubernetesを使用していて、コンテナのデプロイが遅いとか、コンテナ内ファイルアクセスが遅いとか、そういった問題を感じるようでしたら一度Dockerストレージの設定を見直してみてはいかがでしょうか。


  1. ただ、以前は上記のようなことがkubernetesのドキュメントに書いてましたが今は消えてるので、インスタンスストアにこだわる必要性はあまりないのかもしれません。既にm5インスタンスが利用可能になっている時代ですし… 

  2. Docker v1.13.1からデフォルトのストレージドライバがoverlayになっているので、最新のDockerをインストールしている場合はoverlayドライバを使用していると思います。普通にyum installでDockerを入れた場合1.12.6がインストールされました。 

続きを読む

AWS CodeCommit + Git (https) を OSX から SourceTreeで使う

はじめに

AWSでWEBサービスを作るにあたり、CodeCommit を使ってソースを管理しようと思い、AWS CodeCommit を利用することにしたのでその準備方法などを整理&メモとして残す。サーバ側を python3 で開発するつもりなので、python 周辺のツールを色々と使っているけど、pythonとか使いたく無い…って人は、別の道を探した方が良いと思う。

前提

ほとんど開発用のツール・ライブラリが入っていないことを前提にしているのだけど、まっさらな OSX を用意したわけで無いので、エラーが発生するような場合は、それぞれ解決が必要。たぶん、pip とか…。

CodeCommit の作成など

下記のサイトとかを参考に、CodeCommit上にGitリポジトリを作り、アクセス用のアカウントを準備する。非常にざっくり・簡単に言えば、(1)AWS IAM でユーザを作って、(2)CodeCommit でリポジトリを作って、(3)AWS IAM で認証情報を生成する…といった流れ。

AWS Code Commitでgitリポジトリを作る

実は、この状態で OSXのコマンドプロンプトから git clone コマンドを叩くと、ユーザID・パスワードを入力すれば普通にクローンできる。だけど、コマンドは何かと不便なので、SourceTreeを使うためにおまじないが必要。

AWS CLI をインストール

下記のサイトなどを見る限り、SourceTree が認証をパスするためには、awsコマンドが存在しないといけない模様。なので、awscli をインストールするのだけど…ついでに、pythonのバージョン更新も行う。

AWS CODECOMMIT WITH SOURCETREE

OSX:python2.7 から python3 に変更

下記のサイトを参考に、OSX の python を python3.6.3 に変更。特に必要性は無いのだけど、サーバ側のバージョンを 3.6系にするつもりなので、環境を一致させる意味でも変更する。

MacOSとHomebrewとpyenvで快適python環境を。

AWS CLI のインストール

python (pip) の環境が揃っているなら非常に簡単。以下のコマンドでインストール。エラー(不足ライブラリなど)は適当に処理すべし。

sudo pip install awscli

AWS接続用の資格情報を作成

awsコマンドを使って、接続用の資格情報を作成。AWS IAM で作ったユーザの資格情報が必要になるので準備しておく。

aws configure --profile << 適当な名称 >>

AWS Access Key ID [None]: << ユーザー名 >>
AWS Secret Access Key [None]: << パスワード >>
Default region name [None]: << リージョン名 >>
Default output format [None]: 

#上記の << ... >> は、適宜置き換え

SourceTreeで Clone から Push まで

ひとまず、SourceTreeを使って、リポジトリを clone する。認証情報を聞いてきたり、KeyChain へのアクセス許可を聞いてきたりと若干忙しいけど、特に問題ない…はず。

ただし、このままでは ローカルへの commit はできても、サーバへの pull も push もできないので、config ファイルに追記する。

configへの追記
[credential]    
    helper = !aws --profile << 適当な名称 >> codecommit credential-helper $@
    UseHttpPath = true

# << 適当な名称 >> は、aws configure で使った名称。

まとめ

ssh でやれば良かった… なんて野暮なことは言ったらダメなのだと思うけど、https 経由でも無事に SourceTree が使える模様。

続きを読む

FargateのvCPU性能と価格感等雑感

こちらはAWS Fargate Advent Calendar 2017の12/13分の記事です。

普段の業務ではECS上でGoで書いたアプリケーションを運用しています。

日本からre:Inventのライブストリームを視聴していた勢ですが、予想通りEKSとLambdaのGo対応がアナウンスされ感激していたら、さらにFargateまで来てしまい、とても興奮した二日間になりました。

今回はFargateのアドベントカレンダーにお声掛け頂いたので小ネタと雑感などを記したいと思います。

Fargateで提供されるvCPUの性能について

ECSであれば自身でプロビジョニングしたコンテナインスタンスを使用しているためCPU性能なども把握できますが、FargateではAWSが用意したコンテナインスタンス上でtaskが実行されるため、どのようなインスタンスタイプ上で実行されるのかわかりません。

そこで、今回は lscpu コマンドでCPU種別の確認、openssl コマンドに付属するベンチマークツールを実行して、そのvCPU性能を測定しました。すでに $ openssl speed -evp aes-gcm | aes-ctr の結果を集めるスレ にいくつか測定結果があるため、これと同じベンチを実行しました。

ベンチマーク方法

一般にEC2ではCPU世代に応じてインスタンスタイプが設定されています(m3, m4, m5など)。Taskを5つ実行し、インスタンスタイプの推定とベンチマークを実行しました。

vCPUとメモリの割り当てによって変化があるか確認するため、Fargateでは以下の組み合わせで検証しました。

  • Fargate 0.25vCPU/0.5GB
  • Fargate 1vCPU/0.5GB
  • Fargate 2vCPU/0.5GB
  • Fargate 4vCPU/8GB
  • Fargate 4vCPU/30GB

実際のインスタンスタイプとの比較のため以下のインスタンスタイプでも検証しました。

  • t2.nano
  • m4.large
  • c4.xlarge
  • c5.xlarge (これは明らかに自明なので1度だけ)

測定方法は以下の通りです。

  • Task(またはインスタンス)を5つ起動させる。
  • lscpu を実行しCPU種別とクロック数を確認。すでに測定済みだった場合はベンチマークはスキップ。
  • openssl speed 2種を3回実行し、中央値を採取し、結果はマージして記述。
for i in $(seq 1 3); do openssl speed -evp aes-128-ctr; done | tee ctr.log
for i in $(seq 1 3); do openssl speed -evp aes-128-gcm; done | tee gcm.log

測定結果を以下に纏めました。

Fargate 0.25vCPU/0.5 GB

2種類のCPUが観測されました。

4 Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
1 Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
Stepping:              2
CPU MHz:               2400.060
BogoMIPS:              4800.09
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              30720K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     494148.25k  1605834.24k  3177746.43k  4007733.93k  4371120.13k
aes-128-gcm     379332.99k   899127.24k  1915460.84k  2328437.22k  2779490.25k


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2508.184
CPU max MHz:           3000.0000
CPU min MHz:           1200.0000
BogoMIPS:              4600.16
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     483999.89k  1565855.91k  3104190.12k  3898957.82k  4233057.62k
aes-128-gcm     404526.70k   932581.21k  2032351.23k  2862813.18k  3520877.91k

0.25vCPUですが、CPU数は2になっているようですね。

Fargate 1vCPU/2GB

2種類のCPUが観測されました。

2 Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
3 Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    2
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
Stepping:              4
CPU MHz:               2494.051
BogoMIPS:              4988.07
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm fsgsbase smep erms xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     446142.23k  1325294.61k  2699386.88k  3366615.04k  3668706.65k
aes-128-gcm     276915.95k   702377.22k   989968.75k  1072276.48k  1107867.46k


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    2
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2299.918
BogoMIPS:              4600.08
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     479575.66k  1364312.82k  2938265.78k  3846555.88k  4217560.18k
aes-128-gcm     400038.38k   918257.05k  2025422.18k  2867529.81k  3485180.59k

Fargate 2vCPU/4GB

3 Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
2 Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    2
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
Stepping:              4
CPU MHz:               2500.097
BogoMIPS:              5000.11
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm fsgsbase smep erms xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     447763.51k  1325036.91k  2706711.89k  3402086.06k  3667615.74k
aes-128-gcm     277453.59k   705053.22k   985322.24k  1079016.79k  1100259.33k


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    2
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2300.202
BogoMIPS:              4600.05
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     478271.40k  1528868.80k  3034935.13k  3887648.43k  4241097.03k
aes-128-gcm     399735.44k   919618.99k  2017273.00k  2868418.22k  3493538.47k

Fargate 4vCPU/8GB

3 Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
2 Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
Stepping:              4
CPU MHz:               2494.257
BogoMIPS:              4988.11
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm fsgsbase smep erms xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     437667.62k  1332726.42k  2703931.05k  3409378.65k  3687243.78k
aes-128-gcm     277972.59k   707628.54k   989001.56k  1084320.43k  1108792.66k


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2299.860
BogoMIPS:              4600.18
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     483260.30k  1544428.31k  3058699.35k  3910503.42k  4249572.69k
aes-128-gcm     403065.87k   939698.82k  2021811.71k  2889371.65k  3527876.61k

Fargate 4vCPU/30GB

この組み合せはFargateで選択できる最大値です(CPUとメモリ的にはr4相当ですが、もちろんその他いろいろ違います)。

この検証はメモリの量もCPU種別に影響しているのか確かめるためです。

3 Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
2 Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
Stepping:              4
CPU MHz:               2494.028
BogoMIPS:              4988.07
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm fsgsbase smep erms xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     448949.71k  1323984.96k  2703453.01k  3395558.74k  3671018.15k
aes-128-gcm     278020.09k   702252.10k   983557.97k  1079190.87k  1108407.64k


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2699.102
CPU max MHz:           3000.0000
CPU min MHz:           1200.0000
BogoMIPS:              4600.19
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     481306.55k  1540346.60k  3057142.87k  3902812.84k  4238532.61k
aes-128-gcm     401507.38k   926114.69k  2024385.37k  2873183.23k  3508360.53k

t2.nano (1vCPU/0.5GB)

t2.nanoはバースト時間は70分程度こそ短いですが、逆に言えばその時間中はフルに使えます。

CPU種別はすべて同じで、かつFargateで観測したものでした。

5 Model name:            Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz

念のため1度だけベンチを取りましたが、Fargateでの結果とほぼ同一でした。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
Stepping:              2
CPU MHz:               2400.062
BogoMIPS:              4800.12
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              30720K
NUMA node0 CPU(s):     0
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     503626.65k  1638487.98k  3363840.09k  3968865.96k  4447092.74k
aes-128-gcm     396037.09k   957863.32k  1980559.87k  2462240.43k  2872603.99k

m4.large (2vCPU/8GB)

CPU種別はすべて同じで、かつFargateで観測したものでした。

5 Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz

念のため1度だけベンチを取りましたが、Fargateでの結果とほぼ同一でした。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    2
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2300.076
BogoMIPS:              4600.15
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     483720.54k  1548166.29k  3058795.01k  3911671.13k  4252426.24k
aes-128-gcm     404151.85k   931442.39k  2036643.50k  2901392.73k  3536415.40k

c4.xlarge (4vCPU/8GB)

CPU種別はすべて同じでしたが、Fargateでは観測していないCPU種別でした。

5 Model name:            Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz
Stepping:              2
CPU MHz:               2900.080
BogoMIPS:              5800.16
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     573103.07k  1838973.67k  3616666.11k  4640284.67k  5036687.36k
aes-128-gcm     438607.02k  1053641.13k  2199977.47k  2688752.64k  3118830.93k

クロック数が1.2倍程度になっており、結果もそれによって向上しているようです。

c5.large (2vCPU/4GB)

こちらは参考値として測定しています。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    2
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 85
Model name:            Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz
Stepping:              3
CPU MHz:               3000.000
BogoMIPS:              6000.00
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K
L3 cache:              25344K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f rdseed adx smap clflushopt clwb avx512cd xsaveopt xsavec xgetbv1 ida arat

OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-ctr     373601.31k  1349180.10k  2611213.91k  3216150.87k  3460380.25k
aes-128-gcm     646483.14k  1477658.58k  2778828.03k  4233357.31k  5216542.72k

c4.xlargeと比較してCPU自体の性能向上がはっきりわかります。

考察

この検証ではt2, m4, c4ではCPU種別のバラつきはありませんでしたが、Fargateではバラつきがありました。Fargateで25taskを調べた結果、3種類観測できました(Iyv Bridge多い…)

11 Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
4  Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
10 Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz

vCPUが2以下の場合でもコンテナにCPUが2個見えているようでした。CPUのモデルナンバーを見るとt2, m3, m4で提供されるCPU世代とクロック数になっているようです。AWS の CPU の歴史とそこから見えてくる戦略を合せて読むと、第3世代、第4世代(m3, m4)の余剰リソースを使っているように見えます。

vCPUやメモリのリソースを増やしてもCPUの世代やクロック数はスケールアップせず、あくまでvCPU数(4vCPUにするとCPU数も増える)とメモリだけのようです。したがって、vCPUを増やしてもアプリケーションが複数のCPUを使う構成でない場合、十分なパフォーマンスが得られない可能性があります。Goなら大丈夫ですね。

起動までの時間はdesired countによらずおおよそ60秒程度でrunningになりました。

興味深いのはベンチ結果を見ると、実のところvCPUの値が増えてもさしてスコアが上がっていません。

Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz

0.25vCPU
  type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
  aes-128-gcm     404526.70k   932581.21k  2032351.23k  2862813.18k  3520877.91k

1vCPU
  type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
  aes-128-gcm     400038.38k   918257.05k  2025422.18k  2867529.81k  3485180.59k

負荷を掛けながら mpstat コマンドで詳細を確認しました。

Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz

0.25vCPU
  Single thread (with AES-NI enabled)
    type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
    aes-128-gcm     397859.26k   939669.16k  2028740.50k  2852892.67k  3501850.62k

    14:44:41     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    14:44:42     all   13.07    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   86.93
    14:44:42       0   25.74    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   73.27
    14:44:42       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

  Single thread, 2 process (with AES-NI enabled)
    type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
    aes-128-gcm     400801.31k   917082.84k  2014668.13k  2888170.44k  3444925.05k
    aes-128-gcm     397097.51k   934670.82k  1999300.72k  2846025.96k  3449496.22k

    15:33:05     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    15:33:06     all   12.56    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   86.93
    15:33:06       0   12.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   88.00
    15:33:06       1   14.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   86.00

1vCPU
  Single thread (with AES-NI enabled)
    type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
    aes-128-gcm     400761.52k   919781.78k  2018643.29k  2859059.20k  3481364.73k

    15:16:20     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    15:16:21     all   50.25    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   49.25
    15:16:21       0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
    15:16:21       1    0.99    0.00    1.98    0.00    0.00    0.00    0.00    0.00    0.00   97.03

  Single thread, 2 process (with AES-NI enabled)

    type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
    aes-128-gcm     239594.50k   493130.86k  1034230.53k  1450766.34k  1761996.12k
    aes-128-gcm     241122.42k   501019.10k  1056970.26k  1498347.32k  1733738.50k

    15:22:08     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    15:22:09     all   51.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   49.00
    15:22:09       0   50.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   50.00
    15:22:09       1   51.49    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   47.52

確かにCPU時間はきちんとcapされているようですが、シングルスレッド、シングルスレッド * 2同時実行でのスコアは期待するような変化ありませんでした。ベンチマークの方法に問題があるのか、AES-NIの影響なのか、あるいはコンテナホストのリソースが空いてれば使えるのか、今後の調査にしたいと思います(あるいは誰か教えてほしい)。

価格についての感想

ここでは常時起動しているワークロードの場合を想定して検討します。なぜかというと、ECSでそのように運用しているからです。

Fargateで一番安いのは 0.25vCPU, 0.5GBで約$14/月です。t2.nanoは約$4/月です。例えばまったくリソースは不要だけど常時起動していて欲しい(ボットなど)時はt2.nanoのほうが安いですね…。インスタンスの管理が不要とはいえ、一番安いところでは t2.nano と張り合ってほしいです。

これはたぶんvCPUとメモリの下限を緩和して 0.1vCPU/0.128GB みたいな組み合せができればいけそうな気がします。

(37.6464/vCPU * 0.1) + (9.4488/GB * 0.128) = $4.97

これは欲しい…!!(特にGo製のアプリは省エネなので)

9日目の記事10日目の記事に価格の話がありました。通じて言えるのは適切なvCPUとメモリの割り当てだと解釈しています。すでにECSで運用している人はECSサービスのメトリクスを見ることで予約した値に対しての使用率が確認できます。使用率が5〜6割程度になる組み合せで価格を検証すると納得感がでてきそうです。記事にあるようにバッファ用やデプロイ時用などのために余剰インスタンスをプロビジョニングする必要がないのもFargateのよい点だと思います。

同じマネージドであるRDSではMultiAZでEC2インスタンス代に対してだいたい1.5〜倍に設定されていますが、リザーブドがあるため、価格差はもう少し小さくなります。ここはぜひFargate版のリザーブドを期待しつつ、記事を締めたいと思います。

付録

Fargate上のコンテナにsshして調査するためのsshd用のコンテナイメージを作成しました。

https://github.com/nabeken/docker-simple-sshd

docker run -d -e GITHUB_USER_NAME=foobar -P local/docker-simple-sshd

として起動(あるいは同等のタスク定義を書く)すると、起動時にGithubからfoobarユーザーの公開鍵を取得してsshdを起動してくれます。テストのお供にどうぞ。

参考: https://dev.classmethod.jp/cloud/aws/dive-into-aws-fargate/

続きを読む

Raspberry Pi 3 でAlexaと対話する

re:Invent 2017AlexaをRaspberryPi経由で利用する方法のワークショップに参加した。

ワークショップでは、構成済みのMicroSDを使って、単純にコマンドを流したり、支持されたようにファイルを書き換えたりしただけだったので、まっさらなMicroSDの状態から同様に動くようになるまでをやってみたいと思う。

用意するもの

Raspberry Pi 3 Model B
USBマイク < 多分これ
イヤホン
USBキーボード
USBマウス
HDMIケーブル
ディスプレイ
MicroSD Class10 16G

事前準備(Macでの作業)

インストーラーのダウンロード

こちらからNOOBSをダウンロードする
今回ダウンロードしたバージョンは v2.4.5

MicroSDにコピーする

ダウンロードしたNOOBS_v2_4_5.zipを解凍しFAT32でフォーマット済みのMicroSDにファイルをコピーする。

コマンド例
cp -a Downloads/NOOBS_v2_4_5/* /Volumes/UNTITLED

Raspbianのインストール

先ほどのMicroSDをRaspberry Piに刺して電源を入れるとインストーラーが立ち上がるので、Raspbian [RECOMMENDED]にチェックを入れて、左上のInstallをクリックしてインストールすればOK



事前準備(Raspberry Piでの準備)

一応OSのバージョンチェック

こんな記載があるので、Raspbian Stretchかどうか一応チェック

This guide provides step-by-step instructions to set up the Alexa Voice Service (AVS) Device SDK on a Raspberry Pi running Raspbian Stretch with Desktop

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

ネットワークに接続

有線LANもあるので有線でつなげる場合には、何もしなくて大丈夫
Wi-Fiを利用する場合には右上にマークがあるのでそこから接続設定する

SSH/VNCの有効化

有効化しなくてもOKだけど、リモートから行える作業はできるだけリモートで行うと楽なので有効化しておく


ビルド環境の構築+ビルド

基本的にはこちらにある通りに行う
https://github.com/alexa/avs-device-sdk

依存関係のあるライブラリ、AVS Device SDK, Sensory wake word engine のインストール

Sensory wake word engineはオープンソースは非商用限定のライセンスなので注意すること

cd /home/pi/
mkdir sdk-folder
cd sdk-folder
mkdir sdk-build sdk-source third-party application-necessities
cd application-necessities
mkdir sound-files

sudo apt-get update

sudo apt-get -y install 
  git gcc cmake build-essential libsqlite3-dev libcurl4-openssl-dev 
  libfaad-dev libsoup2.4-dev libgcrypt20-dev libgstreamer-plugins-bad1.0-dev 
  gstreamer1.0-plugins-good libasound2-dev doxygen

cd /home/pi/sdk-folder/third-party
wget -c http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz
tar zxf pa_stable_v190600_20161030.tgz
cd portaudio
./configure --without-jack
make

pip install commentjson

cd /home/pi/sdk-folder/sdk-source
git clone git://github.com/alexa/avs-device-sdk.git

cd /home/pi/sdk-folder/third-party
git clone git://github.com/Sensory/alexa-rpi.git
cd ./alexa-rpi/bin/
./license.sh

ビルド

make のオプションは -j4までいけるけど、オーバーヒートに注意しましょう(と書いてある)

cd /home/pi/sdk-folder/sdk-build
cmake /home/pi/sdk-folder/sdk-source/avs-device-sdk 
  -DSENSORY_KEY_WORD_DETECTOR=ON 
  -DSENSORY_KEY_WORD_DETECTOR_LIB_PATH=/home/pi/sdk-folder/third-party/alexa-rpi/lib/libsnsr.a 
  -DSENSORY_KEY_WORD_DETECTOR_INCLUDE_DIR=/home/pi/sdk-folder/third-party/alexa-rpi/include 
  -DGSTREAMER_MEDIA_PLAYER=ON 
  -DPORTAUDIO=ON 
  -DPORTAUDIO_LIB_PATH=/home/pi/sdk-folder/third-party/portaudio/lib/.libs/libportaudio.a 
  -DPORTAUDIO_INCLUDE_DIR=/home/pi/sdk-folder/third-party/portaudio/include
make SampleApp -j2

Alexa Voice Serviceへの登録

先ほどビルドしたSampleAppからAlexa Voice Serviceへ接続するためには設定を作る必要があるので作成する。

Amazon Developerに登録

こちらからログインする
日本でもEchoが発売されたのでamazon.co.jpアカウントでもログインできるらしい

Alexa Voice Service に製品を登録する

!!! 一度作成した設定は削除できないようなので注意 !!!

Alexa Voice Service を選ぶ

CREATE PRODUCTを選ぶ

プロダクト情報を入力する

Product Name: 任意
Product ID: 任意(あとで使うのでメモっておくこと)
Is your product an app or device?: Device
Will your device use —–: 任意(Deviceを選ぶと出てくる)
Product category: 任意
Brief product description: 任意
How will end users —–: Hands-free
Upload an image: 任意
Do you intend to —–: No
Is this a children’s —–: No

セキュリティプロファイルの設定を作る

CREATE NEW PROFILEを選択すると、下にプロファイル名と説明を入れる欄が出るので、入力する。

URLの登録

次で使うので、Client ID, Client Secretをメモに取る
http://localhost:3000を入力してADDボタンを押す
同様にAllowed return URLsにはhttp://localhost:3000/authresponseを入力してADDボタンを押す

アプリケーション側に設定を反映

その前にvimのインストール

nano, edとかは入ってるけど辛いのでvimをインストール

sudo apt-get install -y vim

設定ファイルの書き換え

YOUR_CLIENT_SECRET, YOUR_CLIENT_ID, YOUR_PRODUCT_IDを先ほどメモったものに書き換えて以下を実行する

cat <<EOF >/home/pi/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json
{
    "authDelegate":{
        "clientSecret":"YOUR_CLIENT_SECRET",
        "deviceSerialNumber":"123456",
        "refreshToken":"",
        "clientId":"YOUR_CLIENT_ID",
        "productId":"YOUR_PRODUCT_ID"
   },
   "alertsCapabilityAgent":{
        "databaseFilePath":"/home/pi/sdk-folder/application-necessities/alertsCapabilityAgent.db"
   },
   "settings":{
        "databaseFilePath":"/home/pi/sdk-folder/application-necessities/settings.db",
        "defaultAVSClientSettings":{
            "locale":"en-US"
        }
   },
   "certifiedSender":{
        "databaseFilePath":"/home/pi/sdk-folder/application-necessities/certifiedSender.db"
   },
   "sampleApp":{
       "displayCardsSupported":false
   }
}
EOF

音の設定

cat <<EOF >~/.asoundrc
pcm.!default {
  type asym
   playback.pcm {
     type plug
     slave.pcm "hw:0,0"
   }
   capture.pcm {
     type plug
     slave.pcm "hw:1,0"
   }
}
EOF

リフレッシュトークンの取得

先ほど書き換えず空のままだったrefreshTokenを取得する

まずは、下記コマンドを実行して認証用Webサーバーを立ち上げる

cd /home/pi/sdk-folder/sdk-build && python AuthServer/AuthServer.py

直接もしくはVNCを利用して、Raspberry Pi内のブラウザを立ち上げて http://localhost:3000/ にアクセスするとSign in to [セキュリティプロファイル名] using your Amazon accountのページにリダイレクトされるので、ログインする

ログインが完了すると立ち上げてWebサーバーにリダイレクトされて戻ってきて、The file is written successfully.
Server is shutting down, so you can close this window.
という表示がされている

サンプルアプリケーションの実行

$ cd /home/pi/sdk-folder/sdk-build/SampleApp/src
$ TZ=UTC ./SampleApp 
  /home/pi/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json 
  /home/pi/sdk-folder/third-party/alexa-rpi/models
#############################
#       Connecting...       #
#############################

########################################
#       Alexa is currently idle!       #
########################################

///ここに大量のエラーが出ているけど、一旦動作には関係なさそうなので放置///

                  #    #     #  #####      #####  ######  #    #
                 # #   #     # #     #    #     # #     # #   #
                #   #  #     # #          #       #     # #  #
               #     # #     #  #####      #####  #     # ###
               #######  #   #        #          # #     # #  #
               #     #   # #   #     #    #     # #     # #   #
               #     #    #     #####      #####  ######  #    #

       #####                                           #
      #     #   ##   #    # #####  #      ######      # #   #####  #####
      #        #  #  ##  ## #    # #      #          #   #  #    # #    #
       #####  #    # # ## # #    # #      #####     #     # #    # #    #
            # ###### #    # #####  #      #         ####### #####  #####
      #     # #    # #    # #      #      #         #     # #      #
       #####  #    # #    # #      ###### ######    #     # #      #

+----------------------------------------------------------------------------+
|                                  Options:                                  |
| Wake word:                                                                 |
|       Simply say Alexa and begin your query.                               |
| Tap to talk:                                                               |
|       Press 't' and Enter followed by your query (no need for the 'Alexa').|
| Hold to talk:                                                              |
|       Press 'h' followed by Enter to simulate holding a button.            |
|       Then say your query (no need for the 'Alexa').                       |
|       Press 'h' followed by Enter to simulate releasing a button.          |
| Stop an interaction:                                                       |
|       Press 's' and Enter to stop an ongoing interaction.                  |
| Privacy mode (microphone off):                                             |
|       Press 'm' and Enter to turn on and off the microphone.               |
| Playback Controls:                                                         |
|       Press '1' for a 'PLAY' button press.                                 |
|       Press '2' for a 'PAUSE' button press.                                |
|       Press '3' for a 'NEXT' button press.                                 |
|       Press '4' for a 'PREVIOUS' button press.                             |
| Settings:                                                                  |
|       Press 'c' followed by Enter at any time to see the settings screen.  |
| Speaker Control:                                                           |
|       Press 'p' followed by Enter at any time to adjust speaker settings.  |
| Info:                                                                      |
|       Press 'i' followed by Enter at any time to see the help screen.      |
| Quit:                                                                      |
|       Press 'q' followed by Enter at any time to quit the application.     |
+----------------------------------------------------------------------------+

こんな感じで動いてとりあえずひと段落、Alexaと呼びかけるか、t + EnterでLinteningモードに入る
そうすると、以下のように、ステータスが遷移して、Speakingで話してくれるはず、、、はず、、、

############################
#       Listening...       #
############################

###########################
#       Thinking...       #
###########################

###########################
#       Speaking...       #
###########################

########################################
#       Alexa is currently idle!       #
########################################

あれれ?

音が出ない

音が出ない何故???と思ったら、ディスプレイ側のピンジャックにイヤホンを繋げたら声が聞こえる
ということはHDMI側に信号が流れてしまっているみ???

インターフェイスの優先度的な問題かと思い、HDMIを抜いたり、刺したり、設定変えたりしたけれども解決の糸口が見えないのでとっても困ってます

例えば、以下を実行してもやっぱりHDMI経由で音が出力される・・・

$ amixer cset numid=3 1
numid=3,iface=MIXER,name='PCM Playback Route'
  ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
  : values=0

上の状況でYouTubeを確認したところ、ピンジャックからの出力になっていたので、ここの設定はAlexaには関係なさそう
また、ワークショップで使ったMicroSDを刺して起動した場合には、しっかりとピンジャックから音が出力されるので何らかの設定ミスの線が濃厚

RaspberryPiの知見も、Linuxで音を出す的な知見も全くないので、お手上げ状態です
どなたかわかる方いらっしゃったら教えてもらえたら嬉しいです

音が切れる

もう一つの問題として、Alexaの話が途中で切れることWhat's your nameときくとMy name is Aleという感じで途中で切れてしまう
これも設定で何とかできるんじゃないかと思っているけれども、今の所、どう調べたらいいものやらという感じで止まっている

音がピンジャックから出ない問題と同様に教えてもらえたら嬉しいです

助けてもらえるときのために、関連しそうな情報を末尾に載せておきます

今後のやりたいこと

単純にAlexaと声をかけて、声で操作するだけならEchoを使えばいいだけなので、すぐに思いつくようなことだけではあるけれども、以下のようなことを考えている

  • Wake word engineが独立しているので、Alexa以外の言葉に反応させられたら、専用で作る意味が出てくるので、試したい
  • Wake wordだけでなくコマンドから入力受付状態にできるので、受付システムとかできそうなので試したい

音の設定関連の情報

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device
dmix:CARD=ALSA,DEV=0
    bcm2835 ALSA, bcm2835 ALSA
    Direct sample mixing device
dmix:CARD=ALSA,DEV=1
    bcm2835 ALSA, bcm2835 IEC958/HDMI
    Direct sample mixing device
dsnoop:CARD=ALSA,DEV=0
    bcm2835 ALSA, bcm2835 ALSA
    Direct sample snooping device
dsnoop:CARD=ALSA,DEV=1
    bcm2835 ALSA, bcm2835 IEC958/HDMI
    Direct sample snooping device
hw:CARD=ALSA,DEV=0
    bcm2835 ALSA, bcm2835 ALSA
    Direct hardware device without any conversions
hw:CARD=ALSA,DEV=1
    bcm2835 ALSA, bcm2835 IEC958/HDMI
    Direct hardware device without any conversions
plughw:CARD=ALSA,DEV=0
    bcm2835 ALSA, bcm2835 ALSA
    Hardware device with all software conversions
plughw:CARD=ALSA,DEV=1
    bcm2835 ALSA, bcm2835 IEC958/HDMI
    Hardware device with all software conversions
$ amixer cset numid=3
numid=3,iface=MIXER,name='PCM Playback Route'
  ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
  : values=0

続きを読む