Slack と Google Apps Script (GAS) を連携してMy英単語帳を作る。
少し前から英語を勉強するようになったこともあり、調べた英単語を残してあとで見返せるようにしたい、と思いちょっとしたアプリ?Bot?を作ってみたので、中身と作り方を簡易にまとめておく。
やったこと
- Slackで投稿した単語をGoogle Apps Script (以下、GASと呼ぶ)へ連携し、単語と翻訳をGoogleスプレッドシートへ登録、かつ、Slackへ返す。
やりたかったけど諦めたこと
なぜこの構成にしたのか
作成手順
SlackとGASの連携
Slack:チャンネル作成 My単語帳用の専用チャンネルの作成
Slack:Slackアプリの作成 外部APIと連携するためにカスタマイズSlackアプリの作成が必要(Slack Botと呼ばれているやつかと)
- My単語帳用の Slack Bot の作成(Bot User)
My単語帳用の Slack Bot の 「Installed App Settings」で Token の作成(※「Bot User OAuth Access Token」はGASで使用)
GAS:スクリプト作成
- GASライブラリ「SlackApp」の追加
※無限ループするらしいので注意
- Slack:Outgoing Webhook のアプリをインストール
- Slackのワークスペースに内に追加するアプリ(外部アプリ)
ここまででSlackとGASが連携でき、SlackからのメッセージをGASへWebhook(POST)してGASで処理してSlackへWebhook(POST)してとなる。
翻訳とGoogleスプレッドシートへの登録
- GAS:LanguageApp.translateを使って翻訳
function translate(){ var text = 'dog'; var transVal = LanguageApp.translate(text, "en", "ja"); Logger.log(transVal); }
実行ログ [19-12-28 22:36:38:199 JST] 犬
- GAS:スプレッドシートへ値をセット
// 値を設定するシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('wordBook'); // シートの最終行取得 const LastRow = sheet.getLastRow(); // 対象セルへ値をセット sheet.getRange(LastRow + 1,1).setValue(text); sheet.getRange(LastRow + 1,2).setValue(transVal);
- GAS:最終的なスクリプト
※基本コピペの組み合わせ
// 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 から変更した方がよいのかも。
参考
2019年読んだ本のまとめ
2019年自分が読んだ本の整理をしてみる。(2018年に読んだ本も若干入っている・・・)
読んだ本
下記に読んだ本を列挙してみる。ただし、すべての本を最後まで読んだかどうかは・・・。
技術
――システム構築の大前提―― ITアーキテクチャのセオリー
ーーシステム構築の大前提ーー ITアーキテクチャのセオリー [ 中山 嘉之 ]
- ジャンル: 本・雑誌・コミック > ビジネス・経済・就職 > 経営 > 経営戦略・管理
- ショップ: 楽天ブックス
- 価格: 3,300円
アジャイルサムライ−達人開発者への道−
Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン
FEARLESS CHANGE アジャイルに効くアイデアを組織に広めるための48の [ マリリン・マンズ ]
- ジャンル: 本・雑誌・コミック > ビジネス・経済・就職 > 経営 > 経営戦略・管理
- ショップ: 楽天ブックス
- 価格: 2,750円
ディープラーニング活用の教科書
ディープラーニング活用の教科書 [ 日本ディープラーニング協会 ]
- ジャンル: 本・雑誌・コミック > ビジネス・経済・就職 > 経営 > 経営戦略・管理
- ショップ: 楽天ブックス
- 価格: 1,980円
イラストで学ぶ 機械学習 最小二乗法による識別モデル学習を中心に
Web技術 最強の指南書
マイクロサービスアーキテクチャ
英語
英語耳[改訂・新CD版] 発音ができるとリスニングができる
1駅1題 新TOEIC TEST文法特急
英単語の語源図鑑
その他
ザ・ゴール コミック版
ザ・ゴール コミック版 [ エリヤフ・M.ゴールドラット ]
- ジャンル: 本・雑誌・コミック > ビジネス・経済・就職 > その他
- ショップ: 楽天ブックス
- 価格: 1,320円
- ジャンル: 本・雑誌・コミック > 人文・地歴・哲学・社会 > 宗教・倫理 > 倫理学
- ショップ: 楽天ブックス
- 価格: 1,430円
学びを結果に変えるアウトプット大全
- ジャンル: 本・雑誌・コミック > 人文・地歴・哲学・社会 > 宗教・倫理 > 倫理学
- ショップ: 楽天ブックス
- 価格: 1,595円
人を動かす 文庫版
「やりがいのある仕事」という幻想
FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣
FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣 [ ハンス・ロスリング ]
- ジャンル: 本・雑誌・コミック > 人文・地歴・哲学・社会 > 社会科学 > 社会科学全般
- ショップ: 楽天ブックス
- 価格: 1,980円
Google流資料作成術
Google流 資料作成術 [ コール・ヌッスバウマー・ナフリック ]
- ジャンル: 本・雑誌・コミック > ビジネス・経済・就職 > 経営 > 経営戦略・管理
- ショップ: 楽天ブックス
- 価格: 2,200円
まとめ
改めて見ると、
技術はアジャイルやらマイクロサービスやらディープラーニングといったバズワード的な本が多いかな。それに、考え方や概要を知るための本がほとんど。
英語は、TOEIC対策。
仕事は、環境を変えようと考えて選んだ本な感じかと。
来年はもっと技術を磨く本を読んで学んでいこう。それに、50冊を目標に読んでブログに載せていきたい。(やるのかな)。
Docker でコンテナ間通信ってどうやるの?
コンテナ間の通信ってどうやるのかという疑問が出たので、調べた内容を残しておく。
やりたいこと
環境
- 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で接続可能。
おわりに
だいぶコンテナ使えるようになったかなと思っていたけど、調べれば調べるほど知らない、わからないが増えていく。 ネットワークに関してもまだまだ奥が深そう。 もう少しコンテナを触ったらサーバーレスに手を出していこうかと。 (機械学習も含めてサーバーレスでなんかアプリ作れないかな)
参考
www.slideshare.net docs.docker.jp docs.docker.jp docs.docker.jp docs.docker.jpSpringBootを使って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点台だったと思う。)
勉強の中身
何をやっているかをメモとして箇条書きしていく。
本
- TOEIC L & R TEST 出る単特急 金のフレーズ (TOEIC TEST 特急シリーズ)
- TOEICの自分のレベルにあった単語を集中して覚えられるのが良い。特に、後述している「abceed analitics」アプリと併用するとグッド。ただし、自分のようにそもそものレベルが低い場合は、初歩的な単語を別に勉強する必要があるかもしれないという気もした。
- 1駅1題 新TOEIC TEST文法特急
- 英語耳[改訂・新CD版] 発音ができるとリスニングができる
- 初めて発音の勉強をしてこんなにも母音と子音の発音が多いことを再認識できた。また、日本語と同じ発音が全然ないことも知り、通りでジャパングリッシュだと英語が聞こえないわけだという納得感も得られた。(もっと真剣に実施するとかなり成長するかも)
- 公式TOEIC Listening & Reading問題集(5)
- TOEICの事前演習としてグッド。
- 中学 英語を もう一度ひとつひとつわかりやすく。
- とにかくわかりやすい。英語が苦手な人なら買うとよい。
- 英単語の語源図鑑
- へーとなる単語の語源がわかる本。単語が身に付くかはわからないが、何となく単語の傾向がつかめる気がする。
アプリ
- 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 ハッカソン@名古屋」に参加してきた。
名古屋における Kubernetes ハッカソン、今皆さまだけで、DevOps 環境を構築して頂いてます!#てらだよしおまつり pic.twitter.com/Pwdyy8VL23
— 寺田佳央@クラウド・アドボケイト (@yoshioterada) October 27, 2019
参加したきっかけは、そろそろk8sを「名前知ってる」から「ちょっと使える」になりたい、かつ、Dockerやk8sの勉強会に行ってみたいと思っていたからかなと(わかっている人に教わった方が早いのではという考えもあったり)。ただ、見つけたのが数日前、かつ、期間が2日間、かつ、タイトルがハッカソンとなっていたので割とギリギリまで参加するかを悩んだというのは事実。(特にハッカソンに自分は引っかかっていた。聞くだけじゃない勉強会に参加するのが初めてだったので。まあ結果的には参加できてよかった。)
というわけで、今回は勉強会参加してきたブログ。基本的にはやったことやその時感じたことを淡々と書いている。
勉強会の内容
概要
- 参加者全員でモブプロ
- モブプロ = 一人が操作(コマンドの実行など)を行い、他の人が見ながらフォローしたりするプログラミング(ペアプロの人数多い版?)
- 説明 by Microsoft 寺田佳央さん
- 1日目:寺田さん説明のもとk8s構築
- 2日目:参加者の力でk8s構築 + DevOps構築 + Docker&k8s心得
- GitHub: github.com
1日目やったこと
全員で同じ環境で作業を行うため、Azureアカウントを作成し、Azure上に作業用となるVM(Linux)を立てて構築を行う。(VMは作業用のため個人でやる場合は、ローカルでも問題なし)
またこの時の構築手順は下記リンクをもとに実施。(※ただし、完全に同じというわけではないため、一からやってみる際は注意が必要。)
- 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) の作成
- 今回はCLIでインストールを実施
- クイック スタート:Azure CLI を使用して Azure Kubernetes Service クラスターをデプロイする
- AKSは様々なサービスが同時にデプロイされるため、作成までに割と時間がかかる
- Kubectlコマンドのインストール
- AKS接続用の資格情報の取得
- AKSからACRへの接続情報の作成
- Deployment 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
懇親会
運営の方、寺田さん、参加者の方と飲みながら話せる良い機会でした。記憶に残っていることとして、「テクノロジーは手段、何を実現したいか、何に困っているかを把握し、適したテクノロジーを使える能力が必要」、「すべてのエンジニアを幸せにしたい」、「知りたいこと駆動開発」、「勉強会では登壇者と参加者ともに何かを得る機会にしたい」といった考え方や熱い思いが聞けたことかなと。自分も熱い思いをもって技術を磨いていきたいと思える素敵な飲み会でした。
2日目やったこと
1日目の復習
2日目は自分たちの力でk8s環境構築を実施する(たまに寺田さんに助けてもらう)。自分たちで進めていくということもあり、1日目とは違い参加者であれやこれや話しながら実施できてとても面白い経験ができた(これが勉強会か!ハッカソン?ハンズオン?か!という経験)。特に、AKSに入る前に今回の全体像をホワイトボードに書きながら整理できたことが2日目の一番の収穫ではと感じている。その時のホワイトボードをもとに自分なりに整理したイメージが下図。(誤りがあれば教えてください)
このホワイトボードの整理時間がなかったたら、全体像がわからず理解が深まらない可能性が高かったと思うので、参加者のみなさんに感謝している。(若干横道にそれてしまう発言を何度もしてしまった気がして、申し訳ないような申し訳なくないような感じである)。
そして、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?コンテナ?の仕組みがJavaのEJBやらと似ているような気がするので・・・DIコンテナにクラス登録して呼び出して使うみたいなことが、Dockerイメージ作ってDocker起動する流れに似ている?
また、そのうちDockerを使ったWebサーバ、アプリサーバ、DBサーバ構成の簡易アプリを作ってみようかと。
ではでは、お疲れ様でした。