katekichiのゆるブログ

普段の作業メモや日常の出来事とか

AWS Expert Online at JAWS-UG長野 #2の参加メモ

AWS Expert Online at JAWS-UG長野 #2の参加メモです。

AWS Expert Online とは

AWS SAやサポートエンジニアといったTech ExpertのセッションをAmazon Chime経由で、 各支部の勉強会会場に配信いたします。 質問については、オンラインで投げることが可能です。

(イベントページより抜粋)

今回は、長野支部、函館支部、浜松支部アーキテクチャ支部の4拠点が参加していました。

スポットインスタンス再入門

AWSソリューションアーキテクト 滝口 開資 さんのお話

スポットインスタンスとは aws.amazon.com

EC2の購入オプション

  • オンデマンド(通常)
  • リザーブド(1年/3年の長期利用でディスカウント)
  • スポットインスタンス(EC2の空きキャパシティを使っている。最大90%OFF。ただし、中断発生あり)

価値と活用事例

  • 研究機関 自然言語処理の学習プロセスを並列化して実行(vCPU 110万コア)
  • ビックデータ、コンテナ
  • ステートレスなWebサービス

アンチパターン

  • 高可用性も求められるミッションクリティカルなもの(DB等)
  • チョックポイントを設けにくいステートフルなサービス

仕組みとルール

  • 価格の安定化(変動率を抑えた。上限価格はオンデマンドを超えることはない)
  • 中断される2分前までに、AWSから通知される
  • 中断条件(EC2の空きキャパシティ無しになった場合、指定価格(上限価格)がスポットインスタンス価格が上回ったとき)

中断通知の方法

中断通知のテスト

  • スポットフリートを作成すれば出来る

スポットインスタンスの起動の仕方

  • スポットフリート or EC2フリート
  • 永続性の指定が重要(maintain(中断後の台数保証) or request(中断後の台数保証しない))
  • Auto Scalingで起動できるようになった。

使いこなすため

  • ステートレス
  • 再開か可能なワークロード(中断状態からの復帰)
  • 疎結合にする
  • 分散(複数のアベイラビリティゾーンと、複数のEC2タイプに割り当てる)

感想

  • Auto Scalingでお試しに使ってみると良さそう
  • 分散時の「複数のEC2タイプに割り当てる」は意識する必要がありそう

次回は、支部内LTも企画していきたいです。

AWS認定 SAA教科書 読書会 #1に参加した

AWS認定 SAA教科書 読書会を主催&参加しました。

「徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書」(https://amzn.to/2GuW2wZ) を 教材に読書会をして、合格を目指す会です。

f:id:katekichi:20190301202236j:plain

気になったことまとめ:

1-2 : 「AWSインフラストラクチャの概要」

・大阪ローカルリージョンは、「Disaster Recovery」用途で使用できる

1-4:「ネットワークサービス」

・NATゲートウェイを使えば良さそう。
 NATインスタンスって使う用途ってどんな時なんだろうか

・セキュリティグループとネットワークACLの違いは重要
・NLBは初めて聞いた ・・ イメージ沸かない

今後のテーマ

CLI会をやりたい
・オートスケーリングの実践

次回

1-5:「コンピューティングサービス」から
・3/22(金)

JAWS Days 2019に参加してきた

JAWS Days 2019(会場:TOC五反田メッセ)に参加してきたので、感想とか、感想の様子を備忘録としてまとめてみた。 jawsdays2019.jaws-ug.jp

f:id:katekichi:20190224165821p:plain

聞いたトーク一覧と感想

RDBリファクタリングと異種間DB移行の戦い

RDBリファクタリングと異種間DB移行の戦い - Amazon DMSを使った止めずにリファクタリングする手法 | JAWS DAYS 2019

DBのリファクタリングという普段思っていてもなかなか出来ない話題なので 興味深かった。

無停止で、リファクタリングするために、トリガーを使用して更新していく という発想は面白いと思った。

「DBの寿命はアプリより長い! 」や「誰も知らないTABLE」の話しは どこのプロダクトでも、あるあるな話しなんだなと思った。

MySQLからポスグレへの移行中で、MySQLの仕様でハマったとのこと。 * Zero Date問題(0000-00-00) というものが、MySQLにあるらしい(5.7以降は、NO_ZERO_DATE, NO_ZERO_IN_DATEモードがONなので問題ない??)

既存のDBをリファクタリングをするためには、それなりの覚悟が必要とのこと。

スライド

RDBリファクタリングと異種間DB移行の戦い / AWS-DMS - Speaker Deck

サービスダウンから生まれたSWATチームが手掛けるクラウド移行への道

サービスダウンから生まれたSWATチームが手掛けるクラウド移行への道 | JAWS DAYS 2019

オンプレ移行の話しだった。SWATチームなのに、専任では無いというのはツラミを感じた。 Direct Connectは知っていたが、「Direct Connectionロケーション」というAWSとの専用線を引いている データセンターにサーバラックを配置できることは知らなった。あまり縁はないと思ったけど オンプレのユーザーに提案する際の話題には出来そう。

EC2からECSへ移行を始めたお話

EC2からECSへ移行を始めたお話 | JAWS DAYS 2019

午後は、ほとんど「ECS」、「EKS」、「k8s」のセッションをまとめて聞いてみた(知見が無いのと事例を知りたかったので)。 ECSは、Fargate起動とEC 起動がある。価格的には、EC2起動の方が安い模様。

ECSのメリットとして、以下のようなものがある

  1. Blue / green デプロイが出来る
  2. ロールバックが簡単
  3. 本番、開発用環境の差分が無くなる
  4. 冗長化、高可用性が簡単(AMI管理も不要)
  5. 運用コストの軽減
  6. EKSを使用しなかった理由(学習コスト、東京リージョンが無かったこと、クラスタの立ち上げコスト)

6.に関しては、要件がマッチしない場合は、無理にEKS使わなくても良いなと思った。 (勢いで採用するのはリスク有りそう・・)

Kubernetes を使ってエンジニア組織の生産性を上げよう

Kubernetes を使ってエンジニア組織の生産性を上げよう | JAWS DAYS 2019

freee社SREの方。普段、馴染みのないSREの業務について聞けた。

k8s = オーケストレーションツールという印象があるが、

freee社としては、以下の認識で捉えている

SREとは

  • すべてのサービスのインフラを横断的に管理するチーム
  • 安定したインフラを提供するのがミッション

k8sを導入メリット

  • エンジニアへの権限委譲(マニュフェストの作成を任せる)
  • SREは、仕組みづくりに専念できる
  • 監視、ロギングに手が回せるようになる

k8sの難しいところ

  • k8sは、マルチテナントの管理が難しい。
  • クラスタの設定変更で全滅したこともあった。
  • 1クラスタ = 1テナントにする方向で移行中とのこと。

スライド

Kubernetes を使ってエンジニア組織の生産性を上げよう / kubernetes-and-engineer-productivity - Speaker Deck

Kubernetes on AWS/EKSベストプラクティス

Kubernetes on AWS/EKSベストプラクティス | JAWS DAYS 2019

ベストプラクティスという名の通り、充実した内容だった。ただ、如何せん自分の理解度が足りすぎず メモと、脳内変換するのに精一杯で終わってしまった。

EKSの学習コストが高いのと、話しを聞いている限りGKE(Google Kubernetes Engine)の方が 初心者には、よろしくやってくれそう感があった(あくまでも印象だけど・・)。

とりあえず、現在の業務では「ECS」で充分要件を満たせるという印象。「k8s」の理解度を高めた上で もう一度、スライドを見直させて頂きます!

スライド

Kubernetes on AWS/EKSベストプラクティス2019.2 #jawsdays - Speaker Deck

会場の様子とか

前回参加したのが、2017年のときで会場も同じだったので、特に戸惑いはなかった。

入り口でレシーバーを渡されて、英語セッションってあったかなと思ったが、他ブースからの声の音漏れを防止する ためだと分かった。これは非常にありがたかった。良くありがちなレシーバーの返し忘れ防止に名刺と交換 で渡していたので、紛失防止の工夫をしているなと思った。

昼食をもらうタイミングが次のセッションまで15分程度しかなかったので、参加者数を考えると30分くらいあると 良かった気がする(結果的には間に合ったけど・・)。ちなみに自分は、キッチンカーで豚丼を頂きました!(写真なしw)。

Wifiは不安定な感じではあったが、あの参加者数なので致し方ないかなとは思った。

戦利品

AWSブースで、「AWS認定 ソリューションアーキテクト アソシエイト」の証明を見せて もらったステッカー。プロフェッショナルを狙うのはまだ厳しいので、次は「Dev Ops」取得を 目指していければと。

f:id:katekichi:20190224164323p:plain

まとめ

来場者が、1,900人ということでAWSに関わっている人、興味ある人の多さを実感した。

一言でAWSと言っても、「Serverless」、「IoT」、「データ解析」、「k8s」と幅広いジャンルで 使えるマネージドサービスが大量に提供されてきて、それに付随するツール郡の話しは非常に有益 だった反面、自分の理解度不足を実感する一日だった。

まずは、導入出来そうなマネージドサービスから業務改善や、社内システムのインフラに反映して 実践して理解を深めていければと。

最後になりましたが、スタッフ、スピーカーの皆様、お疲れ様でした!この場を借りてお礼申し上げます。 来年も長野から参加します!

Django Congress JP 2018に参加してきた

Django Congress JPに参加してきたので、各セッションの所感をまとめてみました。 (帰りの新幹線で書くという荒行を実施しましたw。不足分はあとで補足します)

djangocongress.jp

Django Congress JP ってなに

PythonのWebフレームワーク「Django」のカンファレンスです。 今まで、国内では開催されておらず今回が、初開催となります。

Djangoは、弊社のWebアプリケーション開発のスタンダートとしておりエンジニア数も豊富なので、楽しみにしていました。社内で私を含めて何名かで、CfPを提出して、 thinkAmi さんのものが採択されたので、今回はカメラ小僧も兼ねての参加しました。

「できる!Djangoでテスト!」

https://tell-k.github.io/djangocongressjp2018/#1

@tell-k さんのセッションでした。

PyCon JPでは、毎回分かりやすい解説をして頂けるので、今回も楽しみにしておりました。

Django fixtureの変わりに、facrory_boyは私も良く使いますが model_mommyというのがあるのを初めて知りました。

「GeoDjangoではじめる地理空間情報

speakerdeck.com

@homata さんのセッションでした。

GISや、OSMの話は、長野の勉強会でもちらほら話題になりますが、Djangoの機能(GeoDjango)で地理空間情報が 扱えることは知りませんでした。migrationに専用コマンドがあったり、管理画面に地図情報が表示されて いたのが印象的でした。

Django / WSGIミドルウェア入門」

speakerdeck.com

弊社エンジニアの @thinkAmi さんのセッションです。

ミドルウェアの話は、なかなか聞く機会が無く自分の理解も乏しかったので 良い勉強になりました。社内で事前リハーサルを入念に行っていたので流石という感じでした。

WSGIミドルウェアDjangoミドルウェアの実行順を丁寧に図説とコードで解説してくれていたのが ありがたかったです。

「Password Hashing」

speakerdeck.com

@bungoumeのセッションでした。

パスワードの保存とハッシュ関数の話でした。パスワードのハッシュ関数は、auth_userで使用しているPBKDF2をデフォルトに使用していましたが、今後のパスワードの解析速度の向上の傾向を考えると 解析されにくいArgon2を採用した方が良いように思いました。

Djangoハッシュ関数を変更しても、ログインしたタイミングでハッシュ形式を変更してるようなので、ハッシュ関数を変更する敷居が低てて良いなと思いました。

「いまさら振り返るDjango Migration(Migrationの内部動作からやっちゃった事例まで)」

speakerdeck.com

@denzowillさんのセッションでした。

「みんなのPython勉強会」のStaffの方で今まで、お名前は存じ上げていたのですが はじめてセッションを聞くことが出来ました。。ぎーらぼのことも話をして頂きありがとうございました!!

マイグレーションの実装について、詳しく解説して頂いていたので、エラーでコケた際の原因も分かり納得することが できました。

makemigrations時の--mergeオプションを恥ずかしながら初めて知り、今まで 運用でmigrationファイルのみ事前にコミットしてPushしたりしていたりなんかしていたので、今後不毛な管理から 開放されそうです。

※まあ、あれだけのマイグレーション機能あればあっても不思議じゃないよね・・。ドキュメントちゃんと読めよと・・。

Django REST framework 実践入門」

slideship.com

@massa142 さんのセッションでした。DRFを使用した際のつらみとその解決策の話が非常に参考になりました。

つらみの話は、全て共感できるお話でしたが、それを解決するサードパーティーのライブラリがそれぞれ存在したのが印象的でした。

印象に残ったものは以下です。

その他

弊社もご協力させて頂きました事前アンケートを元に、Djangoの利用状況レポートが掲示されていたのが 印象的でした。ウェブアプリやAPIサービスに次いで、教育の分野で使われているのも印象的でした。

f:id:katekichi:20180519214048j:plain

まとめ

最近、管理業務が中心になってきていて、手を動かすことが少なくなってきてしまいましたが、今回のイベントに参加 して、非常に良い刺激を受けました。社内の開発や、日々の個人の開発に取り入れたいと思いました。

あと、Pycon JP 2018のCfPが採択されるようにガンバリます!!。

もう長野に到着します。かがやき早すぎ!!

はじめてのAWS Cognito!!

Qiitaにデビューしてみたので、導線的にこちらに貼っときます。

qiita.com

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

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

Amazon Linuxでgunicorn+supervisorをした際のメモ

今更感がありますが、ずっとアプリケーションサーバーは、主にuwsgiを使用していて gunicornを触ってこなかったので、良い機会なので使ってみたのと、supervisourを使って デーモン化してみたのでメモです。

環境

  • Amazon Linux
  • Python 3.5.2 (DjangoWSGIアプリケーションで使用済) (supervisourは、現状3系未対応のため Amazon LinuxのデフォでインストールされているPython2.7を使用します)

supervisorのインストール

$ sudo /usr/bin/pip install supervisor
Traceback (most recent call last):
  File "/usr/bin/pip", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 3020, in <module>
    working_set = WorkingSet._build_master()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 616, in _build_master
    return cls._build_from_requirements(__requires__)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 629, in _build_from_requirements
    dists = ws.resolve(reqs, Environment())
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 807, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: pip==6.1.1

pipが古いようなのでrootになって更新

$ sudo su -
# /usr/bin/easy_install --upgrade pip
$ exit

再度トライ

$ sudo /usr/bin/pip install supervisor
Requirement already satisfied: supervisor in /usr/local/lib/python2.7/site-packages
Requirement already satisfied: meld3>=0.6.5 in /usr/local/lib/python2.7/site-packages (from supervisor)

pipの更新時に既にインストールされたらしい・・

$ /usr/bin/pip freeze
・・略
supervisor==3.3.3

supervisorのconfファイル

$ sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"
$ sudo mkdir /etc/supervisord.d

ログ設定の変更

ログのパスを変更

$ sudo vi /etc/supervisord.conf

[supervisord]
;logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile=/var/log/supervisor/supervisord.log ; main log file; default $CWD/supervisord.log

ログローテーションの設定

$ cd /etc/supervisord.d
$ sudo sh -c "echo '/var/log/supervisor/*.log {
       missingok
       weekly
       notifempty
       nocompress
}' > /etc/logrotate.d/supervisor"

pid, includeの設定

$ sudo vi /etc/supervisord.conf


[supervisord]

# pidファイル(/var/run配下にpidを生成するように変更)
pidfile=/var/run/supervisord.pid

# includeセクションのコメントを外す + 拡張子を変更
[include]
files = /etc/supervisord.d/*.conf

supervisordをサービス登録

Amazon Linuxは、systemdが無いためinitスクリプトを作成する必要があります。 素で書くのは厳しいため、以下を使います。

initscripts/redhat-init-equeffelec at master · Supervisor/initscripts · GitHub

$ sudo curl -o /etc/rc.d/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec
$ sudo chmod 755 /etc/rc.d/init.d/supervisord
$ sudo chkconfig --add supervisord

起動確認

$ sudo service supervisor start
Starting supervisord: /bin/bash: /usr/bin/supervisord: No such file or directory
                                                           [FAILED]

となりエラーとなったので、シンボリックリンクを貼ります。

# シンボリックリンクを貼る
$  sudo ln -s /usr/local/bin/supervisord /usr/bin/
$  sudo ln -s /usr/local/bin/supervisorctl /usr/bin/

# 再度、起動
$ sudo service supervisord start
Starting supervisord: 

# プロセス確認
root      3765     1  0 22:09 ?        00:00:00 /usr/bin/python2.7 /usr/bin/supervisord -c /etc/supervisord.conf
ec2-user  3771  3375  0 22:09 pts/0    00:00:00 grep --color=auto supervisord

gunicorn用のconfig設定

今回は、/etc/supervisord.d/django_app.confを作成

[program:django_app]
directory=[アプリケーションパス:Djangoのproject_rootを指定]
command=/home/ec2-user/.pyenv/versions/3.5.2/bin/python3.5 /home/ec2-user/.pyenv/versions/3.5.2/bin/gunicorn jsl_attendance.wsgi --bind=0.0.0.0:8001
numprocs=1
autostart=true
autorestart=true
user=ec2-user
redirect_stderr=true
environment=DJANGO_SETTINGS_MODULE="xxxx.settings.production" # settings.pyを分けているのでproduction用に設定

configの読み込みと、gunicornの起動

configを読み込みます。

$ sudo service supervisord reload

起動は、supervisorctlで実行します。

$ sudo supervisorctl start django_app
django_app: started

まとめ

pipのバージョンが古かったりで、少々ハマってしまいましたがなんとか出来ました。 本来は、 グローバルのPython(2.x)に直接pipインストールはせずに仮想環境を作成した方が良かったです。 とは言うものの、2系と3系で仮想環境を作るのが手間なので、早くsupervisorが3系対応してくれればなと 思いました。

参考サイト/ブログ等

http://supervisord.org/installing.html

Supervisorで簡単にデーモン化 - Qiita

EC2にNginx + Gunicorn + SupervisorでDjangoアプリケーションをデプロイする - Qiita

PyCon JP 2017に参加してきた。

9月8日〜9日に今年もPyCon JPのトークイベントに参加してきました。

pycon.jp

今年は、弊社(日本システム技研)もシルバースポンサーで ご協力させて頂き、かつブースを初出展しました。

f:id:katekichi:20170910194631j:plain

2014年からの参加で今年で4回になりますがブースを出展しているということも あり、常時バタバタしていたように思いますが、感想をまとめました。


1日目


「ベンリに使おう変数アノテーション - typing.pyとの楽しいお付き合い」

スライドはこちらにありました。

変数アノテーションの歴史的なから、ジェネリック型の話しが中心でした。 なかなか導入することは出来てないですが、普段PyCharmを使ってる立場からすると有用なことも 多いと思うので、小さな個人プロジェクトなんかに使ってみるところから初めてみようかなと思います。


Djangoフレームワークのユーザーモデルと認証」

スライドは、こちらにありました。

Djangoの「認証」に関する話しでした。HTTPのCookieとセッションの仕組みからDjangoのAuthに関する 説明をされていました。 認証バックエンドのカスタマイズの勘所も説明されていたので、今後自前で認証コードを書く際の参考になるかと 思いました。


「len()関数がオブジェクトの長さを手にいれる仕組み」

スライドは、こちらにありました。

毎年、@shimizukawaさんのトークは人気でブースをギリギリまで対応して参加したら立ち見になってしまいました・・。ですが、楽しい内容のトークで立ち見でも苦痛ではなかったです。

Pythonのlen()はAdapter Patternで、オブジェクトのアンスコアンスコlenが呼ばれているとうお話しで処理系の理解が深まりました。また、現在ぎーらぼで開催中の読書会で、「オブジェクト指向設計実践ガイド」を読んでいて、GoFの話題になることも多いので、その際のネタ話も出来るかなと思いました。


「プロダクト開発して分かったDjangoの深~いパーミッション管理の話」

スライドは、こちらにありました。

こちらも毎年、楽しみにしている@hirokikyさんのトークです。内容は、Djangoの認可についてでした。

認可で、if文のお化けになっちゃう話しは自分も経験していたので非常に興味深く、お話しを聞かせて頂きました。

パーミッションを作るためのライブラリとして「django-rules」や「django-gardian」があるよとのこと。

それぞれの特徴として「django-rules」はパーミッションがDB管理され、「django-gardian」はDB管理せずに利用出来るとのこと。

最終的には、所望な動作が期待できなかったため、「django-keeper」を作られたというお話しでした。

苦労された点も含め、認可設計時の参考にしたい内容でした。


1日目まとめ

Pythonの実装系の話しとDjangoの認証/認可のトークを中心に聞いたように思えます。 今年は、毎年楽しみにしていた@aodagさんの「パッケージングの話し」を聞けなかったので後で、動画で見させて頂こうと思います。


2日目


「基調講演」

Pandasのコミッターの堀越 真映さんのお話しでした。

Pandasのコミュニティでコミッターとして認められるために1年間の活動が必要とのことで なかなか敷居の高さも感じましたが、まずがOSSに貢献するために、まずが業務で使用している お気にい入りのライブラリなんかのIssueを読んで見たり、軽微なバグのプルリクを上げて みるところから始めてみようと思いました。


「Reactive Programming on AWS Lambda in Python

はじめて英語のトークを聞いてみました。普段Lambdaに関わっていることもあって 技術的にある程度、理解しているものをチョイスしてみました。

こちらのライブラリを使用するとデプロイが楽だよという 感じの内容だったかと思うのですが、如何せん英語力の無さを痛感する内容だったので、動画を見て 復習します・・。


「The theory of Serverless development by Python (理論から学ぶPythonによるサーバレス開発)」

スライドは、こちらにありました。

業務でサーバーレスを扱うことが多くなってきたので、今回一番聞きたいトークだったのですが、途中ブースの関係で断片的になってしまったので、再度スライドと動画を見て、まとめたいと思います(@marcy-teruiさん、ごめんなさい)。

途中お聞きした際には、Faasの向いてるもの、向かないもののお話しがあったかと思うので要チェックです!


「ジョブフェア」

今年の自分のテーマで「英語力」を上げるあるので、各社さんの取り組みは非常に刺激になる内容でした。


Pythonをとりまく並行/非同期の話」

スライドは、こちらにありました。

過去にthreading.Threadを使用して、ツライ目にあった(実装を理解していなかったため・・) 経験もあったので、興味深い内容でした。

並行/並列処理の解説では、CPUバウンドか、I/Oバウンドかで使用するケースやGILについての 説明も分かりやすく今後、弊社のエンジニアに教える際に良いスライドだなと思いました。

非同期I/Oについては、なかなか触れるケースがなく理解が乏しいのですが、これを機に勉強して みようかと思える内容でした。


2日目まとめ

英語のセッションとLambda系のトークを中心に聞きました。 深い内容のものが多かったのですが、ブースの関係でSlackが気になって途中断片的になってしまったので あったので、再度スライドや動画で要復習な感じです。


その他

ポスターセッションの際に、Python BootCampの各地のメンバの方と集合写真撮らせて頂きました。 今後も長野でPythonを盛り上げていく活動を進めていきたいと思います。

f:id:katekichi:20170910223055j:plain


まとめ

今年は、ブースを初出展ということもあり、スタッフとSlackでやりとりをすることが あったので、トークに集中できなかったことが多々あったのですが、youtubeで動画配信 されているので、こちらは再度復習がてら見ようと思います。

また、ささやかな目標であった英語のトークを聞いてみるという試みで、まだまだリスニングのスパーリング が足りないことに気づいたので、引き続き頑張ります。 2日目のパーティーで海外スピーカーのRizky Ariestiyansyahさんとお話しできたのは、良い経験になりました。

最後に、スピーカーとしての参加は、2014年から出来ていないので来年はプロポーザル提出してみようと思います。

以上