hijikitaroのブログ

しがないSIerとして、日々プロジェクトを管理し、システムを育て、日々お子を見守り育てる中での出来事や学びを淡々と書いています。

Slack と Google Apps Script (GAS) を連携してMy英単語帳を作る。

少し前から英語を勉強するようになったこともあり、調べた英単語を残してあとで見返せるようにしたい、と思いちょっとしたアプリ?Bot?を作ってみたので、中身と作り方を簡易にまとめておく。

やったこと

やりたかったけど諦めたこと

  • 英語の品詞まで特定して返す
    • 英語辞書の良さげなAPIがなかった
    • 自然言語処理APIは文章となるので今回は外した。(今回は単語のみで扱いたかった)

なぜこの構成にしたのか

作成手順

SlackとGASの連携

  • Slack:チャンネル作成 My単語帳用の専用チャンネルの作成

  • Slack:Slackアプリの作成 外部APIと連携するためにカスタマイズSlackアプリの作成が必要(Slack Botと呼ばれているやつかと)

https://api.slack.com/start

  • My単語帳用の Slack Bot の作成(Bot User)
  • My単語帳用の Slack Bot の 「Installed App Settings」で Token の作成(※「Bot User OAuth Access Token」はGASで使用)

  • GAS:スクリプト作成

    • GASライブラリ「SlackApp」の追加

github.com

※無限ループするらしいので注意

  • Slack:Outgoing Webhook のアプリをインストール

ここまででSlackとGASが連携でき、SlackからのメッセージをGASへWebhook(POST)してGASで処理してSlackへWebhook(POST)してとなる。

翻訳とGoogleスプレッドシートへの登録

  • GAS:LanguageApp.translateを使って翻訳

developers.google.com

function translate(){
  var text = 'dog';
  var transVal = LanguageApp.translate(text, "en", "ja");
  Logger.log(transVal);
}
実行ログ
[19-12-28 22:36:38:199 JST] 犬
  // 値を設定するシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('wordBook');
  // シートの最終行取得
  const LastRow = sheet.getLastRow();

  // 対象セルへ値をセット
  sheet.getRange(LastRow + 1,1).setValue(text);
  sheet.getRange(LastRow + 1,2).setValue(transVal);

※基本コピペの組み合わせ

// Bot User OAuth Access Token をSLACK_TOKENに格納します。
var SLACK_TOKEN = "******";
// Outgoing Webhooks設定画面で表示されるTokenをWEBHOOK_TOKENに格納します。
var WEBHOOK_TOKEN = "*******";

// doPost関数はエンドポイントにPOSTで届いた情報をキャッチする関数のことです(GASのデフォルト関数)
function doPost(e) { // eにはPOSTされた投稿情報が格納されています。
  // 注意:下記if文は無限ループを回避する為のものです。e.parameter.user_nameが"slackbot"以外の時のみ次の処理を行います。
  // outgoing webhooksの設定でトリガーを指定していない場合、slackAPPからslackに行う投稿(後述)もGASにPOSTされてしまいます。
  // その投稿情報のe.parameter.user_nameは必ず"slackbot"になります。その為、user_nameが"slackbot"じゃない時のみ処理します。
  // ※SlackAppでSlackに投稿する際、投稿するユーザー名を自由に決められる(後述)ので、parameter.user_nameも指定したユーザー名になるかと思いきや、必ず"slackbot"という値になリます。
  // トリガーを設定しない場合は必ず設定してください。
  if (e.parameter.user_name != "slackbot"){
    postMessage(e.parameter.token, e.parameter.text);
  }
}

//Post massage(Slackに投稿する関数)
var postMessage = function(webhook_token, text){
  // POSTされたwebhook_tokenと、設定したOutgoing Webhooksのwebhook_tokenを照合し、異なる場合はエラーを通知します。
  // GASのendpointを知られてしまい、勝手にGASにPOSTされた場合への対処です。
  if (WEBHOOK_TOKEN != webhook_token) {
    throw new Error("invalid token."); //エラーを通知します
  }
  // PropertiesService:https://developers.google.com/apps-script/reference/properties/
  PropertiesService.getScriptProperties().setProperty("token", SLACK_TOKEN);
  var prop =  PropertiesService.getScriptProperties().getProperties();
  // slackAppライブラリを利用してslackに投稿
  var slackApp = SlackApp.create(prop.token);
  
  // 対象チャンネル
  var channelId = "#****";
  // 投稿するメッセージ
  var message = registerMyWord(text);
  var options = {
  }
  slackApp.postMessage(channelId, message, options);
  return null;
}

// 単語の登録と翻訳
var registerMyWord = function(text){
  
  var val = text;
  // 英語から日本語へ翻訳
  var transVal = LanguageApp.translate(text, "en", "ja");
  
  // 値を設定するシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('wordBook');
  // シートの最終行取得
  const LastRow = sheet.getLastRow();

  // 対象セルへ値をセット
  sheet.getRange(LastRow + 1,1).setValue(text);
  sheet.getRange(LastRow + 1,2).setValue(transVal);
  
  return text + '\n' + transVal;

}

おわりに

初めて作ったので、ちょっとしたことでつまづいてしまったが、わかればかなり簡単にSlack Botが作成できる。今回作成したMy単語帳のデータがたまったら、データを分析し、わからない単語の傾向や品詞の傾向などがつかめればよいなと思っている。

また、Slack Bot の作成として、下記記事のように Outgoing WebHooks から変更した方がよいのかも。

qiita.com

参考

qiita.com

tech.tabilabo.co.jp

qiita.com

tech-lab.sios.jp

qiita.com

www.sejuku.net

2019年読んだ本のまとめ

2019年自分が読んだ本の整理をしてみる。(2018年に読んだ本も若干入っている・・・)

読んだ本

下記に読んだ本を列挙してみる。ただし、すべての本を最後まで読んだかどうかは・・・。

技術

  1. ――システム構築の大前提―― ITアーキテクチャのセオリー

  2. アジャイルサムライ−達人開発者への道−

  3. Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン

  4. 人工知能は人間を超えるか ディープラーニングの先にあるもの

  5. ディープラーニング活用の教科書

  6. プログラミング言語図鑑

  7. イラストで学ぶ 機械学習 最小二乗法による識別モデル学習を中心に

  8. Web技術 最強の指南書

  9. マイクロサービスアーキテクチャ

英語

  1. TOEIC L & R TEST 出る単特急 金のフレーズ (TOEIC TEST 特急シリーズ)

  2. 英語耳[改訂・新CD版] 発音ができるとリスニングができる

  3. 1駅1題 新TOEIC TEST文法特急

  4. 英単語の語源図鑑

その他

  1. もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら

  2. ザ・ゴール コミック版

  3. 仕事は楽しいかね?

  4. エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド

  5. 学びを結果に変えるアウトプット大全

  6. 人を動かす 文庫版

  7. 「やりがいのある仕事」という幻想

  8. FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣

  9. Google流資料作成術

まとめ

改めて見ると、

技術はアジャイルやらマイクロサービスやらディープラーニングといったバズワード的な本が多いかな。それに、考え方や概要を知るための本がほとんど。

英語は、TOEIC対策。

仕事は、環境を変えようと考えて選んだ本な感じかと。

来年はもっと技術を磨く本を読んで学んでいこう。それに、50冊を目標に読んでブログに載せていきたい。(やるのかな)。

Docker でコンテナ間通信ってどうやるの?

コンテナ間の通信ってどうやるのかという疑問が出たので、調べた内容を残しておく。

やりたいこと

  • コンテナ名でコンテナ間の通信を行う
    • wordpressコンテナ ⇔ mysqlコンテナ
    • 同一ホスト上(別ホストの場合はまた違う設定が必要っぽい)

環境

  • Windows 10 Home (64bit)
  • Visuali Sutdio Code
  • Docker Toolbox
    • ポート:8090

コンテナ間通信

同じホスト内でコンテナ間をコンテナ名で通信する場合は、コンテナを同じネットワーク内で起動しておく必要があるらしい。

下記を参考(そのまままねて)にしてやってみる。 knowledge.sakura.ad.jp

ついでに、 docker compose を使った場合もやってみる。

Docker でコンテナ間通信

ざっくりとして手順。

1:コンテナネットワーク作成

2:1で作成したネットワーク上でコンテナを起動する

  • ネットワーク作成

wordpress-network」でコンテナネットワークを作成する。

docker network create wordpress-network

コンテナネットワークが作成されているか確認する。

$ docker network ls                                                                                                     NETWORK ID          NAME                          DRIVER              SCOPE
548044c5d811        bridge                        bridge              local
7987b453fc8c        host                          host                local
2a179bb52592        none                          null                local
0b1105eef469        wordpress-network             bridge              local

作成されたコンテナネットワークの中身を確認する。

$ docker network inspect wordpress-network
[
    {
        "Name": "wordpress-network",
        "Id": "0b1105eef469596d1280b20d05550aa5d0ece6255d3bfa2fefe264e7b74bc8e7",
        "Created": "2019-12-15T11:44:28.044695246Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
  • コンテナ作成(コンテナ間通信する2つのコンテナ)

コンテナ名を「sample-mysql」とした mysql コンテナを起動する。(dockerイメージはrun時に持ってくる)

docker run --name sample-mysql --network wordpress-network -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7

コンテナ名を「wordpress 」とした wordpress コンテナを起動する。(dockerイメージはrun時に持ってくる)

"WORDPRESS_DB_HOST" は WordPress のDBのホスト名の設定

"WORDPRESS_DB_PASSWORD" は WordPress の接続するDBのパスワードの設定

※"-e"のオプションは環境変数の設定

docker run --name wordpress --network wordpress-network -e WORDPRESS_DB_HOST=sample-mysql -e WORDPRESS_DB_PASSWORD=my-secret-pw -p 8080:80 -d wordpress

作成されたコンテナイメージを確認する。

$ docker image ls                                                                                                                                                                            REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           latest              b9db6e8f3175        2 days ago          539MB
mysql               5.7                 1e4405fe1ea9        3 weeks ago         437MB

起動しているコンテナを確認する。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
d7d2f43976fd        mysql:5.7           "docker-entrypoint.s…"   17 minutes ago      Up 17 minutes       3306/tcp, 33060/tcp    sample-mysql
7308049993a2        wordpress           "docker-entrypoint.s…"   21 minutes ago      Up 13 minutes       0.0.0.0:8080->80/tcp   wordpress
  • 通信確認(ホストから接続)
http://localhost:8090/

で接続する。ただし、本ブログではDocker Toolboxで接続しているため、ポート番号が8090となっている。

Docker Toolboxを使用しない場合は、ホストOSからポート8080で接続可能。

Docker Compose でコンテナ間通信

  • docker-compose.yml 作成
version: '3'

services:

  wordpress:
    image: wordpress
    container_name: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: sample-mysql
      WORDPRESS_DB_PASSWORD: my-secret-pw

  mysql:
    image: mysql:5.7
    container_name: sample-mysql
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
  • コンテナ作成

docker compose を実行する。

※docker-compose.yml を配置しているディレクトリで実行すること。

docker-compose up -d

コンテナネットワークを確認する。

※docker compose ではコンテナネットワークをデフォルトで作成してくれるらしい。ネットワーク名は、「ディレクトリ名 & "_default"」っぽい。

$ docker network ls
NETWORK ID          NAME                          DRIVER              SCOPE
548044c5d811        bridge                        bridge              local
7987b453fc8c        host                          host                local
2a179bb52592        none                          null                local
0abd1b08fdc9        test-docker-network_default   bridge              local
0b1105eef469        wordpress-network             bridge              local

作成されたコンテナイメージを確認する。

$ docker-compose images
 Container     Repository    Tag       Image Id      Size
----------------------------------------------------------
sample-mysql   mysql        5.7      1e4405fe1ea9   416 MB
wordpress      wordpress    latest   b9db6e8f3175   514 MB

起動しているコンテナを確認する。

$ docker-compose ps
    Name                  Command               State          Ports
----------------------------------------------------------------------------
sample-mysql   docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp
wordpress      docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
0022bd9d0e0f        mysql:5.7           "docker-entrypoint.s…"   8 hours ago         Up 25 seconds       3306/tcp, 33060/tcp    sample-mysql
53d349af16dd        wordpress           "docker-entrypoint.s…"   8 hours ago         Up 25 seconds       0.0.0.0:8080->80/tcp   wordpress
  • 通信確認(ホストから接続)
http://localhost:8090/

で接続する。ただし、本ブログではDocker Toolboxで接続しているため、ポート番号が8090となっている。

Docker Toolboxを使用しない場合は、ホストOSからポート8080で接続可能。

おわりに

だいぶコンテナ使えるようになったかなと思っていたけど、調べれば調べるほど知らない、わからないが増えていく。 ネットワークに関してもまだまだ奥が深そう。 もう少しコンテナを触ったらサーバーレスに手を出していこうかと。 (機械学習も含めてサーバーレスでなんかアプリ作れないかな)

参考

tech-blog.rakus.co.jp

www.slideshare.net docs.docker.jp docs.docker.jp docs.docker.jp docs.docker.jp

SpringBootを使ってWebアプリを作ってみる on コンテナ

最近Webアプリを手を動かして開発することがかなり減ったので、12月の余裕がある時期にJavaを使ってWebアプリをコンテナ上に作ってみる。 あとSpringBootを触ったことがないので、今回でちょっとかじってみる。

はじめに

今回作成したもろもろをGitHubへあげたので載せてみる。 github.com

やったこと

  • SpringBootを使ったアプリ開発
  • Dockerを使ったアプリ開発

    SpringBootでの開発

    Visuali Sutdio Code を使ったJava開発 + SpringBoot設定をしてみた。

以下の記事を参考。 qiita.com www.sejuku.net

記事どおりに設定してやってみただけなので、まだSpringBootの良さは全然わかっていない。 理解するにはもっと複雑なアプリを作ってみないとわからない。

Dockerでの開発

Docker でJavaのビルドとデプロイを試してみた。

以下の記事を参考。 qiita.com github.com

以前のk8s勉強会の復習もかねてコンテナ構成を試してみた。 試すことでどのようなコンテナを作成しているかを少し理解することができた。 Dockerfile の ENTRYPOINT が何をしているかがよくわかっていなかったので、 以下の記事を参考にして理解が深まった。(かも) qiita.com

おわりに

今回はJavaを簡易にビルドしてコンテナ化するだけのアプリだったため、次回は Webアプリ + DB を Docker上で作成して簡易マイクロサービスのようなアプリを作ってみようと思う。 どんどん作っていき、もっと様々な技術を使えるようになっていきたい。

初めての転職、今の気持ちを忘れないように

2020年1月から新天地で働くことにしたので、そうすることにした自分の気持ちやら行動やらを徒然なるままに書き残す。

はじめに

人生で初めて転職をすることにしたので、なぜ転職しようとしたのか、そのために何をしたのか、今の気持ちはどうか、を言語化してあとで思い出せるようにするためのブログ。

どちらかというと、人生で初めて「捨てる」経験をしたと思うので何か残せればと思ったり思わなかったり。

対象

  • 自分(次の新天地で悩むことがあったら見てほしい)

きっかけ

ざっくり言うと、IT屋として仕事をしたいという思いが強い。(SEおじさんになってしまうことがめちゃめちゃ恐怖だった。) ほかにもいろいろあるので、下記に箇条書き。

  • 現職でのITスキルやPMスキルの成長に限界を感じたこと(特にITスキルは参画しているプロジェクト的にもやっと昭和から平成になるぐらいのレベルだった。)
  • 今後ITを真剣に勉強して身に着けるために、自分で行動する癖をつける必要があると感じたこと
  • 同期含めて周りの知り合いがどんどん転職していること
  • 技術系のセミナー、勉強会で自分の価値を高める行動をするべきで、そのためにどんどん成長できる場所に移ることを進められる機会が多かったこと
  • ここ1、2年でかなり自分の周りに「転職」というキーワードが飛び交い、何かの縁だと感じたこと
  • 勉強会で周りが実務でクラウド云々の話をしていて自分が何も話せなかったこと(本当に嫌だった。取り残されてる感が辛かった。)

転職活動

やったことを箇条書き。

  • 転職サイト・エージェント登録
    • どういう会社・職種が応募できるのか、自分は何がしたいか、自分の価値はどれぐらいか、をなんとなく知ることができる。
  • 職務経歴の振り返り・職務経歴書の作成
    • これがかなり重要。転職するかどうかに関わらずやるべき。自分が今までどの役割で何をやってきたか、その時何を軸にどのような行動をしたか、使った言語やツールは何か、などを入社時から振り返ってみた。
  • 面接対策
    • 話すのが苦手なので、事前に一通りの回答を準備した。面接都度、何が質問されてどう答えたか、雰囲気はどうだったかをメモするようにした。基本は今までの振り返りが出来ていれば良いのかも。あと、一貫したストーリーを作ること。

退職する会社への思い

基本的にここまで成長させてくれたことにめちゃくちゃ感謝している。(実際は会社よりもお世話になった人なのかもしれない。)

入社1年目から社内でも大きなプロジェクトに重要な役割を持たせてもらいながら参画させてもらえたことがかなり活きている。この時の経験が自分の基盤になって仕事をしていると思う。(ただあるべきといったこだわりを持ちすぎてわーわー言うことが多くなってしまった気もしている。)

自分がこの会社で関わった人とは今後も仲良くしていきたい。出来れば一緒に仕事をしたいとも思う。

で、ここからが若干の不満ポイント。ここは気持ち薄まるように箇条書きで。

  • ITに興味がある人が少ない。むしろ、大多数が興味がない。
  • 興味がある人ほど古い技術のプロジェクトをやらされ、無理矢理プロジェクトマネジメントをやらされる。
  • 興味がない人ほど最新の技術のプロジェクトがやれる。(自分はやれないことにイライラしてた)
  • プロジェクトを終わらせることが目的の人がほとんどだったと思う。システムによって本質的な課題を解決していくことでは?と思うことがよくある。(お金がもらえないとやれないので、あるべきばかりは言ってられないが…)
  • 全体的にITもPMのスキルもなく、ベンダー任せばかり。最終的には人材派遣会社かと感じてしまった。

書き出すといろいろ出てしまう。

転職する会社への思い

ITアーキテクトとして成長できる環境であってほしい。出来れば少しでも新しい技術を使ったプロジェクトに参画してスキルを磨きたい。

ITスキルはバージョンアップ出来ていないので、かなり不安がある。それに、英語が不安。あとは、仲良くなれるか、頼れる人を見つけられるか、期待に応えられるか、が不安。

でも、また1から成長できる環境に身を置けることは楽しみではある。まあいろいろ今までよりもレベルが高い仕事になると思うので成長できそうで楽しみ。

おわりに

とにかく気負い過ぎず頑張る。周りと仲良くなる。周りを頼る。社内の制度をフル活用する。

2020年から頑張れ、自分。

最近、英語を勉強し始めたので備忘録

11月ぐらいから高校生ぶりに英語を勉強し始めたので、せっかくなので何をやっているかを将来の自分のために、残しておこうと思う。

はじめに

2020年から大きく環境が変わり、わりと英語が業務として必要になりそうなので、 少しでも読める、聞けるようにしたいと思ったのがきっかけ。

(ITに関わる仕事上、より早く情報を収集するためにも必須、かつ、エラーを理解するためにも必須、とも最近強く感じている。)

対象読者

  • 将来の自分(また英語を勉強しなおす場合にでも見て何をしていたかを思い出してもらう)

今の目標

  • TOEIC Listening & Reading Test 600点
    • 現状は数年前に受けて300点台だったのをうっすら覚えている。(大学1年の時ですら400点台だったと思う。)

勉強の中身

何をやっているかをメモとして箇条書きしていく。

アプリ

  • abceed analitics
    • 上記の「TOEIC L & R TEST 出る単特急 金のフレーズ」を無料で単語のリスニングができるアプリ。同じシリーズの「銀のフレーズ」も同じく無料で聞けるため良い。プランを有料にするとさらに英語学習に適した学習ができそう。
  • BBC Learning English(6 Minute English)
    • ちょっとした時間に英語の長文を聞きたいときに使う感じ。英語に慣れるという意味でよい。ただし、問題はちゃんと解いていない。

その他

  • Netflix
    • 楽しみながら英語を学ぶのに最適。「英語・日本語字幕」で一回みて次に「英語・英語字幕」で同じものを見るのを実施。これをやってわかったことは、意訳のすごさ。英語の雰囲気を日本語で表すと全然違う表現となり、単純に訳すだけじゃないということがわかる。下記がおすすめのコンテンツ。

勉強の状況

2か月ほどやってみて、当初よりも単語力がかなりついたのと少しづつ英語が聞こえる気がしてきている。 特に毎日Netflixで上記のドラマなどを見るのが地味によいのかもしれない。 また、TOEIC対策の勉強をすることでTOEICの解き方がわかり、勉強する前よりも確実に解けるようになってきている。 ただし、実際に勉強してきて下記ができていないことを痛感している。

  • 精読ができない(英語を雑に読む、読んだ気になるためちゃんと文章として理解できない。)
  • 発音ができない(英語を正しく発音できないため、英語が聞き取れない。リズムよく英語の文章を脳内でも読めない。)

おわりに

2020年まであと数日しかないが、日常生活の中でどんどん英語に触れていくようにしようと思う。 ゆくゆくはGithubのReadmeを英語で書いたりできるとカッコ良いなと思っていたりする。

TOEICが何点だったかはそのうち載せるかも・・・)

「Kubernetes on Azure ハッカソン@名古屋」に参加してきた。

はじめに

Kubernetes on Azure ハッカソン@名古屋」に参加してきた。

75az.connpass.com

参加したきっかけは、そろそろk8sを「名前知ってる」から「ちょっと使える」になりたい、かつ、Dockerやk8sの勉強会に行ってみたいと思っていたからかなと(わかっている人に教わった方が早いのではという考えもあったり)。ただ、見つけたのが数日前、かつ、期間が2日間、かつ、タイトルがハッカソンとなっていたので割とギリギリまで参加するかを悩んだというのは事実。(特にハッカソンに自分は引っかかっていた。聞くだけじゃない勉強会に参加するのが初めてだったので。まあ結果的には参加できてよかった。)

というわけで、今回は勉強会参加してきたブログ。基本的にはやったことやその時感じたことを淡々と書いている。

勉強会の内容

概要

  • 参加者全員でモブプロ
    • モブプロ = 一人が操作(コマンドの実行など)を行い、他の人が見ながらフォローしたりするプログラミング(ペアプロの人数多い版?)
  • 説明 by Microsoft 寺田佳央さん
  • 1日目:寺田さん説明のもとk8s構築
  • 2日目:参加者の力でk8s構築 + DevOps構築 + Docker&k8s心得
  • GitHubgithub.com

1日目やったこと

全員で同じ環境で作業を行うため、Azureアカウントを作成し、Azure上に作業用となるVMLinux)を立てて構築を行う。(VMは作業用のため個人でやる場合は、ローカルでも問題なし)

またこの時の構築手順は下記リンクをもとに実施。(※ただし、完全に同じというわけではないため、一からやってみる際は注意が必要。)

github.com

github.com

  • Docker インストール
  • az cli インストール
  • ハンズオン用ソースダウンロード
  • Docker イメージ作成
    • Maven用のDockerイメージの作成(用意されたDockerfileを使用しbuildを実施)
  • Azure Container Registry(ACR)の作成
  • ACRにDocker Login
  • ACRにDockerイメージをPush
    • 「2-build-create.sh」を実行するとDockerイメージのbuild→tag→pushが行われる
    • AzureポータルからACRを確認
  • Dockerの動作確認
    • 「ACRにDockerイメージをPush」でできたDockerイメージをrunする
  • Azure Kubernetes Service (AKS) の作成
  • Kubectlコマンドのインストール
  • AKS接続用の資格情報の取得
  • AKSからACRへの接続情報の作成
  • Deployment YAML の適用
    • 「4-create-deployment-svc.yaml」を一部修正
  • Kubernetesの基本的な操作(自分のモブプロ担当領域)
    • 1日目に自分が担当した領域で、1日目はわけもわからずに言われるがままコマンドをたたいていた・・・(完全に寺田さんのマリオネット状態)
    • わざとDeploymentを失敗させる、pod数を変更する、cpuサイズを変更する、ログを確認する、ラベルによるフィルタなどの操作をしたと思う(すいません、言われるがままだったのでしっかりと理解はできていません)
    • その時にたたいていたコマンドは以下(コマンド内のpod名などがそのまま載っているため、使用する際には変更すること)
# k8s の基本的な操作に関するコマンド
## pod確認
kubectl get po
kubectl get po -o wide
kubectl get po -o wide -w
kubectl get po -n kube-system
## pod削除
kubectl delete po spring-front-service-7d8dc8fdc8-j4f54
## deployment確認
kubectl get deployment
## deploymentをフィルタして取得(labelなど)
kubectl get po --selector app=spring-front-service
kubectl get po --selector app=spring-front-service,version=v1
kubectl get po --selector app=spring-front-service,version=v2
## podの状況確認
kubectl describe po spring-front-service-7d8dc8fdc8-klxh2
## secret確認(接続情報)
kubectl get secret
## podでコマンド実行
kubectl exec -it spring-front-service-7d8dc8fdc8-j4f54 env
kubectl exec -it spring-front-service-7d8dc8fdc8-j4f54 /bin/sh
## deploymentのscale
kubectl scale deployment/spring-front-service --replicas=3
## namespace確認
kubectl get ns
## Service確認
kubectl get svc
## Ingress確認
kubectl get ing
## logs確認
kubectl logs [pod]
kubectl logs -n kube-system coredns-866fc6b6c8-2dmrf
## メトリクスで取得しているPodごとのメモリ確認
kubectl top po
## yamlの適用
kubectl apply -f 4-create-deployment-svc.yaml
## deploymentをじかに編集(あまりやらないのがおすすめ)
kubectl edit deployment/spring-front-service
## port-forward設定(kubectl経由でAKS podへ)
kubectl port-forward spring-front-service-6667858b55-6rrhs 8080:8080
  • Service YAML の適用
  • Helm のインストール(わかっていない)
    • 上手くいかず、寺田さんがSlackに書いてくれたコマンドで解決。(理由がわかっていません)
    • k8sのnamesapceにIngressが存在しているかがどうかを見る必要があった気がする。
  • Ingress YAML の適用(わかっていない)

懇親会

運営の方、寺田さん、参加者の方と飲みながら話せる良い機会でした。記憶に残っていることとして、「テクノロジーは手段、何を実現したいか、何に困っているかを把握し、適したテクノロジーを使える能力が必要」、「すべてのエンジニアを幸せにしたい」、「知りたいこと駆動開発」、「勉強会では登壇者と参加者ともに何かを得る機会にしたい」といった考え方や熱い思いが聞けたことかなと。自分も熱い思いをもって技術を磨いていきたいと思える素敵な飲み会でした。

2日目やったこと

1日目の復習

2日目は自分たちの力でk8s環境構築を実施する(たまに寺田さんに助けてもらう)。自分たちで進めていくということもあり、1日目とは違い参加者であれやこれや話しながら実施できてとても面白い経験ができた(これが勉強会か!ハッカソン?ハンズオン?か!という経験)。特に、AKSに入る前に今回の全体像をホワイトボードに書きながら整理できたことが2日目の一番の収穫ではと感じている。その時のホワイトボードをもとに自分なりに整理したイメージが下図。(誤りがあれば教えてください)

f:id:hijikitaro:20191102002551p:plain

このホワイトボードの整理時間がなかったたら、全体像がわからず理解が深まらない可能性が高かったと思うので、参加者のみなさんに感謝している。(若干横道にそれてしまう発言を何度もしてしまった気がして、申し訳ないような申し訳なくないような感じである)。

そして、2日目もIngress部分で上手くいかず、最終的に寺田さんに助けていただいたが、やっぱり自分ではまだ解決できず、きっと今も自力で解決することができないレベルではある。ネットワーク的な知識がないからなのか、そもそもWebサーバの仕組みがわかっていないのか、どこがわからないかもわかっていないという状態・・・

DevOps構築

Azure DevOps を使ったCI/CD環境構築も+αの時間で実施する予定だったが、1日目の復習に時間がかかりため、最後まで実施できなかった。なので、1日目の復習時間に寺田さんとマンツーマンでCI/CD環境構築を実施していた方に手順書を作ってもらうという対応となった。Slackに手順書がアップされたので、そのうち実施してみようと思う。(こういうのブログにするとだれか助かったりするのだろうか?会社でやってみたCI/CDも公開できる範囲で書くとよいのだろうか?)

寺田さんからのDockerやk8sの心得

2日目の最後は寺田さんからDockerやk8sの心得について以下の資料をもとに話して頂いた。

www.slideshare.net

自分が一番感じたことは、やっぱりk8sを「なぜ使うのか?」新しいから使うのではなく、明確な意図をもって使わないといけないということ。テクノロジーは手段であって、目的ではない、ということを改めて実感し、それをしっかりと伝えるためには、テクノロジーの理解と現場での経験が必要だということを感じた。自分も経験や知識を増やしてテクノロジーを伝えていける人間になりたいと強く思う。

終わりに

勉強会に参加できて本当に良かった。運営の方々、寺田さん、参加者のみなさんに感謝しています。また、Dockerやk8sの学びだけでなく、一緒に何かをする楽しさや熱い思いに触れる良い機会でした。ここからがDockerやk8sの勉強のスタートと思って日々試しながら勉強していこうかと(周りの参加者の方は、確実に自分よりも知識や経験がありそうだったので、負けないように頑張っていこうかな)。

あと、フィッピーと絵本とシールももらえて満足でした。フィッピーは、7か月のお子も気に入ってくれ、絵本は破ろうとするので・・・もう少し大きくなったら読んであげようかと。

この勉強会に出て昔かじっていたJavaをもう一度勉強しようかとも思っている。なんとなくDocker?コンテナ?の仕組みがJavaEJBやらと似ているような気がするので・・・DIコンテナにクラス登録して呼び出して使うみたいなことが、Dockerイメージ作ってDocker起動する流れに似ている?

また、そのうちDockerを使ったWebサーバ、アプリサーバ、DBサーバ構成の簡易アプリを作ってみようかと。

ではでは、お疲れ様でした。

参考