継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Amazon EKS の構築・運用のエッセンスを学べる「 Amazon EKS Workshop」の紹介

タダです。

Amazon EKS(以下、EKS)が昨年東京リージョンに対応しました。 aws.amazon.com

東京リージョンに EKS がきたことで利用検討されている方も多いのではないでしょうか?

今回は、EKS の実践的な使い方を学べるワークショップに触れてみたので、ワークショップでどんなことを学べるのかを紹介します。 eksworkshop.com

  • TL;DR
  • ワークショップの詳細
    • Kubernetes の基本的な用語とアーキテクチャ
    • EKS の概要
      • 料金
    • 事前準備
      • 参考情報
    • EKS クラスターの作成
    • 管理画面の起動
    • サンプルアプリケーションのデプロイ
      • レプリカのスケールアウト
    • Kubernetes のパッケージ管理ツール Helm の導入
      • Helm を使って Jenkins をデプロイする
    • EFK でのログ管理基盤の構成
      • IAM ロールへログ用のポリシー追加
      • AES を作成する
      • Fluentd をセットアップする
      • CloudWatch Logs のログを AES に統合する
    • CI / CD フローの作成
    • Kubernetes のスケーリング
      • Horizontal Pod Autoscaler の設定と実践
      • Cluster Autoscale の設定と実践
    • Prometheus と Grafana での監視
      • Prometheus の導入
      • Grafana の導入
      • ダッシュボードの作成
  • まとめ
    • 参考情報

TL;DR

記事の概要です。

  • EKS のワークショップで次のことを学べる
    • Kubernetes の基本的な用語とアーキテクチャ、 EKS の概要
    • CLI ツールによる EKS の作成/削除
    • パッケージマネージャの導入と、パッケージ管理方法
    • ログ基盤の構成例
    • AWS サービスでの CI / CD の構成例
    • スケールアウトの構成例
    • 監視設定の構成例
続きを読む

機械学習入門者にオススメな「機械学習のエッセンス」を読んだ

タダです。

機械学習の勉強を進めていて、僕のような初学者向けの本「機械学習のエッセンス」を読んだので所感をまとめていきます。

www.sbcr.jp

目次

本書の特徴

冒頭に書かれているのですが、本書では scikit-learn のようなライブラリで使える機能をゼロから Python で実装することを目的としています。

その理由は機械学習アルゴリズムの中身を理解していくために必要なこととし、主に5章でその実装を行います。

そして、僕のような数学を学生時代に挫折した方にも優しい内容になっているのが、本書の第2の特徴です。

数学で必要な知識を解説してくれているので、不明点があれば立ち返り可能なのが良い点です。

本書の Python 実行環境

本書では、 Anaconda を使うことになっています。

Python の他必要なライブラリが入っているので Python 初心者にとっつきやすいツールです。

また、機械学習といえば Python というのがほぼデファクトになっているので言語として Python は最適な選択だと思います。

Python の文法と、機械学習のための数学の基礎

4章と5章で Python を使ったプログラミングを行うにあたって、基本的な文法と数学の基礎を勉強していくのが2章と3章です。

文法としては以下の内容を学びます。

  • 数値、文字列の扱い
  • リスト、辞書、集合
  • 繰り返し
  • 条件分岐
  • 関数
  • モジュールのインポート
  • 例外処理

また、数学は「線形代数微積分、行列」がテーマになります。

4章、5章でも3章で学んだ数式がたくさん出てくるので、数学苦手な方は何度も立ち返る場所になるため重要なトピックになります。

機械学習と数学の実践

4章では、 numpy / Scipy を使って数列を扱ったり、 matplotlib で描画を行います。

上記のライブラリは頻出なため、使い方を数式で表現した場合と並行で解説されているので前章での知識整理に繋がります。

また、4章後半にある「数理最適化」問題や「統計」の専門用語は 並行で取り組んでいる「Coursera」中にも登場した概念で個人的に良い復習となりました。

関連記事

sadayoshi-tada.hatenablog.com sadayoshi-tada.hatenablog.com

機械学習ライブラリを使わない実装

5章で、機械学習のトピックをライブラリを使わず、手法ごとに実装方法の学習になります。扱うのは以下の内容です。

概念の解説 -> 数式での解説 -> コードでの数式で表現した箇所の解説 という構成になっているため、数式で理解が追いついてなくてもコードの実装からこういう処理をしているんだと理解を助けてくれます。

また、特徴量を特定する上で必要な、汎化と過学習の概念についても解説されているのがありがたいです。

まとめ

機械学習のエッセンス」を読んだ所感をまとめました。

様々な機械学習本や、解説記事を読んできたのですが、本書のように数学の基礎や Python のコードを詳細に解説してくれる本は個人的に初で入門者に最適と思います。

機械学習に興味あるけど、数学に苦手意識ある人や途中で挫折してしまった人にも一読してもらいたいそんな1冊だと思います!

世界初!?の「筋肉もくもく会」に参加して来た

タダです。

昨日、きっと世界初!?な「筋肉もくもく会」に参加して来ました。 muscle-engineer.connpass.com

普段から筋トレをやっていて好きなので、これはと思い参加して来ました!

「筋肉もくもく会」とは

イベントページにはこうかいています。

もくもくと集中する時間が25分、その次に筋トレに充てる時間が5分というサイクルを回します。

もくもく(25分間)

筋トレ(5分間)

これは、当日トレーナーとして参加してくださった、株式会社ふんどし部 の 星野さんがおっしゃっていましたが、

筋トレで身体のパフォーマンスをあげつつ、もくもくすることを実践するのが目的です。

イベント当日にやったこと

イベント会場の 100BANCH さんには初めていくので、早めに移動していたんですが、このチラシがインパクトありすぎてすぐイベント会場がわかりました。

f:id:sadayoshi_tada:20190302135842j:plain

服装は、運動できる服装でいきました。持ち物としてプロテインだったり、栄養補給できるサプリメントを持ち込んでいました。

ありがたいことに近くの方からアミノ酸をもらったりしました。 f:id:sadayoshi_tada:20190302144031j:plain

星野さんの LT

イベントのスタートはまず星野さんからのアツいLTからスタートしました。

とても印象的なメッセージを抜粋して残しておきます。

  • 世界はテストスロンに満ちれば世界が平和になる
  • 加齢とともに身体のパフォーマンスは落ちていくので、筋トレを行なってパフォーマンスをあげる
  • 人生100年計画のために必要な時に必要なパフォーマンスを出せるように身体を鍛える

筋トレともくもく会

LT 後、筋トレがスタートしました。

まずは、近くの人とペアを組んでスクワットをしたのですが、イメージとしては動画をみてみてください。

5分後に、もくもくがスタート!

僕は最近、 Python を勉強中で気になっていた「Pyxel」を触ってみていました。 github.com

もくもくした結果は、次の記事にまとめていきますので、ここからは筋トレパートでやった内容をまとめます。

2セット目

今度は腕立てでした。30秒間腕立てして10秒レストの繰り返しを4セットしたのですが、終盤やられました...

3セット目

HIIT という高強度な有酸素運動のプログラムです。

20秒間動き続け、10秒レストを4セットが基本セットでしたが、それ以降は無限という内容で僕は8セット目でダウン。。

ギブアップするときは、「自分は負け犬です」と宣言しなきゃいけないルールだったので、すごく悔しかったです...

最後まで生き残った人はこのように賞賛されました。他の勉強会にはない雰囲気でとても新鮮でした!

4セット目

4セット目は、深呼吸とストレッチ、腸腰筋のトレーニングをして終わりました。

最後は記念撮影して終了。みんなでサイドチェスト!

まとめ

斬新なイベントでとても面白かったのと、反省点として HIIT を頑張ってやり過ぎてしまってその後のもくもくに影響が出たことですねw

よかったこととして、肉体的にも脳的にもすごく疲れたので、とてもよく眠れました。

また、筋トレ好きな同じ業界の方々と話したり、合トレ(合同トレーニングの略)の約束ができたり刺激的なイベントでした。

イベント企画してくださった皆さん本当にありがとうございました! また都合が合えば参加します!

筋トレしたら栄養補給

このイベントには、ソフトドリンクの他にプロテインが飲み放題で、我々大歓喜でした。僕も何回かいただきました。

f:id:sadayoshi_tada:20190302155306j:plain

当日のツイートまとめ

Toggeter でまとめてみました。

動画付きのツイートは必見です。 togetter.com

ALB で Sorry ページを実装する方法と運用上の考慮点

タダです。

Web サイトを運用するケースでメンテナンスやサーバーの障害が発生した時に Sorry ページを返したいという要件って一般的にあると思います。

今回、構成上 ALB と EC2 がいる状況でEC2 で障害が発生した場合に Sorry ページを返すことを検証する機会がありましたので記事にまとめていきます。

ALB の固定ページとして Sorry ページを表示させる

ALB のアップデートでロードバランサーからHTTP エラーレスポンスコードとカスタムエラーメッセージを返すことができるようになりました。

aws.amazon.com

具体的には、リスナーのルールで制御を行います。ルールにHTTP エラーレスポンスコードとカスタムエラーページを設定します。

今回は、HTTPエラーレスポンスコードとして「503」を返し、カスタムエラーページとして「Sorry Page Test」と返す設定を行いました。

f:id:sadayoshi_tada:20190228073446p:plain

設定後に、ブラウザからアクセスしてみます。想定通りのページが表示されました。

f:id:sadayoshi_tada:20190228073622p:plain

運用上の考慮点

ALB のルールでは、優先度に応じて挙動が変わります。

そのため、運用する際は Sorry ページを返すルールと、通常のコンテンツを返すルールの優先順位をコントロールする必要があります。

例えば、EC2 に障害が発生し、ターゲットグループのヘルスチェックが通らない状況になった場合にSorry ページを返したい、といったケースを考えます。

ルールとしては以下の画像のようにセットします。

f:id:sadayoshi_tada:20190228075546p:plain

障害が発生した時は、Sorry ページを表示するルールを、通常のコンテンツを返すルールより優先順位を上にします。

f:id:sadayoshi_tada:20190228074520p:plain

実現方法

GUI で行う場合の手順としては、次のように行います。

まず、上部のボタンの中で「Recorder Rules」を押します。

f:id:sadayoshi_tada:20190228080455p:plain

次に、優先度を変更したいルールの横にチェックボックスがあるためチェックを入れて、優先度を下げるボタンを押します。

f:id:sadayoshi_tada:20190228080529p:plain

最後に、「Save」ボタンを押して終了です。操作としては簡単ですね。

f:id:sadayoshi_tada:20190228081915p:plain

また、AWS CLIでは、set-rule-priorities というコマンドで優先度を変更可能です。

docs.aws.amazon.com

EC2 に障害が発生後、Sorry ページを表示するルールを優先するように変更する際のコマンド例としては以下のコマンド打ちます。

aws elbv2 set-rule-priorities --rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxx:listener-rule/app/alb-dev/f9d65ec6f12ec5fc/33d54c2104b7c8d6/1b6bbb9c8560b2d9,Priority=1

ちなみに、上記の引数であるRuleArnGUI からですと以下のように調べることが可能です。

f:id:sadayoshi_tada:20190228100010p:plain

今回紹介したのは、HTTP のルールだけでしたが、HTTPS のルールもあればそのルールも変更する必要があります。

まとめ

Sorry ページをALB 単体で表示できるアップデートは便利だと思います。

運用にあたっては優先度を変更するオペレーションがあると思うので、手動で変更するフローかAPI 経由で自動化するフローかを検討すると思いますが本番化する前のテストして想定の挙動かは確認するのが良いでしょう。

参考

docs.aws.amazon.com

CloudFormation テンプレートの便利な定義 3選

タダです。

CloudFormation を最近業務でよく使うのですが、自分が使っていてこの定義は便利だなと思ったものがあります。

今回は、その定義 3つをまとめていきます。

  1. Mappings を使ってリソースタグをまとめて設定
  2. Metadata を使って入力パラメータを見やすく管理する
  3. Condition を使って条件判定する

Mappings を使ってリソースタグをまとめて設定

Mappings を使うと、キーと名前付きの一連の値とが対応づけられます。

docs.aws.amazon.com

業務で、大量の AWS リソースに対してタグ付けを行なっているのですが、固定したタグの値が決まっているのであれば、この Mappings を使えば統一的にタグ設定ができます。

例えば、 CloudFormation のコードで以下のように定義します。

下記の定義で、NameタグがEC2_TEST、EnvironmentタグがDEV、SystemIdタグがTESTとタグづけされます。

AWSTemplateFormatVersion: 2010-09-09
Mappings:
  TagsMap:
    EnvName:
      Name: "EC2_TEST"
      Environment: "DEV"
      SystemId: "TEST"
Resources:
  EC2TEST:
    Type: AWS::EC2::Instance
    DeletionPolicy: Delete
    Properties:
      ImageId: ami-0d7ed3ddb85b521a6
      InstanceType: t3.small
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
        - Key: Environment
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Environment
        - Key: SystemId
          Value: !FindInMap
            - TagsMap
            - EnvName
            - SystemId

f:id:sadayoshi_tada:20190223101651p:plain

Metadata を使って入力パラメータを見やすく管理する

Metadata の AWS::CloudFormation::Interface メタデータキーを使うと、テンプレート内のパラメータの順番を制御することができます。

docs.aws.amazon.com docs.aws.amazon.com

テンプレート内で多くのパラメータを扱わなければいけない、かつCloudFormation スタックを画面から作成を行うならばこのオプションを使うのがオススメです。

例えば、以下のテンプレートがあったとします。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Type: String
    Description: (Required) Enter InstanceType.
  ImageId:
    Type: "AWS::EC2::Image::Id"
    Description: (Required) Enter AMI ID.
  DiskSize:
      Type: String
      Description:  (Required) Enter Disk Size.
Mappings:
  TagsMap:
    EnvName:
      Name: "EC2_TEST"
      Environment: "DEV"
      SystemId: "TEST"
Resources:
  EC2TEST:
    Type: AWS::EC2::Instance
    DeletionPolicy: Delete
    Properties:
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: true
            VolumeSize: !Ref DiskSize
            VolumeType: gp2
      DisableApiTermination: false
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
        - Key: Environment
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Environment
        - Key: SystemId
          Value: !FindInMap
            - TagsMap
            - EnvName
            - SystemId

上記の場合、スタック作成時に次のようなランダムな羅列になります。

f:id:sadayoshi_tada:20190223101759p:plain

この例ではパラメーターが少なくていいですが、ランダムに多数のパラメーターが羅列されるより見やすい形に変更した方が利用しやすいです。

この並びを好みの順番にしたい場合は、次のように定義します。

AWSTemplateFormatVersion: 2010-09-09
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: EC2 Configuration
        Parameters:
          - ImageId
          - InstanceType
          - DiskSize
Parameters:
  InstanceType:
    Type: String
    Description: (Required) Enter InstanceType.
  ImageId:
    Type: "AWS::EC2::Image::Id"
    Description: (Required) Enter AMI ID.
  DiskSize:
      Type: String
      Description:  (Required) Enter Disk Size.
Mappings:
  TagsMap:
    EnvName:
      Name: "EC2_TEST"
      Environment: "DEV"
      SystemId: "TEST"
Resources:
  EC2TEST:
    Type: AWS::EC2::Instance
    DeletionPolicy: Delete
    Properties:
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: true
            VolumeSize: !Ref DiskSize
            VolumeType: gp2
      DisableApiTermination: false
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
        - Key: Environment
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Environment
        - Key: SystemId
          Value: !FindInMap
            - TagsMap
            - EnvName
            - SystemId

上記に指定すると、ParameterGroupsParameters で指定した順番に羅列されています。

f:id:sadayoshi_tada:20190223101850p:plain

Condition を使って条件判定する

Condition句を使うと、特定の条件の時に、テンプレート内のパラメータ値を自動で変更可能になります。

docs.aws.amazon.com

条件の組み込み関数として、次の定義が可能です。

  • Fn::And : 指定されたすべての条件が true に評価された場合は true を返し、条件のいずれかが false に評価された場合は false を返す
  • Fn::Equals : 2つの値が等しいかどうかを比較し、2つの値が同じ場合は true を返し、同じでない場合は false を返す
  • Fn::If : 指定された条件が true に評価された場合は 1 つの値を返し、指定された条件が false に評価された場合はもう 1 つの値を返す
  • Fn::Not : false と評価された条件に対しては、true を返し、true と評価された条件に対しては、false を返す
  • Fn::Or : 指定された条件のいずれかが true に評価された場合は true を返し、条件のすべてが false に評価された場合は false を返す

具体的に、テンプレートでの定義例を書きます。

下記のように設定することで、Modeパラメーターがprodならば、EBSボリュームはテンプレートが削除されても残りますが、testならば、EBSボリュームは削除されます。

このように使えるので、テンプレート内でのパラメータの使い分けを行う時に便利です。

AWSTemplateFormatVersion: 2010-09-09
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: EC2 Configuration
        Parameters:
          - ImageId
          - InstanceType
          - DiskSize
          - Mode
Parameters:
  InstanceType:
    Type: String
    Description: (Required) Enter InstanceType.
  ImageId:
    Type: "AWS::EC2::Image::Id"
    Description: (Required) Enter AMI ID.
  DiskSize:
      Type: String
      Description:  (Required) Enter Disk Size.
  Mode:
    Default: prod
    AllowedValues:
      - prod
      - test
    Type: String
    Description: (Required) Select mode.
Conditions:
  EC2RunningMode: !Equals [ !Ref Mode, prod]

Mappings:
  TagsMap:
    EnvName:
      Name: "EC2_TEST"
      Environment: "DEV"
      SystemId: "TEST"
Resources:
  EC2TEST:
    Type: AWS::EC2::Instance
    DeletionPolicy: Delete
    Properties:
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: !If [EC2RunningMode, false, true]
            VolumeSize: !Ref DiskSize
            VolumeType: gp2
      DisableApiTermination: false
      Tags:
        -
          Key: Name
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Name
        - Key: Environment
          Value: !FindInMap
            - TagsMap
            - EnvName
            - Environment
        - Key: SystemId
          Value: !FindInMap
            - TagsMap
            - EnvName
            - SystemId

まとめ

私が業務で扱った CloudFormation テンプレート内の定義で便利だと思ったものを紹介しました。

CloudFormation は自動化していくにあたって欠かせないサービスになるので、活用していきまた別の Tips があったらブログで紹介します。