@kotyのブログ

PythonとかAWSとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

第一回「Linuxのしくみ」読書会参加記録

nseg.connpass.com

読書会の新シーズンが始まりました。いつもはネタ本を決めるのにアンケートを取るのですが、今回は仲間内で決めてしまいました。これまでとうって変わって低レイヤの話です。

いつもどおり@さんに加えて、@さんも有識者として大いにウンチクを語ってもらいました。

  • strace コマンド使ったことなかった。。。実際の障害調査では処理系固有のものだったりもっと高レイヤのツールを使うことがほとんどでしょうけど、こういった手段も覚えておくと良いですね。
  • 参加者は11名でした。すごい。このまま減ることなく続けられると良いのですが。
  • おひと方は関西からの参加でした。リモートでもROMなら問題なさそう。むこうの音声が聞き取りづらかったので読んでもらうのはちょっと厳しいかも
  • 次回からは参加する方は仮想マシンか何かでLinuxを動かせる環境を用意しておいた方が良い。「Linuxのしくみ」を学ぶんだし。。

昨シーズンは後半仕事が忙しくて全然出られませんでした。今回は皆勤したいです。

nseg.connpass.com

CloudFront+ALB+nginxで静的ファイルをserve という構成におけるtrailing slashのリダイレクト問題

メモ書き。

構成としてはタイトルの通り、CloudFront + ALB + EC2 + nginx。そしてnginxで静的ファイルをクライアントに返す、という構成。

このとき、 /hoge というリクエストに対し、 /hoge/index.html を返したい場合、 nginx はいったん 301 を返して、 クライアントを/hoge/ にリダイレクトさせる。このときCloudFrontを使っていない場合は、

www.example.com/hoge → www.example.com/hoge/

というリダイレクトになる。

ところが、CloudFrontを使っていると、

www.example.com/hoge → www-example-com-xxxxxxx.ap-northeast-1.elb.amazonaws.com/hoge/

のように、ALBのURLにリダイレクトがかかる。nginx視点で見た場合、 ALBのURLで動いているように見えるためと思われる。

仕方がないので、明示的にリダイレクトを書いた。

    if ($request_uri ~ ^([^.]*[^/])$) {
        return 301 https://www.example.com$request_uri/;
    }

もっと良い方法があるように思うが。。。

追記:HostヘッダをCloudFrontで通すようにすれば良さそう。

書籍「SQLアンチパターン」読書会スペシャル を開催しました

こちらでもレポートしているので、ご覧ください。

www.wantedly.com

参加者は12名と、講師の豪華さを考えるともう少し集客したかったところです。私の宣伝が足りませんでした。。一方で、発表前後で講師も含め雑談が多く出来たのは少人数ならではだと思います。

@t_wadaさんは日本におけるテスト駆動開発の第一人者でもあります。昨秋に書籍が出たことで約10年ぶりにTDDの盛り上がりを見せています。同じ盛り上がりでも10年前との違いを聞いてみましたところ、テストコードを書く組織、書かない組織に二分されている。テストコードを書いている組織はテストコードの負債化が悩みになっている。ということでした。

和田さんはTDDのイベントも乗り気だったので、今年どこかでぜひ開催したいです。

SQLアンチパターン

SQLアンチパターン

テスト駆動開発

テスト駆動開発

謹賀新年2018

あけました。

昨年の振り返り

私については年末に風邪を引いてしまったものの、一年を通して見ると おかげさまで家族みんなが大きな病気もせず、一年を過ごせました。それだけで他に言うこともないのですが、強いて振り返ります。

子供中心の毎日

相変わらず子供中心の日々です。日々家事や育児の一端を担えてとても充実しています。長時間勤務が常態化した職場だとこうはいきません。

息子はだいぶ言葉を覚えて、会話が楽しいです。たぶん今が一番かわいいんだろうと思います。

転職三年目だった

引き続きPython, Django, AWS の案件が主でしたが、曲がりなりにも管理職を拝命し手を動かす時間はこれまでよりも減ってしまいました。その分、メンバーにいかに成果を挙げてもらうかを考えるようになりました。

担当案件は、後輩君とペアで彼にスキトラする感じで進めました。乾いたスポンジのように吸収してくれるので一緒に仕事をしていて楽しいです。

秋以降は、ちょっとだけかじったことのあるだけのvue.jsの案件に*1突っ込まれて、泣きそうになりながら圧倒的成長を遂げることができました。

何かしらのSPAフレームワークを使えるようになりたいとずっと思っていましたが、良い機会になりました。

input/output

相変わらず本はほとんど読みませんでした。4,5冊くらいだろうか。。。読書会があったのは良かったです。

ブログ記事は、発信を強化するという会社の方針にも推されて、前年までよりは割と書きました。

ポートフォリオは増えました!

長野市unofficialごみカレンダー

xamarin製のアプリです。ゴミ出し担当なので、自分用に便利に使っています。これを公開して満足して、xamarin熱は冷めてしまった。。。

長野市ゴミカレンダー

↑のアプリでも使っているデータを使った、google assistantアプリです。google home は勢いで買いました。これのhackはもう少しやりたいです。

そのた

それとvue.jsでりんごの伝票印刷アプリも作り始めたけど、進捗5% くらいで全然。。。

しかしこういったプライベートでの素振りが非常に大事だなと痛感します。いつ打席に立てと言われるか分からない。

今年の抱負

引き続き、家庭優先になる予定。。

input/output

トレンドを追うのは辛いですが、歯を食いしばって追う所存。

k8sとデータ分析の勉強に力を入れたいです。(ぼんやり)

英語もがんばります。当面はTOEIC700点が目標。

水泳関係

昨年は旅行も兼ねて佐渡のOWSに出ました。衰えは感じますが環境の良いジムに移って良い練習ができているので、何かしらの大会には出たい。今年は南の方に行きたいな~。

ことしもよろしくお願いします

健康第一で。

*1:経験者扱いで

セパレートキーボードを使い始めて8ヶ月くらい経った

同僚がキーボードを探しているらしいので、あからさまなアフィ記事を書いてみました。すんません。

amazonの購入履歴を見ると今年の4月に買っていました。

私は以下の記事を見て、買うことにしました。

kykomi.hatenablog.com

もともとHHKBを使っていたので、functionキーやカーソルキー、テンキーが無いことに違和感はありません。

胸元が開いて快適に使っています。

キーレイアウトは、スペースの横にcmdを来るようにしたのと、backspaceと\キーを入れ替えるという2点のカスタマイズをしています。

ctrl-Y(emacsの貼り付け)が片手で出来ないのが悩みです。

現場からは以上です。

AWS Lambda+Serverless FrameworkでDjangoを使う

この記事は Django Advent Calendar 2017 - Qiita の17日目の記事です。

ここ数年サーバーレスアーキテクチャが盛り上がっているものの、Djangoと組み合わせた事例がググってもあまりないので書いてみました。ググっても出てこないということは需要が無いということかもしれませんが。。。みなさんFlaskといった軽量なwebフレームワークとDynamoって組み合わせで使ってるんですかね。

私はLambda+Djangoという組み合わせで本番投入した経験はありません。本記事は、運用に使えそうか?という観点で検証しました。

本記事のサンプルコードは以下に置いてあります。各種バージョンはgithub内のrequirements.txtを参照してください。

GitHub - koty/dj-lambda-sample: A sample of Django app on AWS Lambda using severless framework.

Djangoプロジェクトの作成

適当な名前でDjangoプロジェクトを作ります。プロジェクト構成は前述のgithubリポジトリをご確認ください。標準的なものだと思います。

Serverless Frameworkの導入

Lambdaを運用するにはこれがないとやってられません。各種リソースをzipにまとめてLambdaにdeployしてくれます。またAPI Gatewayなどの周辺リソースの設定もできます。pythonアプリを作るのにnpmモジュールを導入するのはどうなんだとも思いますけども。

www.npmjs.com

serverless コマンドを使うために -g つきでinstallします。

npm install -g serverless

VPCやIAM role等の設定が必要ですが、serverless framework自体は情報が多くありますので、ここではこれ以上触れません。

serverless-wsgi の導入

Djangoを使うにはwsgiという規格に沿う必要があります。普段EC2等で動かす場合はuwsgiやgunicornを使えばwsgiに沿うことができますが、Lambdaの場合は以下を使います。

www.npmjs.com

npm install serverless-wsgi --save-dev

serverless.ymlに以下のように追記します。

functions:
  api:
    events:  # この記述により、ルーティングをwsgi側(Django)に移譲できる。 {proxy+} の意味は不明。。documentにそう書いてある。
      - http: ANY /
      - http: ANY {proxy+}

plugins:
  - serverless-wsgi

custom:
  wsgi:  # appにはwsgi.py へのパスを記述。 serverless-python-requirementsにパッケージングを任せるため packRequirements: false を記述
    app: dj-lambda-sample.wsgi.application
    packRequirements: false

serverless-python-requirements の導入

EC2互換のdockerコンテナ上でpip install〜deployパッケージを作ってくれます。lxml等のpip install時にコンパイルをするパッケージを使っていてもEC2で問題なく動くようパッケージできます。

www.npmjs.com

npm install serverless-python-requirements --save-dev

serverless.ymlには以下のように設定します。

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: true

Djangoの設定

DB の設定

使うRDBMSPostgreSQLです。MySQLよほどの理由がない限りは使わない方が良さそうです。

事前にRDSを立てておきます(EC2上に立てても当然OK)。検証が済んだら落としておくのを忘れずに。。

serverless.env.ymlを以下のように作ります。

SECURITY_GROUP_ID: 'sg-xxxxxxx'
SUBNET_ID1: 'subnet-xxxxxxx'
SUBNET_ID2: 'subnet-xxxxxxx'
DATABASE_NAME: 'xxxxx'
DATABASE_USER: 'xxxxx'
DATABASE_PASSWORD: 'xxxxxx'
DATABASE_HOST: 'xxxxxx.xxxxxxxx.ap-northeast-1.rds.amazonaws.com'
DATABASE_PORT: 5432

環境変数を作るために、serverless.ymlに以下のように設定します。外部ファイルから読み込むわけです。

provider:
  environment:
    DATABASE_NAME: ${file(./serverless.env.yml):DATABASE_NAME}
    DATABASE_USER: ${file(./serverless.env.yml):DATABASE_USER}
    DATABASE_PASSWORD: ${file(./serverless.env.yml):DATABASE_PASSWORD}
    DATABASE_HOST: ${file(./serverless.env.yml):DATABASE_HOST}
    DATABASE_PORT: ${file(./serverless.env.yml):DATABASE_PORT}

Djangoのsettings.pyに以下のように記述します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('DATABASE_NAME'),
        'USER': os.getenv('DATABASE_USER'),
        'PASSWORD': os.getenv('DATABASE_PASSWORD'),
        'HOST': os.getenv('DATABASE_HOST'),
        'PORT': os.getenv('DATABASE_PORT'),
    },
}

最後にEC2等から ./manage.py migrate します。EC2を用意するのが面倒だったので、

class MigrateView(APIView):
    def get(self, request):
        from django.core import management
        management.call_command('migrate')
        return Response({})

というviewでmigrateしました。。。現実的にはVPC内に立てたEC2からmigrateするってもんでしょう。

そのた

このへんで力尽きてきました。Lambdaでは静的ファイルはホストできないので、S3を使います。django-storageを使って、S3に向かってcollectstaticします。

まとめ

簡単なAPIであればこの構成で運用できそうです。Lambdaのスケーラビリティは魅力です。バッチ処理が入ってくるとEC2がほしくなりそうですが。。。繰り返しますが、使うRDBMSMySQLはやめた方が良いです。職場で私の斜め前の人が、どハマりしてました。

残課題

  • デプロイ時に接続が切れるか?
  • Lambdaのパッケージ容量制限はどうする?site-packagesの容量が増えるとどうなる?

もっとcoolな方法があるぜ!という方はぜひ教えてください。。

Two Scoops of Django 1.11: Best Practices for the Django Web Framework (English Edition)

Two Scoops of Django 1.11: Best Practices for the Django Web Framework (English Edition)

Vue.js 2 Cookbook: Build modern, interactive web applications with Vue.js

Vue.js 2 Cookbook: Build modern, interactive web applications with Vue.js

第一回ながのRubyの会参加記録

NSEG のコアメンバーである とみたさんが発起人となり、ながのRubyの会の第一回が開催されました。割と中信からの参加者がいらっしゃったので、第二回がもしあるなら松本か塩尻あたりで開催するのも良いんではないでしょか。

naruby.connpass.com

イベント公開後に発表者が少なめだったこともあり、とみたさんからどうよと言われたので、無理くりネタをひねり出して私も発表しました。

多少の色の違いはあるものの、両者で実現できることに大差はありません。最終的には好き嫌いの正解になるように思います。

結論を見ると割とネタに走っていますが、Ruby歴3日だとこれくらいしかできませんでした。何とぞご容赦ください。。。Rubyは今後も深入りする予定は無いのですけども、微力ながら会を盛り立てられればと思います。

個人的には、最近 google assistant アプリを作ってみているので、 Alexa skillの話が聞けたのが良かったです。(Rubyあまり関係ない)Alexaの方が開発はしやすそうに感じました。

読書会のCM

Rubyで言いますと、GEEKLAB.NAGANOでは現在隔週水曜日に「オブジェクト指向設計実践ガイド 読書会」を開催しています。次回は12月13日です。

nseg.connpass.com

オブジェクト指向の書籍はJavaを題材にしているものが多いですが、この本はRubyを題材にしているのが特徴です。ご興味ある方はぜひ参加してください。

次回のCM

NSEGの来月の勉強会は、書籍「SQLアンチパターン」の読書会スペシャルです。訳者をお招きする予定です。近々イベント立てるのでお待ち下さい。。。