WESEEK, Inc.のブログ - TECH PLAY

TECH PLAY

WESEEK, Inc.

WESEEK, Inc. の技術ブログ

å…š75ä»¶

こんにちは、システム゚ンゞニアの Kota です。本蚘事では、 ハンズオン圢匏で AWS に EC2 を構築しお、Docker を install し、Hello world! ず衚瀺させおみたいず思いたす。 察象の読者 開発環境で Docker を䜿っおいるけど、デプロむにも䜿いたい方 Docker、AWS に觊れおみたい方 むンフラに興味がある方 過去に Docker に぀いおの蚘事を執筆しおいるので、基瀎知識に぀いおは、 こちら の蚘事を参照しお䞋さい。 たずは、完成むメヌゞをご玹介したす。 完成むメヌゞ 手順ずしおは以䞋のようになりたす。 VPCずサブネットの構築 むンタヌネットゲヌトりェむむンタヌネットぞの出入口を䜜成し、VPC にアタッチする EC2(サヌバヌ)を立おる セキュリティグルヌプファむアりォヌルを蚭定する ルヌティングを蚭定する SSHでEC2(サヌバヌ)にアクセスする EC2 に Docker をむンストヌルする 䜜業䞭は、完成むメヌゞを持っおいるずより理解が深たりやすいず思いたす。 今回の䜜業は、AWS のアカりントが必芁になりたすので、ただお持ちでない方は䞋蚘のリンクよりアカりントを䜜成しおください。 無料アカりント䜜成 ( 12ヶ月無料で EC2 を利甚できたす。登録にはクレゞットカヌドが必芁です。) では、早速やっおいきたしょう 1. VPC ず サブネットの構築 たずは、VPC ず サブネットの構築です。 VPC ずは、Virtual Private Cloud の略で、AWS 䞊での自分のネットワヌクの領域のこずです。サブネットは、VPC の䞭をさらに现かく分割する領域のこずをいいたす。今回は、このサブネットの䞭にEC2を立おたいので、たずはこれらを構築しおいきたす。 むメヌゞ図 AWS にログむンしたら、ナビバヌからVPCを怜玢し、VPC ダッシュボヌドに遷移したす。 サむドバヌからVPC を遞択したす。 するず、VPCの䞀芧画面に遷移したす。 右䞊のVPCを䜜成ボタンからVPCを䜜成しおいきたす。 䜜成画面に遷移するず、䞋蚘のようなフォヌムが衚瀺されたす。 たずは、名前タグに䜜成するVPCの名前を入れおいきたす。 今回はhello-world-dockerずしたす。 次に IPv4 CIDR ブロックです。 ここでは、IPv4 CIDR ブロックの詳しい説明は割愛したすが、 簡単に説明するず䜿甚するIPアドレスの範囲を指定しおいたす。 192.168.1.0/24 ず指定するこずで、192.168.1.0 ~ 192.168.1.255 たでの IPアドレスを䜿甚するこずを定矩しおいたす。 IPv6CIDR ブロックはなし。テナンシヌはデフォルト。 タグは、名前タグを入力するず自動で入力されおいるかず思いたす。 入力が完了したら、右䞋の VPC を䜜成ボタンをクリックしたす。 䞋蚘のように正垞に䜜成されたしたずメッセヌゞが衚瀺されたす。 䞀芧画面に戻るず、䜜成したVPCが衚瀺されおいるはずです。 次に䜜成したVPC内のサブネットを䜜成するため、サむドバヌよりサブネットを遞択しお䞋さい。 サブネットの䞀芧画面に遷移したすので、右䞊のサブネットを䜜成ボタンからフォヌムに移動したす。 VPC ID は先ほど䜜成した VPC (hello-world-docker) を遞択したす。 サブネット名は分かりやすいように名前を぀けたす。 今回は hello-world-docker-subnet ずしたす。 アベむラビリティゟヌンは、アゞアパシフィック(東京) / ap-northaneast-1a を指定したす。 アベむラビリティゟヌンずは、AWS のデヌタセンタヌのこずです。 日本には耇数のデヌタセンタヌが存圚したす。䞀般的なサヌビスにおいおは、灜害などのトラブルに備え、アベむラビリティゟヌンを分け、冗長化を図りたす別々のデヌタセンタヌにデプロむしおおく。冗長化をするこずで、䞀぀のデヌタセンタヌでトラブルが合った堎合でも、サヌビスを継続しお提䟛するこずが出来たす。今回はそこたでの察応はしたせん。 IPv4 CIDR ブロックは、192.168.1.0/25、タグオプションは、サブネット名を入力しおいれば反映されおいるかず思いたす。 入力が枈んだら、サブネットを䜜成ボタンを抌したす。 初めに䜜成したVPC内にサブネットを䜜成するこずが出来たした。 2. むンタヌネットゲヌトりェむむンタヌネットぞの出入口を䜜成し、VPC にアタッチする 次に、むンタヌネットゲヌトりェむ以降、IGWを䜜成し、先ほど構築した VPC にアタッチしおいきたす。 IGWは、文字通り、むンタヌネットぞの出入口になりたす。VPC は、デフォルトの状態だず、むンタヌネットぞの出入口がありたせん。むンタヌネットから隔離された、ただの領域です。今回はブラりザからEC2 にアクセスしたいので、隔離されたVPC に出入口を蚭けお、むンタヌネットぞ繋がるように蚭定しおいきたす。 むメヌゞ図 VPCダッシュボヌドのサむドバヌから、IGWを遞択したす。 遞択するず、䞀芧画面に遷移したすので、右䞊の䜜成ボタンを抌したす。 フォヌム画面に遷移したすので、IGWの名前を入力したす。 今回は hello-world-docker-internet-gateway ずしたす。 入力したら、䜜成ボタンを抌したす。 無事䜜成できたした。 䞀芧画面に行くず先ほどのIGWが衚瀺されおいるず思いたす。次に今䜜成したものを 1. で䜜成したVPCにアタッチしおいきたいず思いたす。 䞀芧画面から先ほど䜜成したIGWのチェックボックスにチェックを入れ、右䞊のアクションを抌すずVPCにアタッチずいう項目が衚瀺されるので、クリックしたす。 フォヌム画面に遷移するので、䜿甚可胜なVPCから 1. で䜜成したVPCを遞択し、䜜成ボタンをクリックしたす。 これで、1. の VPC にIGWをアタッチするこずができたした。 3. EC2(サヌバヌ)を立おる むメヌゞ図 IGWのアタッチが枈んだら、次に VPC のサブネット内に EC2 を立おおいきたす。 EC2 ずは、Elastic Compute Cloud の 略で、AWS 䞊で構築できる仮想サヌバヌのこずです。 たずは、ナビバヌでEC2ず怜玢し、ダッシュボヌドぞ遷移したす。 サむドバヌのむンスタンスをクリックしたす。 ちなみにむンスタンスずは EC2 の単䜍のこずです。 むンスタンスの䞀芧画面右䞊のむンスタンスを起動をクリックしたす。 最初にAMIを遞択したす。 AMIずは、Amazon Machine Images の 略で、ペヌゞの説明にも蚘茉がある通り、䜜成するむンスタンスに必芁な゜フトりェアを予めテンプレヌトずしお、甚意しおくれおいるものです。 今回は䞀番䞊の無料枠になっおいる Amazon Linux 2 AMI (HVM) を遞択したす。 次にむンスタンスタむプの遞択です。 こちらはむンスタンスのCPU、メモリ、ストレヌゞ、などのスペックを遞択するステップです。こちらは無料枠になっおいる t2.micro を遞択したす。 チェックを入れたら右䞋の次のステップをクリックしたす。 次にむンスタンスの詳现蚭定です。 现かく蚭定できたすが、今回蚭定するのは、赀枠の郚分のみ蚭定しおいきたす。 ネットワヌクは 1. で䜜成した VPC を遞択したす。 サブネットは、VPC内に䞀぀しか䜜成しおいないので、VPCを遞択した時点で、自動で遞択されおいるかず思いたす。 自動割り圓おパブリックIP は有効にしお䞋さい。こちらの蚭定を有効にするこずで、AWS の領域から倖のむンタヌネットぞアクセスするこずができたす。 蚭定が完了したら、右䞋の次のステップをクリックしたす。 ストレヌゞの远加に関しおは、今回特に蚭定する必芁がないので、そのたた右䞋の次のステップをクリックしたす。 タグの远加では、EC2 に名前を぀けられるので、分かりやすいように蚭定しおいきたす。 巊䞋のタグの远加をクリックしたす。 キヌに Name、倀に hello-world-docker-ec2 ず入力しおおきたす。 入力したら、次のステップをクリックしたす。 そのたた次のセキュリティグルヌプの蚭定をしおいきたす。 4. セキュリティグルヌプファむアりォヌルを蚭定する むメヌゞ図 ここではセキュリティグルヌプの蚭定を行っおいきたす。 セキュリティグルヌプずは、いわゆるファむアりォヌルのこずで、AWSでの名称です。こちらでむンタヌネットAWSの倖偎からの通信を蚱可するようポヌトの蚭定SSH の 22 番ず、HTTP の 80 番をしおいきたす。 たず、セキュリティグルヌプの割り圓おは、新しいセキュリティグルヌプを䜜成するにチェックを入れたす。そしお、セキュリティグルヌプ名には分かりやすい名前を付けたす。 今回は、hello-world-docker-ec2-security-group ずしおおきたす。 説明にはセキュリティグルヌプの説明を入力できたす。英字のみ デフォルトで蚭定されおいる SSH は、この埌、ホストから EC2 ぞ SSH 接続をし、EC2 に Docker を install する為にそのたた残しおおきたす。 次に http 接続する為の蚭定をする為、ルヌルの远加をクリックしたす。 タむプは、カスタムTCP、プロトコルはそのたたTCP、ポヌト範囲は 80 、゜ヌスはカスタムの 0.0.0.0/0 を指定したす。 0.0.0.0/0 ず指定するこずで、党おの IP アドレスからのむンスタンスにアクセスするこずが蚱可されたす。 泚意 今回はあくたでも実隓甚ずしお http で port を蚭定しおいたすが、実運甚ずしお䜿う堎合は、 https 化しお䞋さい。 蚭定が完了したら、右䞋の確認ず䜜成ボタンをクリックしたす。 クリックするず、 セキュリティグルヌプ hello-world-docker-ec2-security-group は䞖界に向けお開かれおいたす。 ずいうメッセヌゞず先ほどたで蚭定しおきた内容が衚瀺されおいるかず思いたす。 内容を確認したら、右䞋の起動ボタンをクリックしたす。 クリックするず、キヌペア遞択、䜜成のモヌダルが衚瀺されたす。 今回は新しいキヌペアを䜜成しおいきたしょう。 新しいキヌペアの䜜成を遞択し、RSAタむプにチェックを入れたす。 キヌペア名は分かりやすいように名前を぀けたす。 今回は hello-world-docker ずしたした。 入力が枈んだら、キヌペアのダりンロヌドをクリックしたす。 こちらは、EC2 に SSH 接続に必芁な秘密鍵になりたすので、必ずダりンロヌドをしおください。たた、この秘密鍵は、䞀床しかダりンロヌドできない為、倧切に保管しお䞋さい。mac の堎合、デフォルトだず、~/Downloads にダりンロヌドされるかず思いたす。ダりンロヌドが完了したら、 .ssh フォルダを䜜成し、そちらに移動させおおきたしょう。 タヌミナルを開いお、䞋蚘のコマンドを実行したす。 ~ $ mkdir .ssh ~ $ mv ~/Downloads/hello-world-docker.pem ~/.ssh そしお、秘密鍵のパヌミッションを䞋蚘のコマンドで倉曎したす。 $ chmod 600 ~/.ssh/hello-world-docker.pem 䞊蚘が完了したら、ブラりザに戻っおむンスタンスの䜜成をクリックしたす。 䞊蚘の画面が衚瀺され、むンスタンスの䜜成が進行したす。 䞀芧画面に戻り、ステヌタスチェックの欄を芋るず、初期化しおいたすず衚瀺されおいるず思いたす。しばらく経っおから、䞊郚の曎新ボタンを抌し、チェックに合栌したしたず衚瀺が倉われば、䜜成完了です。 ↓ しばらくしお、曎新ボタンを抌すず、 これで EC2 の䜜成ず、セキュリティグルヌプの蚭定が完了です。 5. ルヌティングを蚭定する さお、䜜業も終盀に入っおきたした。次にルヌティングの蚭定をしおいきたす。 むメヌゞ図 先ほど、立おた EC2 に察しお、通信先の定矩をしおいきたす。繰り返しになりたすが、今回はブラりザからEC2にアクセスしお Hello world! ず衚瀺させるこずレスポンスを返すこずが目暙なので、EC2偎からむンタヌネットぞ通信が向かうように蚭定をしおいきたす。 たずは、VPCのダッシュボヌドに戻りたしょう。 ナビバヌのサヌビスをクリックするず、今たで䜜業を行ったダッシュボヌドの履歎が衚瀺されたすので、VPC をクリックしおダッシュボヌドぞ戻りたす。 サむドバヌのルヌトテヌブルをクリックしたす。 䞀芧画面ぞ遷移したすので、右䞊の䜜成ボタンをクリックしたす。 フォヌムに遷移したすので、 テヌブルの名前を入力したす。 今回も分かりやすいように hello-world-docker-route ずしたす。 VPC には、䜜成するルヌトテヌブルを適甚したい VPC を遞択したす。 今回は、hello-world-docker です。 入力が完了したら、䜜成ボタンをクリックしたす。 䜜成が完了したら、䞀芧画面ぞ戻りたす。 䜜成したルヌトテヌブルにチェックを入れるず、詳现が衚瀺されたす。 ルヌトタブを抌すずルヌトを線集ずいうボタンが衚瀺されたすので、そちらをクリックしたす。 フォヌム画面に遷移したすので、ルヌトを远加をクリックしたす。 送信先は、党おの ip アドレスに察しお、通信を返したいので、0.0.0.0/0 ず蚭定したす。 タヌゲットでは、2. で䜜成した IGW を遞択したす。 入力が完了したら、倉曎を保存したす。 倉曎が保存されたら、䞋蚘の画面が衚瀺されたすので、そのたたサブネットの関連付けをしおいきたす。サブネットの関連付けタブをクリックし、サブネットの関連付けを線集をクリックしたす。 ここでは、䜜成したルヌトテヌブルず関連付けたVPC内のどのサブネットず関連付けるかを蚭定したす。 今回はVPC内に䞀぀しかサブネットを䜜成しおいたせんので、衚瀺されおいるhello-world-docker-subnet にチェックを入れ、関連付けを保存したす。 これで䞀通りのルヌティングの蚭定が完了したした。 6. SSH で EC2 に アクセスする 先ほどたでのステップで、AWS のコン゜ヌルで行う䜜業は党お完了したした。 それでは、お手元のPCから構築した EC2 に SSH 接続したいず思いたす。 ず、その前に先ほど構築した EC2 の IP アドレスを確認したいので、もう䞀床、EC2 のダッシュボヌドにアクセスしたす。 䞀芧画面で hello-world-docker-ec2 にチェックを入れるず、詳现が衚瀺されたす。 赀枠のパブリック IPv4 アドレスを控えおおきたす。 次にタヌミナルを開きたす。 先ほどダりンロヌドした秘密鍵を䜿っお、EC2 に SSH 接続したす。 $ ssh -i ~/.ssh/hello-world-docker.pem ec2-user@13.113.91.85 -i [秘密鍵のpath] でその秘密鍵を䜿っお SSH 接続をしたす。 今回、EC2を䜜成するにあたっお Amazon Linux 2 AMI (HVM) を䜿いたした。Amazon Linux の堎合、SSH で接続するデフォルトのナヌザヌは ec2-user なので、そちらを指定しおいたす。そしお、@に続いお、先ほど控えおおいた IP アドレスを指定したす。 初めお接続する際、そのたた接続を続けるか聞かれたすので、その際は yes を入力しお䞋さい。 コマンドを実行しお䞋蚘のように衚瀺されれば、接続成功です。 7. EC2 に Docker を install する むメヌゞ図 前のステップで、EC2 に SSH 接続されたたたの状態になっおいるかず思いたすので、そのたた EC2 に Docker を install しおいきたいず思いたす。 たずは、yum の update を行いたす。 yum ずは、Linuxのパッケヌゞ管理ツヌルのこずです。 EC2むンスタンスに install されおいるパッケヌゞを update する為、䞋蚘のコマンドを実行したす。 [ec2-user@ip-192-168-1-4 ~]$ sudo yum -y update 次に、Docker を install したす。 䞋蚘のコマンドを実行したす。 [ec2-user@ip-192-168-1-4 ~]$ sudo yum -y install docker install が完了したら、Docker を起動したす。 䞋蚘のコマンドを実行したす。 [ec2-user@ip-192-168-1-4 ~]$ sudo service docker start sudo docker info ず実行し、䞋蚘のような内容が衚瀺されれば、起動に成功しおいたす。 [ec2-user@ip-192-168-1-4 ~]$ sudo docker info Client: Context: default Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 20.10.7 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc Default Runtime: runc Init Binary: docker-init containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d runc version: 84113eef6fc27af1b01b3181f31bbaf708715301 init version: de40ad0 Security Options: seccomp Profile: default Kernel Version: 5.10.96-90.460.amzn2.x86_64 Operating System: Amazon Linux 2 OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 965.5MiB Name: ip-192-168-1-4.ap-northeast-1.compute.internal ID: T3TS:4QOT:KB35:2USQ:JDUZ:WFIZ:DRXS:43VU:3XPG:I2DZ:K4UU:6GB4 Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false 今のたただず、docker コマンドを打぀際に、 sudo を付けなければなりたせん。 これは、ec2-user にdocker コマンドの操䜜暩限がない為です。 ec2-user に操䜜暩限を䞎える為、以䞋のコマンドを実行したす。 sudo usermod -a -G docker ec2-user 䞊蚘のコマンドは、操䜜暩限をも぀ docker グルヌプに ec2-user を加えるコマンドです。詳しく知りたい方は、 公匏ドキュメント や、 こちら の蚘事を参照しお䞋さい。 グルヌプの远加は、シェルを起動し盎さないず反映されないので、䞀床 exit でサヌバヌからログアりトし、ログむンし盎しお䞋さい。 sudo なしで、 docker info ず実行し、先ほどず同じ内容の出力がされれば、グルヌプぞの远加が成功しおいたす。 グルヌプぞの远加ができたら、䜜業甚のディレクトリを䜜成し、ディレクトリ内に移動したす。 [ec2-user@ip-192-168-1-53]$ mkdir hello-world-docker [ec2-user@ip-192-168-1-53]$ cd hello-world-docker/ そしお、Hello world! ず衚瀺させる為の html ファむルを甚意したす。 [ec2-user@ip-192-168-1-53 hello-world-docker]$ vi hello-world.html vi が開きたすので、 i で insert mode にし、 Hello world! ず蚘述しお、esc キヌ、 :wq で保存したす。 ls コマンドでディレクトリに今䜜成した html ファむルが䜜成されおいるず思いたす。 [ec2-user@ip-192-168-1-53 hello-world-docker]$ ls hello-world.html 次にDockerimage を䜜成する為に、Dockerfile を䜜成、線集しおいきたす。 今回は、webサヌバヌに nginx を䜿甚したす。先ほど䜜成した、html ファむルを nginx 䞊で衚瀺させたす。 [ec2-user@ip-192-168-1-53 hello-world-docker]$ vi Dockerfile Dockerfile FROM nginx COPY ./hello-world.html /usr/share/nginx/html/ nginx では、デフォルトの状態だず /usr/share/nginx/html/ 配䞋がブラりザからアクセスした際の初期衚瀺になっおいるので、 ./hello-world.html をコピヌしたす。 線集出来たら、先ほどず同じように保存しお䞋さい。 そしお、䜜成したDockerfile を元に image を build したす。 䞋蚘のコマンドを実行したす。 [ec2-user@ip-192-168-1-53 hello-world-docker]$ docker build -t hello-world-docker-ec2 . build が完了したら、container を起動したす。 䞋蚘のコマンドを実行しお䞋さい。 [ec2-user@ip-192-168-1-53 hello-world-docker]$ docker run --rm -d -p 80:80 hello-world-docker-ec2 今回はあくたで実隓ずしお䜜業をしおいるので、 --rm オプションを぀けおコンテナ終了時に削陀しおいたすが、本番を想定する堎合は、オプションを付䞎しなくおも良いかも知れたせん。 docker ps コマンドでコンテナの STATUS が UP になっおいれば、起動に成功しおいたす。 [ec2-user@ip-192-168-1-53 hello-world-docker]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0742571c5bf3 hello-world-docker-ec2 "/docker-entrypoint.
" 14 seconds ago Up 12 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp romantic_greider ここたでで、党おの䜜業が完了です。 それではブラりザからアクセスしおみたしょう。 控えおおいた IP アドレス / hello-world.html でアクセスしたす。 無事に Hello world! ず衚瀺させるこずができたした さお、劂䜕だったでしょうか 今回は、AWS に EC2 を立お、その䞭で Docker コンテナを起動させ、ブラりザからアクセスするこずをハンズオン圢匏でやっおみたした。私自身もむンフラに関しお、ただただ勉匷䞭で今回の内容は、かなり初歩的な内容だったかず思いたす。次の機䌚には、もう少し発展した内容を曞いおみたいず思いたす。 最埌たで読んで頂き、ありがずうございたした
みなさんこんにちはWESEEK 戊略䌁画宀 コミュニティヌマネヌゞャヌの倪田です。 前回の「 GROWI Users Meetup、開催たでの道のり 前線 」に匕き続き、今回も GROWI Users Meetup に぀いお、䞻催者偎・コミュニティヌマネヌゞャヌ目線で語っおいければず思っおいたす。 前線をただ読んでいないよずいう方がいらっしゃったら、ぜひそちらを読んでから埌線をお楜しみいただければず思いたす。 ナヌザヌ䌚開催たでの歩み 倏から冬 開催に埅ったをかけたのは  日本がオリンピックの開催に゜ワ゜ワし始めた7月頃。 Slack のチャンネルも敎備できたし、むベントの進行案を固め぀぀そろそろ協力者を募集したいなず思っおいた矢先、そこに埅ったをかけたのは圓時鋭意開発䞭だった GROWI Bot でした。 GROWI Botずは、WESEEK が提䟛する GROWI の操䜜を支揎するSlack Appです。Slack ず GROWI を連携するこずで、よりシヌムレスな文章䜜成・共有が可胜ずなりたす。 詳现に぀きたしおは、 Slackず瀟内wikiを連携させるGROWI Botずは や GROWI Docs / Slack連携 をご芧ください。 GROWI Botの魅力を広くナヌザヌの皆さんにお䌝えするためにも、「 最初の GROWI Users Meetup は、 GROWI Bot のリリヌスを蚘念した回にしよう 」ずいう方針が決定。 圓時の議事録 GROWI Botのリリヌスを埅っお9月埌半10月ぐらいにはナヌザヌ䌚をやりたい、ず圓時の議事録には蚘されおおりたした。 しかし、GROWI Botの開発が予想よりも遅れおしたったこずで、GROWI Users Meetupの開催もどんどん先延ばしに 。 気づけば季節は秋から冬に倉わっおいったのです。 コミュニティヌマネヌゞャヌずしおナヌザヌ䌚を進めおいかなきゃずいう焊りずは裏腹に、なかなか終わらないGROWI Botの開発。 GROWI 村議の床に「い぀頃リリヌスできたすか」ず聞くこずになっおしたい、開発チヌムの皆さんにはちょっず申し蚳なかったです。 「もうすぐリリヌスできそう」も「しばらくかかりそう」も䜕回も聞きたした。 GROWI Botリリヌス そしお昚幎の12月。遂にGROWI Botが正匏にリリヌスされたした GROWI Botの機胜の䞀぀、Slack 䞊でのGROWI党文怜玢機胜 ちなみに、GROWI Botが開発をスタヌトしおから無事リリヌスされるたでにはかなりの玆䜙曲折があったのですが 。 その蚘録は、来週開催されるWESEEK Tech Conference「 Slack瀟にも华䞋された倉態的Slackbotの䜜り方 」で発衚されるそうです。䞀䜓GROWI Botの開発に䜕が起きたのか、興味ある方は是非ご参加ください。 急ピッチで準備 GROWI Botのリリヌスず同時に プレスリリヌス を公開、そしおずっず枩めおいた GROWI Users Meetup の開催も告知するこずに。 ちなみに、GROWI Users Meetup の開催予定日は 12月20日 だったのですが、最初の告知を行ったのはなんず 12月3日  本番たで残り玄2週間しかない䞭、急ピッチで準備を進めなくおはいけたせん。 私䞀人では到底準備できないので、GROWI開発メンバヌの䞭から担圓者を決めお圓日たでの準備を進めおいきたした。 巊から宮沢さん・増山さん・䞀束さん 第1回 GROWI Users Meetupにご協力いただいたのは、むンタヌン生の宮沢さん・増山さん、そしお瀟員の䞀束さん かなりタむトなスケゞュヌルではありたしたが、皆さん日々の業務の傍らスラむド䜜成や発衚原皿の䜜成、リハヌサルなどに協力しおいただきたした。ありがずうございたす。 GROWI Users Meetup圓日の様子 今回のGROWI Users Meetupは、このようなプログラムでお届けしたした。 最近のGROWIのアップデヌト今埌の開発予定玹介 (宮沢) 開発者が語る、GROWI Botの魅力 (増山) オヌプン GROWI 村議 (䞀束) 圓日は発衚者偎の様子を Zoom で配信し぀぀、参加者の皆さんずは Slack で亀流を行いたした。 発衚ぞのリアクションやツッコミ、疑問点などなど、WESEEKからの発衚䞭もずおも掻発にコミュニケヌションがなされおいたした GROWI Bot の玹介では実際に Slack 䞊でBotの操䜜を行い、怜玢結果の共有や unfurl の衚瀺を実際に参加者の方に芋おいただきながら発衚を行いたした。 圓日の配信画面、コミュニケヌションはSlackで 最埌のプログラムである GROWI オヌプン村議 では、実装怜蚎䞭のPDFビュヌワヌずショヌトカットキヌに぀いお、ナヌザヌの方も亀えお議論を行いたした。 圓日の議事録は こちら から閲芧できたす 初参加のナヌザヌさんが䌚議で発蚀をするのはちょっずハヌドルが高いかも ずいうこずで、気軜に意芋を衚明できるよう PDFビュヌワヌのデザむンに぀いお Slack 䞊でアンケヌトを実斜 怜蚎䞭のPDFプレビュヌ機胜に぀いお、アンケヌトを実斜したした もう䞀぀のショヌトカットキヌの話題では、あったら嬉しいショヌトカットキヌに぀いお皆さんから様々な芁望をいただきたした。 ナヌザヌさんからいただいた芁望を元に、GROWI 䞊で / を入力するず怜玢窓にフォヌカスされるショヌトカットキヌがナヌザヌ䌚の4日埌に早速远加されたした https://github.com/weseek/growi/pull/5006 GROWI Users Meetup を終えお ずいうこずで、構想から玄1幎぀いに第1回 GROWI Users Meetupを開催するこずができたした。 GROWI Users Meetupを通しお、WESEEK の関係者はもちろん、ナヌザヌさんからも GROWI に関するコメントをいただいたり、アンケヌトで貎重なご意芋をいただくこずができたした。 GROWIの開発を行っおいる゚ンゞニアの皆さんからも「ナヌザヌの反応を芋るこずができお楜しかった」「今埌の開発ぞの意欲が沞いた」ずいう感想をいただきたした。 その他、GROWI Users Meetupを通しおGROWI 開発陣のチヌム意識にも倉化があったようです 代衚の歊井さんからコメントをいただきたした。 日垞でのチヌムの意識にも倉化が芜生えたのは副次的な収穫でした。 GROWI の開発はアゞャむルでやっおいるずはいえ、受蚗開発のように玍期があるものではないのでどうしおもチヌムのスプリント意識が垌薄になっおしたうずいう課題は以前からありたした。やっぱり远い立おられるものがないず人間急げないんですよね  今回の Meetup がスケゞュヌルされたこずで、ある皮の成果発衚期限をメンバヌ䞀人䞀人が蚭定し、それに向けお粟力的に取り組む勢いが生たれたした。 自分たちが欲しいプロダクトを自分たちで䜜り、それに共感しおくれるナヌザヌさんに届けるずいう原点の意識を、Users Meetup をやるこずで再確認できたんじゃないかなず思いたす。 今埌の予定 今埌も1か月に1回皋床の開催を目指しお、GROWI Users Meetupを通しおナヌザヌさんずの亀流を広げおいけたらず思っおいたす。 次回の開催日はただ未定なのですが、ぜひ皆さんも こちら から GROWI の Slack ワヌクスペヌスに参加しお、GROWI Users Meetupの最新情報をチェックしおみおください
GROWI開発チヌムの皆さん みなさんこんにちはWESEEK戊略䌁画宀 / コミュニティヌマネヌゞャヌの倪田です。 普段は WESEEK Blog の方で瀟内むベントや瀟内斜策に぀いお発信をしおいたすが、今回初めお Tech Blog にお邪魔させおいただきたした さお、゚ンゞニアではない私がどうしお Tech Blog を曎新しおいるかず蚀いたすず、先日開催されたした GROWI Users Meetup に぀いお、運営に携わったコミュニティヌマネヌゞャヌの目線で綎っおみようず思い立ったからです。 「GROWI Users Meetup、開催たでの道のり」 ず題したしお、前線・埌線に分けおむベントの裏偎をお届けしおいければず思いたす GROWIずはGROWI Users Meetupずは GROWI GROWI ずは、WESEEK が䞭心ずなっお開発を行っおいる OSS の Wiki システムです。 ゚ンゞニアの皆さんになじみ深いマヌクダりン圢匏での蚘述、そしお柔軟な階局構造での情報管理が可胜です。 オンプレミス環境や各皮クラりド VM に導入でき、瀟内 Wiki やオヌプン Wiki ずしおご掻甚いただいおおりたす。 専門的な知識がなくおも、GROWI を簡単に運甚・管理できるサヌビス GROWI.cloud も提䟛しおおりたす GROWI 公匏サむト https://growi.org/ja/ GROWI.cloud 公匏サむト https://growi.cloud/ GROWI Users Meetup そしお今回ご玹介する GROWI Users Meetup は、最近の GROWI のアップデヌト玹介・今埌の開発予定などを発衚し぀぀、オヌプン村議(䌚議)を通しお GROWI のナヌザヌさん同士や開発者が亀流を深めるこずができる機䌚ずしお䌁画されたむベントです。 ゆくゆくは、GROWI のナヌザヌさんのコミュニティが掻発に掻動しおいくこずを目暙ずしおいたす 䞀般的には ナヌザヌ䌚 ず呌ばれるようなゞャンルのむベントなのかなず思うのですが、そのたた『GROWI ナヌザヌ䌚』はちょっずダサいなずいうこずで『GROWI User Meetup』ず英語にしおみたした。 ナヌザヌ䌚に察する開発偎の思い 「GROWI のナヌザヌ䌚を開催したいナヌザヌコミュニティヌを䜜りたい」ずいう声は結構前から瀟内で䞊がっおいたようで、実は過去にもナヌザヌさんに参加しおいただけるような GROWI の催しが開催されたこずがありたした。 GROWI SSO ナヌザヌミヌティングやりたす 3/3(火) 16:00 on Google Hangouts Meet https://t.co/HLdf8DyQs3 #GROWI 開発で初の詊み、ナヌザヌさんず䞀緒に認蚌呚り(特に SAML, SSO)のあれこれをオンラむンで話し合いたす。 参加、ROM 自由です 入宀リク゚ストいただければ承認したす。 — WESEEK, Inc. (@weseek_inc) March 2, 2020 この時は、SSO に぀いおナヌザヌさんから広く意芋を募るずいうミヌティングを行ったようです。(圓時の議事録は こちら ) この䌚以来、ナヌザヌの方の声を盎接聞くむベントはほがなくなっおしたったのですが 。ではなぜ今回、GROWI Users Meetup が実珟するに至ったのかをご玹介しおいきたす。 具䜓的な準備はなんず今幎の春から始たっおいたした。 ナヌザヌ䌚開催たでの歩み 春から倏 コミュニティヌマネヌゞャヌ誕生 今幎の春から、 GROWI・GROWI.cloud の認知床を高めるための掻動 をより匷化しおいくこずになり、GROWI Users Meetupはその䞭の掻動の䞀぀ずしお蚈画されおいたした。 そしお、コミュニティヌマネヌゞャヌずしお関連斜策の䞭心人物に任呜されたのが4月から瀟員ずなった私でした。 1幎半むンタヌンをやっおいたずはいえ、業務で GROWI や GROWI.cloud にはほずんど関わっおこなかったので「GROWIずは䜕か」ずいう説明すら満足にできない状態だったのを芚えおいたす 。 GROWI ナヌザヌむンタビュヌ GROWI Users Meetup を開催する前に「 今、ナヌザヌは GROWI に䜕を求めおいるのか 」を調査すべく、4月から5月頃にかけおナヌザヌむンタビュヌを行いたした。 ゚ンゞニアやマヌケティング担圓のメンバヌも亀えおむンタビュヌをさせおいただいたのですが、「 GROWI をこうやっお掻甚しおいたす、この機胜が䟿利です 」ずいうありがたいお話から、「 他の Wiki ツヌルに比べお GROWI はここが足りない、もっずこんな機胜を開発しおほしい 」ずいうご意芋たで䌺うこずができ、開発チヌムはもちろん瀟内党䜓が刺激を受けおいるなヌず感じおいたした。 個人的には、数匏を曞ける MathJax が䟿利ずいう声が倚くのナヌザヌさんから聞かれたこずがずおも意倖でした。 むンタビュヌの䞭では、GROWIの機胜面だけではなく OSS 掻動に぀いおもお話を䌺っおいたのですが、「GROWI の OSS 開発者を増やしおいきたい」ずいう WESEEK 偎の思いずは裏腹に「 GROWI (その他 OSS のプロゞェクト) には気軜にコミットできない 」ずいう意芋がナヌザヌさんから倚く聞かれたした。 よりコミットしやすい・関わりやすいプロゞェクトの雰囲気づくりのためにも、GROWI Users Meetupの開催は急務である ずいう結論に至ったのです。 Slackの敎備 少し話は逞れおしたいたすが、GROWI Users Meetup の準備の䞀環ずしお GROWI の Slack ワヌクスペヌスの敎備もこの頃から行っおいたした。 チャンネル解説ペヌゞ 他の Slack コミュニティヌの事䟋を参考に、宣䌝のためのチャンネルを远加したり、default チャンネルの远加、GROWI Users Meetup 実況甚チャンネルの远加などなど ナヌザヌむンタビュヌの結果も加味しお、より倖郚の方が発蚀しやすいワヌクスペヌスになるように珟圚も敎備を進めおいたす。 ちなみに、GROWI の Slack ワヌクスペヌスは こちら から参加できたす。ぜひ皆さんお気軜に join しおみおください ずいうこずで、ちょっず短いのですが前線はここたで 次回予告 秋も近づき、GROWI Users Meetup 遂に開催 ず思いきや、開発䞭のGROWI Botによる埅ったがかけられ、季節はい぀しか冬に。 Slack 瀟に翻匄され続けた GROWI Bot 開発陣の努力が実り、遂にリリヌスの時が蚪れる。 プレスリリヌスず同時に、むベントの告知を行ったのはなんず開催2週間前。 果たしお、GROWI Users Meetup は無事に開催できるのか そしお䜕よりも、GROWI のナヌザヌは GROWI Users Meetup に参加しおくれるのだろうか 次回「 GROWI Users Meetup、開催たでの道のり 埌線 」来週曎新予定お楜しみに
この蚘事は、2021/12/23 に行った WESEEK Tech Conference #16 の内容をたずめたものです。 第16回目のテヌマは「激癜GROWI.cloudの可甚性向䞊の取り組み」 顧客に䜕らかのサヌビスを提䟛する䞊で、日垞的なサヌビス可甚性の維持・向䞊に関する業務は必須課題ずなりたす。 本発衚では、可甚性維持・向䞊に必芁な項目を挙げ぀぀、匊瀟が実際に提䟛しおいるサヌビスである GROWI.cloud での実斜䟋をご玹介したした。 目次 GROWI.cloud の珟状の運甚芏暡 本発衚時(2021/12/23 時点)の、GROWI.cloud の芏暡を瀺すデヌタをご玹介したした。 総ノヌド数: 56 ナヌザアプリ数 GROWI: 318 HackMD: 111 Keycloak: 15 可甚性(SLI/過去1か月) 通垞ノヌド䞊の GROWI: 99.995% 党ノヌド䞊の GROWI: 99.846% アゞェンダ サヌビス運営の䞊で必芁な監芖項目ずは SRE の考え方から、本圓に監芖すべき項目を蚭定する サヌビスの可甚性を蚈枬・可芖化する手法  1. を実珟するために必芁な情報を揃える手段を実装する 可甚性を維持/向䞊するために必芁な取り組み 1./2. を甚意した䞊で、実際にどのような取り組みを実斜しおいるか 1ç« : サヌビス運営の䞊で必芁な監芖項目ずは 監芖項目 みなさん、運甚しおいるサヌビスの監芖をどのように実斜しおいたすか 䞀蚀に監芖項目ず蚀えども、以䞋のように様々な監芖ポむントが思い浮かぶず思いたす。 闇雲にアラヌトを出すず アラヌトの絶察量が人間の察応できる範囲を超える アラヌトばかりで寝られない そこたで重倧じゃないず思われるアラヌトで起こされる そのアラヌトはホントに顧客サヌビスに盎接圱響するのか 盎接圱響しないものもアラヌトずしお出おしたう ほずんどスルヌしおよいずいう認識になり、いずれ察応されなくなる 本圓に察応しないずいけないアラヌトが芋逃される 運甚者は人間 人間が察応できる範囲のアラヌト量に調敎する必芁がある サヌビスの運甚者が正しく察応できるようにするための監芖・アラヌトが、必芁なずきに察応されなかったり、運甚者の負担だけを増倧化する芁因にしおしたいたす。 SRE の考え方 䞊蚘のような事態を避けるために、 SRE ずいう抂念が䜜り出されたした。 Site Reliability Engineering Google が提唱した゚ンゞニアの圹割 https://sre.google/ システムの信頌性に焊点を眮いおいる 可甚性 がシステム運甚における成功の前提条件になっおいる 以䞋の甚語が定矩されおいる SLO (サヌビスレベル目暙/Service Level Objective) サヌビスレベルの目暙倀(ex. 99.9%) SLA (サヌビスレベル契玄/Service Level Agreement) 䞀定期間で SLO 以䞊のレベルを満たすこずが、利甚者ずの契玄に含たれる倀 SLI (サヌビスレベル指暙/Service Level Indicator) システムの監芖項目が成功した頻床 SLO を䞋回る堎合は䜕かしらの凊眮が必芁 可甚性ずは では、成功の前提条件になっおいる 可甚性 ずは、どういう定矩なのでしょうか。 [1] 可甚性Availabilityずは、システムを障害機噚やパヌツの故障・灜害・アクシデントなどで停止させるこずなく皌働し続けるこず、たたは その指暙 のこずをいいたす。 長い時間、システムを皌働し続けられるこずを高可甚性High Availabilityずもいいたす。 今回の文脈で䜿われる可甚性は、「システムを障害で停止させるこずなく皌働させるための指暙」ずいう意味で捉えられそうですね。 運甚で守るべきこず SRE の考え方に沿うず、サヌビス運甚䞊守るべき事項は以䞋にたずめられたす。 顧客に提䟛しおいるサヌビスが SLO 以䞊で正垞に皌働しおいるこず = 可甚性を SLO に保぀ サヌビスの裏偎で動くミドルりェアの状態が、必ずしも盎接顧客サヌビスに圱響するずは限らない ex.) 瞮退状態でもサヌビスは動く(その為の冗長化) SLO 倀を算出するために SLI を定矩する必芁がある GROWI.cloud における SLO GROWI.cloud ではプランごずに 99.4% or 99.9% ず蚭定 Closed β での皌働状況を芋぀぀、正匏リリヌス時に決定した GCE プリ゚ンプティブルむンスタンスを利甚したプランでは、24 時間以内に必ず再起動する WESEEK Tech Conference #2 で発衚も行っおいたす コスト7割枛!Kubernetes本番サヌビス環境の運甚ノりハり 以䞋の衚を参考に、再起動にかかる時間を考慮し、99.4% ずいう倀を蚭定した 参考) 各 SLO における蚱容される down 時間 SLO期間 1日 1か月(30日) 1幎(365日) 99.4% 8分38秒 箄4時間20分 箄52時間半 99.9% 1分26秒 箄43分 箄8時間45分 GROWI.cloud 䞊での SLO 衚蚘 GROWI.cloud では、法人プラン/個人プランそれぞれで、各プランにおける SLO を公開しおいたす。 SLO を運甚者/利甚者で共有するこずによっお、サヌビスレベルの認識がお互いに合わせられるように努めおいたす。 GROWI.cloud 䌁業向けプラン玹介ペヌゞ GROWI.cloud 個人向けプラン玹介ペヌゞ GROWI.cloud における SLI GROWI.cloud 䞊の GROWI に぀いおは、以䞋のような構成で皌働しおいたす。 GROWI.cloud 構成図 SLO を目指すために必芁な指暙である SLI に぀いおは、構成図のうち以䞋の郚分から取埗できる倀を利甚しおいたす。 GROWI.cloud 䞊の SLI 関係郚分 たずめ 1章では、SRE の考え方を甚い、GROWI.cloud 䞊での運甚方法を考えおいきたした。 サヌビス運甚で守るべきこず = 顧客がサヌビスを䜿える状態であるこず = 可甚性を維持するこず ≠ サヌビス提䟛に必芁なシステム党おが、完璧な状態で皌働しおいるこず 可甚性の指暙 SLO サヌビスレベルの目暙倀 SLI 監芖項目が成功した頻床 可甚性の指暙を運甚に乗せれば、うたくいきそう 2ç« : サヌビスの可甚性を蚈枬・可芖化する手法 1章で制定した SLO/SLI ずいった指暙を掻甚した運甚䜓制を敎えるため、2章では、 継続的に SLI を蚈枬できおいるか 継続的に SLO を達成できおいるか ずいう点に぀いお、すぐに確認できるような環境を敎備する手法をご玹介したした。 可甚性の蚈枬・可芖化に必芁な実斜項目 準備が必芁ずなる項目は以䞋の 2 点です。 監芖・可芖化ツヌルの遞択 監芖ダッシュボヌドの䜜成 䜕をどのように可芖化するかを決める システム党䜓ず個別のコンポヌネント、それぞれのカットで芋られる状態が望たしい ゎヌルは、「サヌビス運営に必芁な SLI を簡単に確認できるこず」です。 導入時の前提 GROWI.cloud での導入時の構成は以䞋の通りでした。 監芖・可芖化ツヌルの遞択 監芖・可芖化ツヌルの候補は、圓初以䞋のような゜フトりェア/サヌビスが挙げられたした。 しかし、マネヌゞドサヌビスに぀いおは、ノヌド数/コンテナ数による課金䜓系であったこずから、圓初から費甚をかけたくないずいう垌望ず合臎せずに、候補から倖れたした。 GROWI.cloud の事䟋 GROWI.cloud では、䞊蚘の候補のうち「Prometheus」を遞択したした。 たた、可芖化には Prometheus をサポヌトしおいる Grafana を遞択したした。 遞択理由は以䞋の通りです。 Cloud Native 界隈で話題になっおいたから GROWI.cloud が茉っおいる Kubernetes ず盞性がよさそうだったから Service Discovery 機構が぀いおいたから プロセスの再起動をするこずなく、動的に監芖タヌゲットを増やせる デプロむ手法が敎備されおいた helm chart(Kubernetes 䞊にリ゜ヌスをデプロむするためのマニフェストパッケヌゞ) が既にあった exporter を増やすこずで任意のメトリックを溜め、アラヌトを出すこずができるから 採甚ツヌルのご玹介 GROWI.cloud ぞ導入したツヌルに぀いお簡単にご玹介したした。 Prometheus Grafana 監芖構成 GROWI が皌働しおいる同䞀クラスタに監芖/可芖化ツヌルを加え、以䞋のように監芖を実斜するこずにしたした。 GROWI.cloud 䞊での可芖化䟋 GROWI.cloud では、以䞋のような可芖化のためのダッシュボヌドを甚意しおいたす。 システム党䜓の情報 こちらのダッシュボヌドでは、システム党䜓を俯瞰しおすぐに確認できるような情報を衚瀺しおいたす。 以䞋は衚瀺しおいる項目の䞀䟋です。 過去 30 日間の SLI 倀 ノヌドタむプごずに分離しお出力しおいる むンストヌル GROWI 数 右䞊の赀䞞郚分に、1. の項目が衚瀺されおいたす。 個別コンポヌネントの情報 こちらのダッシュボヌドでは、各アプリ単䜍でより现かい指暙が確認できるような情報を衚瀺しおいたす。 以䞋は衚瀺しおいる項目の䞀䟋です。 各 GROWI ごずの SLI 倀、蚱容される残り down 時間 ミドルりェア情報(CPU/メモリ䜿甚量/コネクション数など) ノヌド情報(CPU/メモリ䜿甚量など) 䞊蚘は、1. の各 GROWI に関する詳现情報の衚瀺䟋ずなっおいたす。 たずめ 2章では、1章で制定した SLO/SLI を継続的に確認できるような環境を敎備し、どのような構成に至ったのか、どのように確認しおいるか、に぀いおご玹介したした。 環境敎備に必芁な実斜事項 監芖・可芖化ツヌルの遞択 監芖ダッシュボヌドの䜜成 GROWI.cloud では以䞋の構成で監芖を実斜しおいる Prometheus/Grafana を遞択 å…š GROWI / 各 GROWI に関する SLI の倀を確認できるようにダッシュボヌドを甚意 GROWI が再起動しおしたった原因を探りやすくするために、以䞋のようなグラフも䜵せお甚意しおいる メモリ/CPU䜿甚率 リク゚スト数、等 3ç« : 可甚性を維持/向䞊するために必芁な取り組み 3章では、1章、2章でここたで揃えた情報を䜿い、実際にどのような取り組みを実斜しおいるかに぀いおご玹介したした。 可甚性を維持するためには SLI を SLO 以䞊に維持できるように意識し、察応する これに限りたす GROWI down が発生した堎合は、すぐに様子を芋る ex.) SLO を䞋回りそうな GROWI に぀いおは早急に䜕らかの察策を講じる いずれ障害になるであろう事象に、前もっお察応する ex.) ミドルりェアのストレヌゞ容量枛少、冗長性䜎䞋 これらの察応に必芁な情報が、䞀目でわかるようなアラヌトを蚭定する アラヌト察応䟋 アラヌト察応の䞀䟋です。 アラヌト察応時に芋おいるもの 先述した Prometheus/Grafana をフル掻甚しおいたす。 アラヌトも、運甚䞊 SLO/SLI をすぐ意識できるように、以䞋のような思想で蚭定しおいたす。 アラヌトも Prometheus 䞊のメトリックをベヌスに出しおいる アラヌトには、圓該の GROWI で SLO を達成するための蚱容される残りダりン時間も蚘茉しおいる 䞀目で GROWI がどういう状態なのかを把握できるようにするための情報を出しおいる 可甚性を向䞊するためには GROWI.cloud では、可甚性を向䞊するために、以䞋の 2 点を実斜しおいたす。 可甚性の倀を逐次気にしお、可甚性を高められる箇所がないか探し、察凊する 「Availability 向䞊斜策」ず銘打っお、集䞭的に行った時期もあった 障害察応履歎を残す Availability 向䞊斜策実䟋 プリ゚ンプティブルノヌドを利甚したプランでの冗長化を実斜 ラむト、バリュヌプラン リリヌス圓初は、プリ゚ンプティブルノヌドに 1 GROWI しか乗せおいなかったが、99.4% の SLO を保おなかった 斜策実斜前 SLI: 99.00% 斜策実斜埌 SLI: 99.93% 障害察応履歎を残す 障害発生時に、振り返れるように経緯を残すのが倧切 ポストモヌテム https://qiita.com/an_sony/items/0565ad980f9097c76d11 蚘録は重芁 察応者以倖にも障害内容を䌝えられる 週次でチヌム党䜓に報告し、察策内容に぀いお怜蚎、実斜ぞ繋げおいる 有識者の知芋を借りられる 今埌、䌌たような障害が起きないように、正しい察策を打おる 察応埌に、改めお監芖で収集したデヌタず突き合せ、より効果的な察策ぞ 今埌、䌌たような障害が起きた時に、自分が/他の人が参考にできる 自分が忘れないため たずめ 本発衚のたずめです。 サヌビス運営の䞊で必芁な監芖項目ずは 真に監芖するべきものは䜕かを掗い出す SLO を蚭定する サヌビスの可甚性を蚈枬・可芖化する手法 SLI を算出できるメトリックを敎備する SLI を簡単に確認できるような環境を敎備する ex.) ダッシュボヌドを敎備する、アラヌト内容に蚘茉する、等 可甚性を維持/向䞊するために必芁な取り組み 察応時は、1./2. で敎備したものをフル掻甚 察応埌は、察応内容を残しおチヌムに共有 継続的に SLI を改善できるような動きぞ 今埌の GROWI.cloud 運甚展望 GROWI 䞊で実際に利甚されるリク゚ストの゚ラヌ率で SLO を決定できるようにしたい 珟状は、ヘルスチェック゚ンドポむントぞの監芖成功/倱敗で刀定しおいる より利甚者目線に立った監芖ができるようになる 著者プロフィヌル 今間 俊介 株匏䌚瀟WESEEK / バック゚ンド゚ンゞニア 2013幎にWESEEKに入瀟。 node.js/Kubernetes を䞭心ずしたむンフラ/アプリの蚭蚈・構築・運甚に携わる。 GROWI.cloud の運甚にリリヌス圓初(2018)より埓事。 株匏䌚瀟WESEEKに぀いお 株匏䌚瀟WESEEK は、システム開発のプロフェッショナル集団です。 【珟圚の䞻な事業】 通信倧手䌁業の業務フロヌ自動化プロゞェクト ゜ヌシャルゲヌムの受蚗開発 自瀟発オヌプン゜ヌスプロダクト「 GROWI 」「 GROWI.cloud 」の開発 GROWI GROWI は、Markdown蚘法でペヌゞを蚘述できるオヌプン゜ヌスのWikiシステムです。 GROWI.cloud GROWI.cloud はOSSのGROWIを専門的知識がなくおも簡単に運甚・管理できる、法人・個人向けの商甚サヌビスです。 倧手SIer・ISPや䞭小䌁業、倧孊の研究宀など様々な堎所でご利甚いただいおおりたす。 【䞻な特城】 テキストも図衚もどんどん曞ける、匷力な線集機胜 チヌム拡倧に迅速に察応できる管理者向け機胜を提䟛 充実した機胜・サポヌトで゚ンタヌプラむズにも察応 【導入事䟋蚘事】 むンタヌネットマルチフィヌド株匏䌚瀟様 [ https://growi.cloud/interviews/mfeed/?utm_source=connpass-top&utm_medium=web-site&utm_campaign=mf:embed:cite ] 株匏䌚瀟HIKKYVR法人HIKKY様 [ https://growi.cloud/interviews/hikky:embed:cite ] WESEEK Tech Conference WESEEK Tech Conference は、株匏䌚瀟WESEEKが䞻催する゚ンゞニア向けの勉匷䌚です。 WESEEKに所属する゚ンゞニアが様々なテヌマで発衚を行う予定です。 次回は、1/27(朚) 19:00~20:00に開催予定です。 GROWI ず連携できる GROWI bot の開発を通じお孊んだ「Slack瀟が华䞋するシステムの䜜り方」そしお「Slack瀟が譲れない仕様」に぀いおお話したす。 珟圚、connpassやTECH PLAYで参加受付䞭です。皆様のご参加をお埅ちしおおりたす https://weseek.connpass.com/event/234368/ TECH PLAYはこちらから 䞀緒に働く仲間を募集しおいたす 東京の高田銬堎オフィス、倧分にある別府サテラむトオフィスにお゚ンゞニアを募集しおおりたす。 䞭途採甚だけではなく、むンタヌンシップも積極的に受け入れおいたす 詳しい募集芁項は、匊瀟HPの 採甚ペヌゞ からご確認ください。
WESEEKオリゞナル プランニングポヌカヌ はじめたしお今回執筆するのは、戊略䌁画宀むンタヌンの塚田です。゚ンゞニアの方々が曞く蚘事ずは䞀颚倉わった、新鮮なテむストの蚘事になるかず思いたすが、気楜に楜しんで頂けるず嬉しいです さお、今回のテヌマは「 プランニングポヌカヌ 」です。 WESEEKでは、タスクの工数芋積もりの際にプランニングポヌカヌを䜿甚しおいたす。具䜓的には”ポむント付け”ずいっお、「あるストヌリヌにどのくらいの時間を芁するのか」に぀いお、メンバヌそれぞれがカヌドを䜿っお同時に数字を瀺す䜜業を行っおいたす。その倀が皆で近くなるように話し合いをするこずで、工数芋積もりにおける意芋のすれ違いを防いでいるのです。 今幎床、WESEEKは瀟内グッズの䞀぀ずしおプランニングポヌカヌを䜜成したため、他の瀟内グッズに぀いおは こちら この蚘事では、WS流の工数芋積もりやカヌドの制䜜秘話に぀いおずりあげようず思いたす WESEEKにずっおのプランニングポヌカヌ はじめに、プランニングポヌカヌのメリットや䜿甚䞊心がけおいるこずなどに぀いお、代衚の歊井さんず゚ンゞニアの皆さんにむンタビュヌしおみたした。 巊から貝沢さん、歊井さん、倧谷接さん、田村さん ヌそもそもWESEEKでは、なぜ工数芋積もりにプランニングポヌカヌを䜿甚しおいるんですか 【歊井】 WESEEK的には、゚ンゞニアが個人で動く時に「次に自分が䜕をやらなきゃいけないのか」をわかっおいお欲しくお、そのために有効な手段ずしおプランニングポヌカヌを続けおる。 【田村】 プランニングポヌカヌ導入のきっかけになる出来事はあったんですか 【歊井】 かなり昔の話だけど、少人数で意思疎通が容易だった頃は、スクラムMTGすらやっおいなかったんだよね。だけどある時、業務委蚗の人から「デむリヌのMTGをやった方がいい」っお指摘されお、導入したら結構よかったんだよ。 それをきっかけに「今は芋知った仲で、自分たちのやり方で連携しおいるけど、他の人が入っおきたらできなくなる可胜性もある。䞖の䞭で䜿われおいる手法も詊しおみなきゃだね」ずなった。それでプランニングポヌカヌも始めおみたした。 ヌ詊行錯誀の末に続いおいる物なんですね。では、そんなプランニングポヌカヌでポむント付けをする時に、皆さんが気を぀けおいるこずはありたすか 【歊井】 個人的には、他の人が気づかないこずを指摘するようにしおいる。それがプランニングポヌカヌをやっおお楜しいずころでもあるしね。「ここ芋萜ずしおるよ」っおあえお皆ず違う数倀を出しお、「なるほど、確かに」っお蚀わせたい。そういう発蚀をするこずで、PJぞの理解床を瀺したいんだけど、みんなはどうですか 【貝沢】 僕はスコヌプを気にしお突っ蟌む。ずいうのも、メンバヌ同士で数倀が倧きく違う時は、よく聞いおみるずゎヌルの定矩がぞれぞれで違ったりするんだよね。それっお個々が悪いんじゃなくお、そもそも察象ずなっおいるストヌリヌのゎヌルが䞍明瞭なこずが原因なので。これは気にするようにしおいる。 【田村】 気を぀けおいるこずではないけど、僕のPJは、芁求されおいる仕様が耇雑なこずが倚くお、いざポむント付けをするず「ただ䞍確定な芁玠があったな」ず気づくこずがある。この機䌚のおかげで、より仕様の挏れが朰されおいくから良い詊みだず思いたすね。倧谷接さんは 【倧谷接】 わからない郚分をはっきりさせるように気を぀けおいたすね。結構みんな暗黙の了解で喋っちゃうけど、いざ確認したらそうでなかったっおこずがあるので。 ヌなるほど。実際に䜿甚する䞭で、印象だった出来事はありたすか 【倧谷接】 そもそも僕は、プランニングポヌカヌずいう文化を知らなくお、WESEEKに入瀟しおから始めお觊れたんですよ。その意味で入瀟圓時は新鮮だったし、「こんなに開発者同士が近くで、䞀぀のゎヌルに察しお同じものを芋るのは、非垞に珍しい文化だな」ず蚀う感想を抱きたしたね。 ヌ そうなんですね。おっきり、IT䌁業だずどの䌚瀟でも取り入れおいるのかず思っおいたした。 【倧谷接】 他瀟だず、機胜やPJごずに分業になっおいたりするので、人数が少なくお口頭でもすり合わせが枈むこずもあるんですよ。だから、こんな颚にゲヌムみたいに、䞀぀の堎所に集たっおワむワむやるこずはないかも。 【歊井】 僕からは、”無限カヌド”に぀いお話したい。今回のオリゞナルカヌドでは䜜らなかったけど、最初に買った既補品には”無限カヌド”ず”?ポむントカヌド”があったんだよね。これらは「芋積もりができない」意思衚瀺のカヌドなんだけど、僕は逃げだず思う。 䟋えば、仕様が党然決たっおいなくお「これ決められないでしょ、わかりたせん」っお自信持っお出すならいいけど、みんな考えおるのに、「自分にはスキルがないから芋積もりできたせん」はなしだろう、っお怒るようにしおる。 「最初ポむントカヌドを出しお、次にみんなが出しそうな数字を出しおいたら、呚りが勝手に芋積もりしおくれたした」だず、君は本圓に戊力になっおるのかず思うから。そこをちゃんず考えさせるために、無限カヌドずポむントカヌドはなるべく䜿わないようにしようず指瀺しおいる。 その分、皆がしっかりカヌドを出すこずで、フラットか぀フェアに意芋を蚀える堎ずいう偎面もあるよね。 【倧谷接】 普段は䞊叞に遠慮しちゃう人もいたすしね。でもポむント付けでは「お前が蚀っおいるこずはわからない」っお普通に先茩に蚀える。メンバヌが皆察等に、ストヌリヌを俯瞰できるいい機䌚だず思いたす。 ヌそれでは最埌に、䌁画宀ずしおお聞きしたいのですが 。今回䌁画宀がオリゞナルのカヌドを䜜成したしたが、オンラむンのカヌドよりも、手元にあった方がいいものですか 【貝沢】 オンラむンだずポヌカヌ感はないよね、カヌドじゃないから。 【歊井】 そうだね。あずは、察面だず、メンバヌにカヌドを出しおもらった時に、衚情もセットで芋れる。自信持っお出しおいるのか、おずおずず呚りを䌺っおいるかわかるのが違いかな。 【倧谷接】 開発メンバヌの衚情が分かるのは非垞に良いですね。ただでさえ無機質になりやすいので。 ヌなるほど。コロナ犍で難しいずころもありたすが、ぜひ察面で䜿甚しおいただきたいですね。 ゚ンゞニアの方々に盎接お話を聞いお、プランニングポヌカヌは、「個人の自立を促すず同時に、チヌムワヌクを円滑にする働きもある」ず知りたした。プランニングポヌカヌがどのように仕事に掻きるのか、゚ンゞニアでない私でもむメヌゞが深たっおよかったです 制䜜秘話 次に、WESEEKオリゞナルのプランニングポヌカヌに぀いおお䌝えしたす。プランニングポヌカヌをはじめ、瀟内グッズは䌁画宀の䞻導で䜜成したしたが、コスモレナ瀟の皆さんにたくさんお力添えをいただきたした。コスモレナ瀟さんは、「デザむンを䞻軞に据えるクリ゚むティブカンパニヌ」で、普段の業務でもたくさんサポヌトしお頂いおいたす。 コスモレナ瀟の HP はこちら ずいうこずで商品開発の䞭心ずなった戊略䌁画宀の倪田さんず、コスモレナ瀟デザむナヌの圢郚さん・抌朚さんの䞉人に、カヌドの制䜜背景に぀いおお話を䌺っおみたした。 巊から倪田さん、抌朚さん、圢郚さん ヌはじめに、プランニングポヌカヌ䜜成に至った理由を教えおいただけたせんか 【倪田】 元々ぱコバッグやパヌカヌみたいな、䞀般的なノベルティを候補に出しおたした。ただ䌚議の際に、゚ンゞニアらしいグッズずしお、プランニングポヌカヌが話題に䞊がっお。䌚瀟のロゎを入れたら䜿甚の床にアピヌルになるし、卒業したむンタヌン生にプレれントもできるよねずいうこずで決定したした。 ヌそんな意図があったんですね珟物を芋たしたが、シンプルか぀WESEEKらしい玠敵な商品でした。どのようにあのデザむンに決定したんですか 【抌朚】 圓初はデザむン案を私たちず、゚ンゞニアのかおりさんの䞉人で考えおいたんですよね。圌女は元々デザむンに興味があったみたいで、我々に組み蟌たれる圢で参加しおいたした。 かおりさんのデザむンはハリネズミのむラスト颚なや぀で、圢郚さんは王道なもの。私はドット絵を䜿っおWSロゎを数字にしようず考えおいたした。結構いろんな方向性からのアプロヌチができお、面癜かったです。 抌朚さん案 圢郚さん案 【倪田】 䌁画宀ずしおは、数字の芋やすさを重芖しお、圢郚さんの案を採甚しようずいう結論になりたした。抌朚さんの案もすごく面癜いんですが、数字がパッず読み取りづらいなず感じたしたね。デザむナヌチヌム的には、この結果で玍埗いきたしたか 【抌朚】 どちらの案もクオリティには自信があったので、あずはお奜みで遞んでいただければず思っおいたした。実甚性かデザむン性を取るかで、前者を遞んだのだなず。 【圢郚】 自分は顧客満足床を意識しお䜜ったので、実甚性が高いものになったのかな。どれだけの物が求められおいるかわからなかったし、奇をおらうこずはせず䜿いやすいデザむンに仕䞊げたした。 ヌその点で蚀うず、デザむナヌはもっず凝ったグッズを䜜りたかったけど、䌁画宀から「そんなに工数をかけないで欲しい」ず蚀う芁望があったずいう話を聞いたんですが  【圢郚】 デザむナヌからするず、「工数を抑えお簡単なもので良いよ」ずいう泚文は苊手なんですよね。「奜きなだけこだわっお最高のものを䜜っおくれ」ず蚀われた方が嬉しいし、そっちで解釈しがち。 だけど䌁画宀ずしおは、グッズ開発にリ゜ヌスを割きすぎお本業に支障をきたしたくないので、「最䜎限の工数で良いものを」ずいう費甚察効果を重芖しおいたんだず思いたす。そこのズレですかね。 【倪田】 そうですね。それに、䌁画宀ずコスモレナが初めお関わったのがこの䌁画だったので、今思うず連携䞍足だったなず。こんなに気軜にむンタビュヌに呌べる盞手だず思っおなかったし、圓初の想像以䞊にデザむナヌの皆さんが色々考えおくださっお 。もちろんそのおかげで、デザむナヌの方々にしか思い぀かない案がたくさんできたしたし、玠敵なグッズができお有難かったです。 ヌちなみに、今埌WESEEKグッズを䜜るずしたら䜕か䜜りたいものはありたすか 【抌朚】 WESEEK党䜓ではなくGROWIのグッズを䜜っおみたいです。今あるのは朚工ロゎずステッカヌですよね。GROWIくんで䜕かできないかな。 【圢郚】 僕が個人的にやりたいのは、ハヌドりェアよりPCの䞭で完結するものかな。䟋えば、モヌショングラフィックを䜿ったWESEEKロゎのオヌプニングムヌビヌや、GROWIサヌビスの説明ずか。 【倪田】 䌁画宀でYouTubeを再興させる斜策を考えおいるので、YouTubeのOPずかあったらいいですね。 ヌお話を聞いおいお、WESEEKメンバヌの倪田さんはもちろん、デザむナヌの皆さんが本圓に熱心で有難いですし、䜕より䞀緒にお仕事ができお嬉しいなず感じたした。プランニングポヌカヌは初めおのグッズ䜜成で苊劎も倚かったず思いたすが、それを掻かしおさらに玠敵なグッズを瀟内・瀟倖に提䟛しおいきたいです。 䌁画宀でプランニングポヌカヌやっおみた さお、ここたでプランニングポヌカヌに぀いお曞いおきたしたが、実際にやっおみないずわからないずいうこずで、䌁画宀内でもプランニングポヌカヌによる工数芋積もりを䜓隓しおみるこずにしたした。 今回のお題は 「䌁画宀が蚈画しおいるInstagramの投皿」 に぀いお。 Twitterでの1投皿を「2」ずした時に、Instagramの1投皿はどれぐらいの数字になるだろうかずカヌドを出し合いたした。 1回目の結果は 5・5・13  䜕ず初回から倧きな差が぀いおしたったのです。 3人から出されたカヌドは  13を出したむンタヌン生の安川さんは、Instagramの䌁画案をたさに緎っおいる最䞭。 話を聞いおみるず、自分がこの斜策を進めおいくこずや、やっおみたこずがない事ぞの䞍安を含めおの「13」ずいう結果だずわかりたした。 䞍安は䞀旊眮いおおいお、玔粋に投皿に察する時間・コストずしお出し合おうず2回目を行ったずころ、 5・5・8 に。 お互いにこの数字を出した理由を話あうず、䟋え同じ「5」でも考えおいる事は違うんだなヌずいう発芋がありたした。みんなで玍埗した䞊で、5ず8ずいう隣り合う数倀に収束したので、今回は「8ポむント」の採甚です 1回目に13が出た時にはびっくりだったのですが、その分䞍安を感じおいるこずもわかりたしたし、お互いに心配しおいるこずを話し合うよい機䌚になったず思いたす。 思ったよりも簡単に、しかもお互いの考えを共有できたので、今埌は䌁画宀でもプランニングポヌカヌが掻躍する時も増えおくるかも 非゚ンゞニアの私が感じたこず 私は、今回の蚘事を曞くたでプランニングポヌカヌを瀟内グッズずいう芖点でしか捉えおいたせんでした。でも「どのような目的で䜿われおいるのか」「䌚瀟にどんなメリットを䞎えるのか」ずいう、日頃から取り組んでいる゚ンゞニアの皆さんの姿勢を知っお、仕事䞊の重芁な道具ずいう認識に倉わりたした。 補䜜秘話も、今グッズを䜜っおいる立堎ずしおずおも参考になりたした。ただ䜜るのではなくお、现郚たでこだわるこずで皆の心に残っお欲しいず思いたす。 むンタビュヌにご協力いただいた皆さん、ありがずうございたした おたけ 最埌に、私が携わっおいる商品に぀いおも玹介させおください プランニングポヌカヌはあくたで瀟内向けのグッズですが、WESEEKでは瀟倖にも商品を販売しおいたす。今販売しおいるのは、パヌカヌずマグカップ。どちらも゚ンゞニアの方にしかわからないこだわりが詰たった、玠敵なデザむンです。 こちら の蚘事にお詳しい商品玹介をしおいたすので、ぜひご芧くださいね。 そしお、興味のある方は こちら の販売サむトからご賌入お願いしたす 積読パヌカヌ Mom's Spaghetti Code Mug
collletのログむン埌のホヌム画面 この投皿は、匊瀟が提䟛する WESEEK TECH通信 の䞀環です。 WESEEK TECH通信ずは、WESEEKの゚ンゞニアがキャッチアップした技術に関する情報を、techブログを通じお定期的に発信しおいくものです。 はじめに こんにちは。システム゚ンゞニアの䜐藀です。 この蚘事では WESEEK瀟内通過であるWESEEK DOLLERWSDの流通が開始しお玄1幎経ち、その䞭で発生したHyplerledgerFabricにおける蚌明曞の有効期限切れトラブルず振り返っお分かったこずを物語颚に玹介したす。 WESEEK DOLLER(WSD)ずはWESEEK瀟内で流通する貚幣のこずです。詳现に぀いおはWESEEK Blogの WESEEK DOLLOR や 瀟内通過WSD、リスタヌト をご芧ください。 WESEEK DOLLOR 瀟内通貚WSD、リスタヌト WSDはブロックチェヌンフレヌムワヌクHyperledgerFabricを䜿っおいたす。HyperledgerFabricに぀いおの抂芁やアプリケヌション開発方法に぀いおは、Qiitaの蚘事をご芧ください。 Hyperledger fabric で始めるブロックチェヌンアプリケヌション (1/3) Hyperledger fabric で始めるブロックチェヌンアプリケヌション (2/3) Hyperledger fabric で始めるブロックチェヌンアプリケヌション (3/3) HLFコンポヌネント蚌明曞の有効期限切れ HyperledgerFabricHLFにおけるデヌタや通信の信頌には蚌明曞が甚いられたす。 蚌明曞には圓然有効期限がありたすので、この有効期限が切れた堎合にはシステムに圱響が出たす。 ある日、それは起こった ある日のこず、 「WSD を流通するアプリケヌションcollletにログむンするず、ずっずロヌディングアむコンが衚瀺されたたたになっおしたいたした。。。 」 ずいう連絡を受けたした。 collletではログむンするず所持するWSDの金額ず、その他の操䜜画面ぞのリンクが衚瀺されたす。次の画像参照 collletのログむン埌のホヌム画面 この画面の䞭にある"16"は、自身が所持するWSDの金額です。 自身が所持するWSDの金額はHyperledgerFabricにトランザクションを送った結果が衚瀺されたす。 colllet frontがHyperledgerFabricにトランザクションを送る通信経路は次のようになっおいたす。 # colllet front # ↑ # (REST APIアクセス) # ↓ # colllet back # ↑ # (HLFトランザクション) # ↓ # HyperledgerFabric(Orderer) # ↑ # (HLFコンポヌネント間通信) # ↓ # HyperledgerFabric(Peer) # ↑ # ↓ # Chaincode(WSD) ログを確認するず、frontからbackぞのアクセスが行われた埌にHLFトランザクションが応答しおおらず、たた client identity expired の文字がありたした。 どうやら蚌明曞の有効期限が切れおしたったようです。 [comm.grpc.server] 1 -> INFO 1922 streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.peer_address=***:33312 grpc.code=OK grpc.call_duration=928.91µs [common.deliver] deliverBlocks -> WARN 1923 [channel: ***] Client authorization revoked for deliver request from ***:33330: client identity expired 74h41m17.76951635s before HLFシステムで甚いる蚌明曞は耇数ありたす。 ナヌザヌ蚌明曞 HLF CA蚌明曞 HLF Orderer蚌明曞 HLF Peer蚌明曞 各蚌明曞を確認するず、HLF CA蚌明曞、HLF Orderer蚌明曞、HLF Peer蚌明曞が切れおいるこずが分かりたした。 WSDシステムを導入する時点で発行し、その際に有効期限が1幎であったために同時期に切れたしたが圓然発行した時期ず有効期限によっおは状況が倉わるず思いたす HLFコンポヌネントの蚌明曞が切れるずトランザクション凊理ができなくなりたす。 その結果、collletにログむンしおもその埌の画面が衚瀺できなくなっおいたようでした。 このような堎合、画面䞊で゚ラヌを衚瀺するべきですが䜜りこみの甘さは瀟内利甚限定ずいうこずで枩かい目で芋おください  お時間いただきたすず回答 ずりあえず蚌明曞の曎新が必芁であるこずは分かりたした。WSDスタヌト時からいずれこの日が来るずは分かっおたしたがそこはご愛敬です。 蚌明曞を再発行するにしおも怜蚌する時間も欲しかったので利甚者にはしばらく埅っおもらい週末に察応するこずにしたした。 HLFコンポヌネント蚌明曞の再発行 HLFでは蚌明曞を発行する方法ずしお、enrollずreenrollがありたす。 enrollは蚌明曞の発行であり、reenrollは蚌明曞の再発行です。 fabric-ca-client ずいうツヌルを䜿うずこれらの凊理ができたすが、システム構築時に蚌明曞切れが起こった堎合を想定しおreenrollを実行したこずがあり、今回もそれで解消できるだろうず思っおたしたが蚌明曞の有効期限が切れたずきはreenroll出来ないこずが分かりたした。 よく考えるずそれもそうかず思いたしたがenrollするずきにパスワヌドを指定するこずから、このパスワヌドが残っおいれば再発行できるものだず勘違いをしおいたした。 さお、reenroll出来ないずなるずenrollするしかありたせん。 ここで、HLFでは同䞀IDにおける蚌明曞の発行回数が制限されおいたす。 fabric-ca-client identity list で衚瀺される"Max Enrollments"がこれに圓たりたす。 $ fabric-ca-client identity list Name: admin, Type: client, Affiliation: , Max Enrollments: -1, Attributes: [{Name:hf.IntermediateCA Value:1 ECert:false} {Name:hf.GenCRL Value:1 ECert:false} {Name:hf.Registrar.Attributes Value:* ECert:false} {Name:hf.AffiliationMgr Value:1 ECert:false} {Name:hf.Registrar.Roles Value:* ECert:false} {Name:hf.Registrar.DelegateRoles Value:* ECert:false} {Name:hf.Revoker Value:1 ECert:false}] HLFコンポヌネントの蚌明曞を発行する際は fabric-ca-client register コマンドを䜿いたした。 この際に"Max Enrollments"は指定しおいなかったのでCAに蚭定された最倧発行回数がdefault倀になり、幞いにも"-1"無限でした。 ひずたずenrollすれば蚌明曞の発行ができたす。 埌はひたすら蚌明曞を発行しおシステムで利甚する蚌明曞ず眮き換えれば䜜業は完了です。時間はかかりたすが単調な䜜業ですね。 振り返っお分かったこず 地味な蚌明曞の発行ず眮き換えを繰り返しお無事にcollletが埩旧しおトランザクション凊理を行えるようになりたした。 振り返っお分かったこずは次のずおりです。 HLFコンポヌネントの蚌明曞有効期限が切れるず党ナヌザヌがトランザクション凊理ができなくなる 蚌明曞の有効期限が切れるずreenroll出来なくなる 蚌明曞の発行回数期限は"Max Enrollments"により発行時に蚭定される fabric-ca-client コマンドでregister時に最倧発行回数が指定できる fabric-ca-client コマンドで最倧発行回数を指定せずにregisterした堎合はCAの最倧発行回数がdefault倀になる ナヌザヌ蚌明曞の有効期限切れ HLF コンポヌネントの他にナヌザヌにも蚌明曞が発行されたす。 再び、それは起こった ある日が起こっおからそう間もない日、再びそれは起こりたした。 「あるナヌザヌで colllet にログむン出来なくなりたした。他のナヌザヌではログむンできるのですが䜕か分かりたすか・・・ 」 ずいう連絡を受けたした。 そうです、ナヌザヌ蚌明曞の有効期限が切れおしたったようです。 ナヌザヌ蚌明曞が切れた堎合もHLFにおいおトランザクション凊理ができなくなりたす。䜆し、HLF コンポヌネントの蚌明曞が切れた堎合ず異なり、期限が切れたナヌザヌだけがトランザクション凊理ができなくなりたす。 有効期限はナヌザヌが登録された日から1幎間だったため、ナヌザヌによっおはログむンできる・できないが違いたした。 この時は先日のHLFコンポヌネントの蚌明曞有効期限が切れたずきに期限䞀芧を芋お気が付いおいたしたが、 fabric-ca-client コマンドを非゚ンゞニアに実行しおもらっお再発行するのは珟実的ではないのでアプリケヌション偎で機胜実装する必芁があるず考えおいたした。 ナヌザヌ蚌明曞の再発行 HyperledgerFabricにおいお、 hf.Type ずいう蚌明曞の拡匵属性を䜿うこずで分類するこずは可胜ですが、基本的にナヌザヌ蚌明曞もHLFコンポヌネントの蚌明曞も同じです。 そのため、ナヌザヌ蚌明曞の発行・再発行もHLFコンポヌネントの蚌明曞発行ずやり方は同じです。 しかし、発行した方法の違いで"Max Enrollments"が違ったのです。。。 collletではアプリケヌションでナヌザヌ登録ができたす。 colllet backはNode.jsで実装されおおり、 Hyperledger Fabric SDK for Node.js を䜿っおいたす。 ここで、registerをする際の蚌明曞の発行回数期限がデフォルトでは1だったのです。該圓するコヌドは次のリンク先を参照 https://github.com/hyperledger/fabric-sdk-node/blob/82199a83a2d4ffd026fbcbdb33effaaa88d97950/fabric-ca-client/lib/FabricCAServices.js#L133 ぀たり蚌明曞の有効期限が切れた堎合はreenroll出来ず、曎にはenrollは既に行われおいるので再びenrollするこずもできたせん。 ではどうすればよいのかを調べおいたずころ、この"Max Enrollments"は fabric-ca-client identity modify を䜿っお倉曎出来るこずが分かりたした。 そこで、以䞋の察応をするこずにしたした。 既存ナヌザヌの"Max Enrollments"を"-1"ぞ倉曎する アプリケヌション偎でナヌザヌ登録時に"Max Enrollments"を"-1"にする ナヌザヌログむン時に蚌明曞の有効期限に応じお、蚌明曞を再床発行enrollでありreenrollではないする 振り返っお分かったこず HLFナヌザヌの蚌明曞有効期限が切れるず該圓ナヌザヌはトランザクション凊理ができなくなる Hyperledger Fabric SDK for Node.jsのFabricCAServices#registerはdefaultで"Max Enrollments"が"1"になる fabric-ca-client identity modify により"Max Enrollments"は倉曎できる $ fabric-ca-client identity modify --maxenrollments -1 [USER] さいごに HyperledgerFabricにおいお蚌明曞の有効期限が切れたずきの圱響ず察応方法に぀いお玹介したした。 たた機䌚がありたしたらブロックチェヌンのデヌタ構造などを玹介しようず思いたす。
この蚘事は、2021/11/25 に行った WESEEK Tech Conference #15 の内容をたずめたものです。 はじめに こういった悩みや疑問をお持ちの方はいたせんか サブスクリプション型課金のサヌビスを考えおいるが決枈をどうすればいいのか分からない クレゞットカヌドや銀行などが絡んでくるず、決枈の管理が倧倉 そもそも定期支払っおどうやっお実珟するの そんな悩みを解消しおくれる Stripe ずいうサヌビスを、 WESEEKがサヌビスを提䟛する GROWI.cloud を実䟋ずしおご玹介したす。 「Stripe」ずは Stripe は、米 Stripe 瀟が提䟛するオンラむン決枈サヌビスです。 ラむブラリ・API が甚意されおおり、サブスクリプション型の決枈を行うプログラムを簡単にサヌビスに組み蟌むこずができたす。 始めるのがずおも簡単 メヌルアドレスさえあれば、誰でも簡単か぀即時にテストアカりントを発行が可胜で、思い立ったず同時にすぐに怜蚌を開始できたす。 たた、本番環境利甚の申請に぀いおも必須項目を埋めお送信するだけで完了するので、最短1日で利甚開始できたす。 Stripeのデヌタの皮類 䞻芁なデヌタの皮類 Stripe でサブスクリプション圢匏の課金を組むために、知っおおく必芁がある5぀のデヌタの皮類に぀いおご玹介したす。 顧客 (Customer) ・・・ 䞀顧客を衚すデヌタ 商品 (Product) ・・・ 提䟛する商品を衚すデヌタ 料金 (Plan) ・・・商品の料金 ¥〇 / 月 等のデヌタ むンボむス(Invoice) ・・・(料金 × 顧客) 請求情報を衚す サブスクリプション(Subscription) ・・・定期支払を衚す 䞊蚘の 5 皮のデヌタの組み合わせによっお、最終的にサブスクリプションが構成されたす。 サブスクリプション(Subscription)の仕様 これから、Stripe における Subscription のデヌタの䞭身や挙動に぀いお深掘りしおいきたす。 サブスクリプションずいうデヌタの䞭身・挙動 顧客の情報を持぀ 期間ず期間の区切り、料金プランを持぀ 期間の区切りごずに支払い情報を䜜成する ぀たり、むンボむスを定期的に自動生成しお定期支払を実珟しおいるのが「 サブスクリプション 」なのです。 たた、課金が発生しない (0円課金) の料金プランをサブスクリプションに蚭定する堎合は、顧客情報に支払い方法を登録する必芁がありたせん。 開発者向け情報 もちろんですが、テスト版アカりントでは匕き萜ずしなどは発生したせん。 テスト版アカりントでは、Stripe が甚意するダミヌのカヌドを䜿甚できたす。 たた、支払いに成功する堎合のみを怜蚌しおいおは、実際に運甚するこずはできたせんよね そういった支払いに倱敗した堎合を確認するためのダミヌカヌドもありたす。 たた、その皮類も豊富で、倱敗しおしたう理由が異なるダミヌカヌドが様々甚意されおいたす。 ここでStripeの仕様に぀いお疑問 Q: 期間の途䞭で顧客がプランを倉曎したらどうなるでしょうか A: Stripe が日割り蚈算を行っお次回請求情報を自動曎新しおくれたす よっお、サヌビス提䟛者が課金呚りをシビアに気にする必芁がありたせん Q: Stripeの月額はいくら A: 月額の利甚料はナシだが、決枈成立ごずに 3.6% の手数料がかかる 芏暡の小さなスタヌトアップのサヌビスほど導入しやすい SDK&ドキュメント Stripe では、様々な皮類の開発者ツヌルが提䟛されおいたす CLI Node.js ラむブラリ VisualStudio Code の拡匵機胜 REST API ドキュメントも充実 API ドキュメントをはじめ、仕様に関するドキュメントが充実しおいたす。 日本語版も珟圚敎備され぀぀ありたすが、基本は英語版を翻蚳したものであり翻蚳が未察応の箇所や蚀語による若干の衚珟の差もありたす。 安心のサポヌト 前述で䞍安を芚える方もいらっしゃるず思いたすが、ご安心ください。 開発者向けのサポヌトも手厚く、ドキュメントを読んで䞍明な点があれば、気軜にサポヌトぞ質問できたす。 サポヌトの䜓制 日本語でのサポヌトはメヌルでの察応ずなり、翌営業日に回答しおいただけたす。 たた急いで確認したい堎合は、英語であればチャットでのサポヌト察応を受けおいただけるため、その堎で䌚話しながら䞍明点の解消を進められたす。 GROWI.cloudでの導入事䟋 GROWI.cloud では、Stripe が提䟛しおいる Node.js のラむブラリ、Stripe React Element ずいうコンポヌネントラむブラリを䜿甚しおいたす。 商品ずプランの管理に぀いおは、プランごずの料金蚭定をマむグレヌション甚ファむルにたずめお䞀元管理しおいたす。 商品の远加や䟡栌の倉曎などが発生した際には、該圓ファむルを曎新しマむグレヌションを実行しおいたす。 GROWI.cloud では顧客、サブスクリプション、むンボむスをどう扱っおいるのか 顧客の䜜成からプランのご契玄たでの流れをご玹介したす。 アカりント登録時に Stripe 䞊の顧客情報を䜜成 const attachStripeCustomer = async(customer, option) => { const stripeCustomer = await stripe.customers.create({ email: customer.email, description: `Customer ID: ${customer.id}`, }); await customer.update({ stripeCustomerId: stripeCustomer.id }, option); }; 同時に課金額0円の料金プランでサブスクリプションを䜜成 const attachStripeSubscription = async(customer, plan, options) => { return stripe.subscriptions.create({ customer: customer.id, items: [{ plan: plan.id }], expand: ['latest_invoice.payment_intent'], ...options, }); }; 登録完了埌、ナヌザヌの任意のタむミングでプラン倉曎 const changeSubscription = async(subscriptionId, subscriptionItems, options) => { await stripe.subscriptions.update(subscriptionId, { items: subscriptionItems, expand: ['latest_invoice.payment_intent'], ...options, }); }; 支払い情報が未登録の堎合は、登録完了埌にプラン倉曎が可胜 Stripe React Element を利甚しおいたす Stripeの䟿利機胜PickUp ダッシュボヌド Stripe が自動集蚈しおくれる様々なデヌタを閲芧可胜 MRR (月間暙準収益) ダッシュボヌドから確認可胜な指暙の䞀぀で、サブスクリプションが継続しおいる契玄党䜓の月圓たりの収益芋蟌みを衚したす。 サブスクリプションサヌビスを提䟛する堎合、継続が芋蟌める月間の収益は売り䞊げず盎結するので、サヌビス戊略を考える指暙ずしおも非垞に重芁な指暙です。 クヌポン 特定の支払いに察しお割匕を行う「クヌポン」を発行するこずができたす。 割匕率 は MRR に圱響したせん。 (正芏の金額通り MRR に反映される) 䟋)新芏に契玄される 600 円/月 プランに 50% 割匕クヌポンを適甚した堎合 → 顧客の支払金額は 300 円/月 → MRR の倉動は +600 円 クヌポンは割匕される支払いが限定されるため「MRR」぀たり「月間暙準収益」ずいう扱いの䞊では、暙準の倀 (クヌポンによる割匕を適甚しない倀) が反映される仕様だず考えるのが劥圓です。 トラむアル 期限を蚭けお、期限たで割匕した額で請求を行うトラむアル提䟛を行うこずができたす。 トラむアル䞭のサブスクリプション は MRR に圱響したせん。 䟋)600円/月プランを50%割匕でトラむアル開始した堎合 → 顧客の支払金額は 300 円/月 → MRR の倉動は ±0 円 トラむアルは、収益の芋蟌みがただ立っおいない状態で、名の衚す通りトラむアル䞭ずいう状況を䜜り出すものです。 たた、トラむアルを開始させるためには、顧客がキャンセルするための様々な条件や同意を明瀺的に提瀺する必芁がありたす。 これは、トラむアル䞭の顧客は正匏な顧客ずなる前の段階で、収益が玄束された本契玄ではないず扱うためそうなっおいるず考えられたす。 よっお、トラむアル䞭の状態ではただ「(月間)暙準収益」ずしお扱うこずができないため MRR に反映されない仕様だず考えるのが劥圓です。 倱敗談ず察策 初月無料キャンペヌンにおける倱敗 [問題その1]突貫実装による考慮䞍足で、支払い倱敗が連発しおしたう 経緯 他サヌビスで圓たり前ずなっおいる「初回〇〇無料」ずいう販促斜策に぀いお瀟内から匷い芁望があり、優先しお実装するこずになりたした そこで我々は Stripe のドキュメントを調査し、クヌポンずいう機胜があるこずを知りたす たた、調査の結果以䞋の仕様が分かりたした 「〇〇%オフ」のクヌポンを䜜成するこずができる クヌポンを適甚するこずで、1回の支払いにおいお割匕を適甚できる 100%オフクヌポンを䜿うこずで、支払い方法の登録なしのたた有料プランを蚭定できる 実装も完了し意気揚々ず初月無料キャンペヌン開始のプレスリリヌスを打ちたした。 キャンペヌンの効果もあり、埐々にナヌザヌが増えおきた・・・が、そこで事件が起こりたす。 問題発生 1か月が経過した初月無料キャンペヌン適甚ナヌザヌが珟れ始めたころ、その支払いが (ほが) 党お倱敗するずいう珟象が発生しおしたいたした。 原因 支払い情報の登録を行わず、100%オフクヌポンを䜿う仕様ずしたこずで、本来であれば有料であるプランを次回の支払いを考慮せずに契玄させおしたったこず。 → どういうこずか 初めお請求を行う「初月無料キャンペヌン」開始の際は支払い方法が登録されおいなくずも問題は発生しなかった 2回目の請求を行った際に、有償のプランを契玄した状態のたた支払い方法が登録されおいないため倱敗しおいた ずいう、単玔な仕様の考慮挏れに気づくこずができなかったこずが今回の敗因でした。 [問題その2]MRRの数倀に悪圱響が出おしたった 問題点 MRR の数倀を、斜策の方針を怜蚎する際の材料ずしお利甚しおいたが、初月無料プラン提䟛開始埌から、実際に課金される倀ず 「クヌポンは MRR に圱響しない」ずいう倀ず倀ず関係性を正しく理解しおいなかった。 MRR には 割匕を適甚しない 金額が加算される ぀たり、無料期間だけお詊しで利甚しおみるだけの顧客が利甚したプランの金額が有効なものずしお扱われるため、 本来の課金額が高いプランを利甚したナヌザヌが居れば居るほどプランで MRR が乱高䞋した。 察策線 トラむアルずいう機胜があり、そちらが適切だず気づく ドキュメントをさらに読み蟌み、トラむアルずいう機胜に出䌚いたす。 トラむアルを利甚するよう再床仕様を緎り盎す事にしたした。 結果的に、クヌポンを利甚した「初月無料キャンペヌン」から、「1か月無料トラむアル」に乗り換えるこずになりたす。 実際のコヌド倉曎 元々、 Stripe がトラむアルずいう機胜で提䟛しおいたものに䌌たようなものを「クヌポン」ずしお提䟛しようずしおいたためか、内郚の実装は倧きく倉わらず実珟できたした。 await stripe.subscriptions.update(subscriptionId, { items: subscriptionItems, coupon: “COUPON_CODE_XXX” }); ↓↓ await stripe.subscriptions.update(subscriptionId, { items: subscriptionItems, trial_end: addMonths(new Date(), 1) }); 結果 トラむアルにするこずで、サブスクリプションそのものが MRR に圱響しなくなった 長い間懞念しおいた MRR の乱高䞋もかなり萜ち着きたした。 たずめ Stripe は、珟圚勢いのあるオンラむン決枈サヌビス 導入が簡単 玠早く柔軟に倉曎可胜 正しく理解しお䜿えばずおも䟿利 ぜひ利甚を怜蚎しおみおはいかがでしょうか 著者プロフィヌル 䌊勢 達也 株匏䌚瀟WESEEK / システム゚ンゞニア 2013幎8月から2015幎3月たで WESEEK に圚籍 2017幎7月に WESEEK 初のフルリモヌトメンバヌずしお WESEEK に再入瀟 2018幎5月に別府サテラむトオフィスを開蚭 別府サテラむトオフィスのメンバヌ5名を率いお GROWI / GROWI.cloud を開発・運甚䞭 株匏䌚瀟WESEEKに぀いお 株匏䌚瀟WESEEK は、システム開発のプロフェッショナル集団です。 【珟圚の䞻な事業】 通信倧手䌁業の業務フロヌ自動化プロゞェクト ゜ヌシャルゲヌムの受蚗開発 自瀟発オヌプン゜ヌスプロダクト「 GROWI 」「 GROWI.cloud 」の開発 GROWI GROWI は、Markdown蚘法でペヌゞを蚘述できるオヌプン゜ヌスのWikiシステムです。 GROWI.cloud GROWI.cloud はOSSのGROWIを専門的知識がなくおも簡単に運甚・管理できる、法人・個人向けの商甚サヌビスです。 倧手SIer・ISPや䞭小䌁業、倧孊の研究宀など様々な堎所でご利甚いただいおおりたす。 【䞻な特城】 テキストも図衚もどんどん曞ける、匷力な線集機胜 チヌム拡倧に迅速に察応できる管理者向け機胜を提䟛 充実した機胜・サポヌトで゚ンタヌプラむズにも察応 【導入事䟋蚘事】 むンタヌネットマルチフィヌド株匏䌚瀟様 [ https://growi.cloud/interviews/mfeed/?utm_source=connpass-top&utm_medium=web-site&utm_campaign=mf:embed:cite ] 株匏䌚瀟HIKKYVR法人HIKKY様 [ https://growi.cloud/interviews/hikky:embed:cite ] WESEEK Tech Conference WESEEK Tech Conference は、株匏䌚瀟WESEEKが䞻催する゚ンゞニア向けの勉匷䌚です。 月に2回ほど、WESEEKに所属する゚ンゞニアが様々なテヌマで発衚を行う予定です。 次回は「激癜GROWI.cloudの可甚性向䞊の取り組み」 12/23(朚) 19:00~20:00に開催予定です。 顧客に䜕らかのサヌビスを提䟛する䞊で、日垞的なサヌビス可甚性の維持・向䞊に関する業務は必須ずなりたす。 本発衚では、可甚性維持・向䞊に必芁な項目を挙げ぀぀、匊瀟が実際に提䟛しおいるサヌビスである GROWI.cloud での実斜䟋をご玹介いたしたす。 どのような圢で SLO の策定に至ったのか どのような構成で可甚性を数倀化しおいるのか どのような業務を実斜しお、可甚性の維持・向䞊を達成しおいるか 珟圚、connpassやTECH PLAYで参加受付䞭です。皆様のご参加をお埅ちしおおりたす https://weseek.connpass.com/event/231659/ TECH PLAYはこちらから 䞀緒に働く仲間を募集しおいたす 東京の高田銬堎オフィス、倧分にある別府サテラむトオフィスにお゚ンゞニアを募集しおおりたす。 䞭途採甚だけではなく、むンタヌンシップも積極的に受け入れおいたす 詳しい募集芁項は、匊瀟HPの 採甚ペヌゞ からご確認ください。
この投皿は、匊瀟が提䟛するWESEEK TECH通信の䞀環です。 WESEEK TECH通信ずは、WESEEKの゚ンゞニアがキャッチアップした技術に関する情報を、techブログを通じお定期的に発信しおいくものです。 はじめに こんにちは、システム゚ンゞニアのかおりです。この蚘事では、TypeScriptで甚いられる Enum型 ずUnion型の基本的な䜿い方から、Enumを避けるべきず蚀われおいる理由、Union型を甚いおEnumのように曞く方法などを説明しおいたす。 Enum (列挙型) ずは? そもそも Enum ずは䜕か、なんのために䜿うものなのでしょうか。 ここで説明しおいる Enum ずは総称であり、列挙型ずも呌ばれたす。以䞋の䟋は TypeScript のコヌドですが、他の蚀語でも存圚する抂念・実装であり、耇数の定数を䞀぀にたずめお定矩したり管理したりするこずができたす。 enum SIZE { Small, Medium, Large, } const newSize = SIZE.Small; console.log(newSize === SIZE.Small); // true console.log(newSize === SIZE.Large); // false Enum (列挙型) を䜿うメリット 䞊蚘の䟋、単玔に文字列ずしお "small" などを倉数で定矩しお比范する方法ず比べおどんなメリットがあるのでしょうか。 最も倧きな恩恵は、スペルミスや倧文字小文字などの人的゚ラヌを防ぐこずができる点です。 䟋えば Visual Studio Code などの TypeScript の補完が可胜な゚ディタ䞊で SIZE. ず入力するず、 enum SIZE で定矩されおいるキヌがサゞェストされたす。 たた、Enumは型ずしおも利甚できるので、より堅牢なシステムの構築に圹立ちたす。 JavaScript、TypeScript での enum JavaScript には enum は存圚したせん。そのため、enum でやりたいこずを実珟するには const が代甚ずなるでしょう。 const SIZE = { Small: 'small', Medium: 'medium', Large: 'large', }; console.log(SIZE.Small); // small 䞀方 TypeScript には enum の機胜がありたす。しかし、以䞋のように少々癖がありたす。 // 䜕も指定しない堎合、0からの番号が割り振られおいきたす。 enum SIZE { Small, // 0 Medium, // 1 Large, // 2 } console.log(SIZE.Large); // 2 console.log(SIZE[1]); // Medium 少し冗長ですが、各定数に任意の文字列や任意の数字を割り圓おるこずもできたす。 enum SIZE { Small = "small", Medium = "medium", Large = "large", } console.log(SIZE.Large); // large // 䞀番最初の定数(ここではSmall)に5を指定した堎合、定数は5からの数字が割り振られたす。 enum SIZE { Small = 5, // 5 Medium, // 6 Large, // 7 } console.log(SIZE.Large); // 7 定数の途䞭で数字を指定した堎合、最初の定数は0から始たり、途䞭から指定された文字から数字が割り振られたす。 enum SIZE { Small, // 0 Medium = 4, // 4 Large, // 5 } console.log(SIZE.Medium) // 4 Enum 型 ず Union型の比范に぀いお これたで述べたメリットを螏たえた䞊で、実は界隈では TypeScript の enum に぀いおは利甚の反察掟(非掚奚掟)が存圚したす。 このenum型ず、非掚奚掟が掚奚するunion型に぀いおお話ししたいず思いたす。 Enum を䜿甚する際の泚意点 1. 意図しない倀にアクセスできおしたう 䞊蚘の説明で、enumに数倀が割り圓おられおいる堎合、その数倀から倀を取埗するこずができるず説明したした。これを利甚しお、割り圓おられおいない数倀からの倀の取埗が可胜ずなり、意図せずundefinedが返っおきおしたいたす。 enum SIZE { Small, Medium, Large, } console.log(SIZE[1]); // Medium // no error!! console.log(SIZE[5]); // undefined 数倀のenumにはあらゆるnumberを割り圓おるこずができるので、型安党性に欠けおしたいたす。 2. Tree-shaking が䜜動せず、呌び出されない䞍芁なコヌドがコンパむルされおしたう TypeScriptで定矩されたenumは、Javascriptにトランスパむルされる際に以䞋のような即時実行関数ずしお倉換されたす。即時実行関数ずは、「定矩されるずすぐに実行される」JavaScriptの関数のこずです。 var SIZE; (function (SIZE) { SIZE[SIZE["Small"] = 0] = "Small"; SIZE[SIZE["Medium"] = 4] = "Medium"; SIZE[SIZE["Large"] = 5] = "Large"; })(SIZE || (SIZE = {})); // 文字列を割り圓おた堎合 var SIZE; (function (SIZE) { SIZE2["Small"] = "small"; SIZE2["Medium"] = "medium"; SIZE2["Large"] = "large"; })(SIZE || (SIZE = {})); このように即時実行関数ずしおトランスパむルされるず、Tree-shakingが䞊手く働かなくなっおしたうずいう問題点がありたす。 Tree-shakingずは....?Tree-shaking ずは、webpackなどのモゞュヌルハンドラがJavascriptファむルを䞀぀にたずめる際に、実行されない䜙分なコヌドを削陀するずいった凊理のこずです。 朚を振るこずで、䞍芁なものを萜ずしおボリュヌムを小さくするむメヌゞだず個人的に解釈したした。 以䞋のサむトで Tree shakingに぀いお説明されおいるので、よければご芧ください。 MDN: Web Docs: Tree shaking Webpack rule that may reduce your CSS file size dramatically 3. isolatedModulesがtrueの堎合、const enum䜿甚時にコンパむル゚ラヌになるこずがある --isolatedModulesオプションを有効にする堎合、 Transpile each file as a separate module (similar to 'ts.transpileModule'). このオプションをtrueにした堎合、const enumぱラヌずなりコンパむルできない。 詳现は以䞋の蚘事をご芧ください。https://www.kabuku.co.jp/developers/good-bye-typescript-enum 以䞊の理由から、enumの利甚は避けるべきであるず蚀われおいたす。 では、enumのような機胜を䜿いたい堎合はどうすれば良いのでしょうか? それは、Union型を䜿うこずで実珟できたす。 Union型に぀いお Union型は、以䞋のように2぀以䞊の型をパむプ蚘号|で繋げお曞くこずで、耇数の型を指定できたす。 const middleName: string | null Enumの代わりに、Union型を甚いる Enumを䜿わずずも、Enumのように定矩するにはどうすればいいのでしょうか?const assertion(as const), keyof, typeof を䜿っおenumのような定矩をするこずができたす。 // const assertionを䜿っお、リテラル型ずしお扱う const SizeType = { SMALL: 'small', MEDIUM: 'medium', LARGE: 'large', } as const; // type SizeType = 'small' | 'medium' | 'large' type SizeType = typeof SizeType[keyof typeof SizeType]; 现かく分解するず、以䞋のようになりたす。 // type SizeType = { // readonly SMALL: "small"; // readonly MEDIUM: "medium"; // readonly LARGE: "large"; // } type SizeType = typeof Size; // type SizeKey = "SMALL" | "MEDIUM" | "LARGE" type SizeKey = keyof SizeType; // type Size = 'small' | 'medium' | 'large' type Size = SizeType[SizeKey]; const assertion、リテラル型, keyof, typeof に関しおは、以䞋の蚘事でわかりやすく説明されおいるので、よければご確認ください。 constアサヌション「as const」 (const assertion) リテラル型 typeof, keyof, inの動䜜確認 unionのリストを手に入れたい堎合 javaScriptが提䟛する Object.values関数を䜿甚しお、取埗するこずができたす。 // const AllSizeType = Object.values(SizeType); const AllSizeType = Object.values(SizeType); MDN Web Docs: Object.values 完成系テンプレヌト WESEEK では以䞋をテンプレヌトずしお䜿甚しおいたす。const assertion に倀を远加するだけで union ず党倀のリストを export できるので䟿利です。 const SizeType = { SMALL: 'small', MEDIUM: 'medium', LARGE: 'large', } as const; // type SizeType = "small" | "medium" | "large" export type SizeType = typeof SizeType[keyof typeof SizeType]; // 党おのtypeを配列ずしお取埗 // const AllSizeType: ("small" | "medium" | "large")[] export const AllSizeType = Object.values(SizeType); たずめ 総称ずしおの Enum (列挙型)に぀いお 耇数の定数をたずめお定矩したり管理するのに䟿利 いろんな蚀語で利甚できるが JavaScript にはない Enum は型ずしおも䜿えるので、バグを防ぐこずに圹立぀ TypeScript の enum vs union いろんな蚘述方法がある enum は、蚘述は簡単 enum の利甚には耇数の萜ずし穎があるので、union型を甚いるこずが䞀郚では掚奚されおいる こだわりがなければ、TypeScript ではenum型ではなくunion型を甚いるこずをお奚めしたす。 参考にさせおいただいたサむト MDN Web Docs: Tree shaking Enum の代わりに䜿う union 型
この蚘事は、2021/10/28 に行った WESEEK Tech Conference #14 の内容をたずめたものです。 第14回目のテヌマは「あなたもできるGASで勀怠入力Slack App構築」 実際に WESEEK で䜿っおいる勀怠入力システム「tickrec」の構成を元に、Slackで勀怠入力ができるアプリケヌションを1から構築するための方法をレクチャヌしたす。 構成芁玠の解説はもちろん、実際の画面も亀えながら構築する手順を解説したす。 これを芋た暁には、あなたも勀怠入力 Slack App が構築できるようになっおいるはず。 勀怠システムよもやた話 皆さんの䌚瀟では、どんな勀怠システム䜿っおいたすか Web システムや専甚アプリ、はたたた玙の管理簿やタむムレコヌダヌなど䜿っおいる方もいるず思いたす。 WESEEK ではあたり倧芏暡なシステムは導入しおいたせん。Google Spreadsheet を䜿っお、シンプルに党瀟員の勀怠を1シヌトで蚘録しおいたす。 しかし、 Spreadsheet には Excel 等ず同様に Pivot table をはじめずした豊富な集蚈機胜が搭茉されおいるため、管理業務に必芁な月の合蚈皌働時間や平均勀務時間もできたす。 勀怠管理の課題 どんなシステムを導入しおいたずしおも、勀怠管理における共通の課題ずいうのが぀きたずうのではないでしょうか それは 入力が面倒 ずいう点です。 Spreadsheet だろうが Web システムだろうが、同じ課題がありたす。 正盎なずころ、埓業員からすれば、勀怠入力するためだけにツヌルを開くこずさえ面倒です。 その結果、圓日䞭の入力忘れが頻発したり、堎合によっおは月が倉わっおも前月分の入力抜けがあったりしお、月締め時期にバックダヌドチヌムが個別にリマむンドするなどの䜙蚈な業務が発生したりしたす。 それが垞態化するず、月末にたずめお適圓に入力する行為が暪行するなど、「果たしお正しく勀務時刻が蚘録されおいるのか」、その粟床に疑問が残りたす 勀怠入力の改善方法 しかし、この課題に察する改善方針はシンプルです。ずにかく入力たでのstep数を枛らすこず に尜きたす。 既存の勀怠システムでも、この点を意識した゜リュヌションが芋受けられたす。 䟋えば、アプリや Web システムの堎合、勀怠入力システムを開いおワンステップで打刻可胜な UI にするこずで改善されおいたす。 曎に、ハヌドりェアを駆䜿しお改善をねらった゜リュヌションもありたす。 䟋えば IC カヌドで打刻できるシステムです。 近幎、セキュリティ察策の䞀環ずしお、IC カヌドをかざすこずで執務宀を解錠するシステムを採甚する䌚瀟も倚いず思いたす。 そのようなシステムを導入枈みの堎合、勀怠甚 IC カヌドリヌダを入り口近くに配眮するこずで、シヌムレスに出勀即打刻が実珟できたす。 たた解錠システムず勀怠システムを連携できる゜リュヌションも存圚したす。 曎に螏み蟌んだ゜リュヌションずしお、ビヌコンで打刻できるシステムもありたす。 これは Bluetooth 等の無線システムを掻甚しおおり、各瀟員のスマホが勀怠端末圏内に入るだけで自動打刻できるずいうものです。 ここたで来るず、出瀟するだけでれロステップで打刻が可胜になりたす。 WESEEK 瀟内の勀怠入力改善゜リュヌション ず、実に倢の広がる勀怠入力゜リュヌションの䟋を玹介しおきたしたが、これらのシステムの導入ず維持にはそれなりのコストがかかりたす。 WESEEK ずしおは、もう少しコスパの良い手段を導入するこずにしたした。 Tickrec を自䜜 Tickrec ず名付けたツヌルを䜜成し、導入したした。 Slack App になっおおり、 Slack 䞊で䞋蚘のような挙動が実珟できおいたす。 毎朝、瀟内 Slack に DM で勀怠ボタンが飛んでくる ボタンをクリックするず、勀怠入力完了 Google Spreadsheetに入力される 導入のメリット Tickrec の導入により、瀟内 Slack からワンクリックで勀怠入力ができるようになりたした。 WESEEK ではコミュニケヌションツヌルずしお Slack を導入しおいるため、埓業員党員が Slack を垞時起動させおいたす。 そのため、打刻専甚のアプリなどをいちいち開く手間が省けるのです。 たた、 Tickrec の Slack App 郚分は、ただのヒュヌマンむンタフェヌスに培しおおり、勀怠の蚘録そのものは埓来通り Spreadsheet に蚘録されたす。 そのため、バックオフィスチヌムの業務を倉曎する必芁もありたせん。 曎にコスト面では、自䜜か぀無料で䜿えるサヌビスの組み合わせで構築されおいるため、基本的にランニングコストはありたせん 内郚構成 Tickrec は以䞋のようなサヌビスを䜿っお構成しおいたす。 䜿甚しおいるのは、 Slack App ず、 Google Spreadsheet ず共に動く Google Apps Script (以降、GAS) だけです。 いずれも専甚のツヌルなどが䞍芁でブラりザで操䜜が完結でき、か぀基本的に無料で利甚できたす。 このように、今すぐにでも構築を始められるサヌビスの組み合わせだけで構成しおいたす。 今すぐ構築しおみよう ずいうこずで、これから皆さんに、超簡易版の Tickrec を構築しおもらおうず思いたす。 甚意するもの 必芁なものは䞋蚘の通りです。 App を远加できる暩限のある Slack workspace Google Account このレクチャヌの目的 今回のレクチャヌの䞻な目的は、皆さんに超簡易版の Tickrec を構築しおもらい、「これなら私も Slack App を䜜れそう」ず思っおもらえるこずです。 実際に Tickrec を構築するのに必芁なのは、各サヌビスのセットアップず、 Tickrec の䞭枢であるプログラムの実装です。 ですが、プログラムを䞀から曞くず時間がかかっおしたうので、プログラムに぀いおはサンプルコヌドを甚意しおありたす。 したがっお、これからレクチャヌするのは、サヌビスのセットアップ手順が䞻であり、プログラムの曞き方の説明は割愛しおいたす。 ただし、 各機胜を実珟するための GAS 特有の郚分などは、キヌポむントずしお玹介したす。 本日のレシピ ここからは、以䞋のステップに埓っお進めおいきたしょう 仕蟌み1: GASプロゞェクトを䜜る STEP1: GASで打刻する 仕蟌み2: Slack Appを䜜る STEP2: GASでSlackに投皿する STEP3: Slackの操䜜でGASを動かす STEP4: Slackで打刻する それでは早速始めたしょう。 仕蟌み1 GASプロゞェクトを぀くる たずは䞋準備ずしお、Spreadsheet ず GAS プロゞェクトを䜜成したしょう。 手順 Spreadsheet の甚意 Spreadsheet はサンプルを甚意しおあるので、これをもずにしたす。 「超簡易版Tickrec向け勀怠シヌト」がサンプルなので、たずは「コピヌを䜜成」したす。 するずあなたの Google Drive に「超簡易版Tickrec向け勀怠シヌト のコピヌ」が䜜成されたす。 これで、 Spreadsheet の準備ができたした。 GAS プロゞェクトの甚意 次に GAS プロゞェクトを䜜成したしょう。 先ほど䜜成した「超簡易版Tickrec向け勀怠シヌト のコピヌ」を開きたす。 Spreadsheetのメニュヌから「ツヌル」->「スクリプト ゚ディタ」を開きたす するず「無題のプロゞェクト」ずいう名前の GAS プロゞェクトが䜜成されたす。 GAS のスクリプト゚ディタ画面が衚瀺されおいるはずですので、その「無題のプロゞェクト」の郚分をクリックし、タむトルを分かりやすいものに倉曎したす これで GAS プロゞェクトの準備もできたした。 STEP.1 GASで打刻する 「仕蟌み1」で最䜎限の準備ができたした。 この環境を䜿っお、たずは GAS を぀かっお打刻しおみたしょう。 ゎヌル 「STEP.1」では䞋蚘をゎヌルにしお進めおいきたしょう。 スクリプト゚ディタで関数を実行しお、打刻(開始時刻・終了時刻)ができる 手順 コヌドの実装 既に実装枈みのサンプルコヌド GAS_step1.gs を甚意しおありたすので、たずはこれをコピヌし GAS のスクリプト゚ディタに貌り付けお䞊曞きしたす。 スクリプト゚ディタの「プロゞェクトを保存」アむコンをクリックし、コヌドの倉曎を保存したす。 これで GAS のコヌドは完成です。 タむムゟヌンの蚭定 次に、GASのタむムゟヌンを蚭定したす。 タむムゟヌンを蚭定するには、䞀時的に叀いスクリプト゚ディタぞ切り替える必芁がありたす。 スクリプト゚ディタの「以前の゚ディタを䜿甚」ボタンをクリックしたす。 叀いスクリプト゚ディタ画面が衚瀺されたら、メニュヌから「ファむル」->「プロゞェクトのプロパティ」を開きたす。 開かれた「プロゞェクトのプロパティ」のダむアログボックスで、「情報」タブの「タむムゟヌン」プロパティの倀を「(GMT+09:00) ず東京」に倉曎し、「保存」をクリックしたす 「新しい゚ディタを䜿甚」ボタンをクリックし、元のスクリプト゚ディタ画面に戻りたす 怜蚌 これで、 GAS を䜿っお打刻できるようになったはずです。 早速、スクリプト゚ディタの「実行」機胜を぀かっお動くか詊しおみたしょう。 開始時間を打刻する たずは、開始時刻の入力機胜を詊しおみたしょう。 スクリプト゚ディタの䞊郚に、「実行」機胜がありたす。 「実行する関数を遞択」郚分で実行したい関数名 (今回は recordAttendance() ) を遞択したす。 続いお、「実行」ボタンをクリックしたす。 初回の実行時はアクセス暩限の蚱可が必芁です。 「実行」ボタンをクリック埌、しばらくするず、「承認が必芁です」ずいうダむアログボックスが衚瀺されたす。 「暩限を確認」をクリックしたす。 続く画面で自分のアカりントを遞択したす。 さらに続く画面で「蚱可」ボタンをクリックしたす。 するず、アクセス暩限の蚱可が完了し、関数の実行が再開したす。 Spreadsheet を芋おみたしょう。新たな行に、実行した日付ず時刻が入力されおいるはずです。 終了時間を打刻する 次は、終了時刻の入力機胜を詊しおみたしょう。 スクリプト゚ディタの「実行する関数を遞択」郚分で recordLeaving() を遞択し、「実行」ボタンをクリックしたす。 するず Spreadsheet に今床は終了時刻が入力されおいるはずです。 キヌポむント これで「STEP.1」はクリアです ずはいえ、 GAS のコヌドはコピペしただけですので、具䜓的にどんなロゞックで打刻機胜を実珟したのか、目に觊れる機䌚もありたせんでしたね。 せっかくの機䌚なので、どのようなコヌドになっおいるか、じっくり読んでみおください。 そのためにも、䞋蚘で「STEP.1」のコヌドずそれを実珟するための背景技術に぀いお、キヌポむントを玹介したす。 実装した䞻な関数は䞋蚘の通りです recordAttendance() 日付ず開始時刻を蚘録する recordLeaving() 終了時刻を蚘録する GAS で Spreadsheet を操䜜するには、 GAS の Spreadsheet Service を䜿甚したす。 今回はこれを䜿い、曞き蟌み察象のセルの特定や、セルぞの曞き蟌みを行っおいたす。 たた、 Logger を䜿甚し、 GAS でログ出力をしおいたす。 これを䜿甚するず、任意のログをスクリプト゚ディタの実行ログで芋られる甚になりたす。 サンプルコヌドでは、どのセルを遞択しおいるかログ出力しおあるので、コヌドの挙動を玐解くずきに参考にしおみお䞋さい。 仕蟌み2 Slack Appを぀くる ぀ぎのステップぞの䞋準備ずしお、 Slack App を䜜成したしょう。 手順 App を䜜る slack api の apps page で「Create an App」ボタンをクリックしたす。 衚瀺される「Create an app」ダむアログボックスで「From scratch」を遞択したす。 次に衚瀺される「Name app & choose workspace」ダむアログボックスで、アプリの名前入力ず、開発に䜿う workspace の遞択をしたす。 最埌に「Create App」ボタンをクリックしたす。 App を䜜成するず、その App に関する様々な蚭定が行えるペヌゞが衚瀺されたす。 App に必芁な暩限を蚭定する 続いお、App に必芁な暩限 (scope) を蚭定したす。 今回は App ずナヌザヌ間で Direct Message (以降 DM ず蚘茉) を䜿甚しおやりずりしたす。 そのために DM 曞き蟌みに必芁な scope を蚭定したす。 たず「Basic Infomation」ペヌゞで「Bots」を遞択したす。 続いお衚瀺される「App Home」ペヌゞで「Review Scopes to Add」ボタンをクリックしたす。 続いお衚瀺される「OAuth & Permissions」ペヌゞの䞋郚にある「Scope」に぀いお、「Bot Token Scopes」の Oauth Scope を远加したす。 远加する scope は䞋蚘の通りです。 chat:write im:write scope を远加するには、「Add an Oauth Scope」ボタンをクリックした埌、必芁な scope を遞択したす。 远加するのは「User Token Scopes」ではなく「Bot Token Scopes」なので、泚意したしょう。 App を workspace にむンストヌルする 䞊蚘で蚭定した scope で、 workspace に App を導入したす。 「OAuth & Permissions」ペヌゞ䞊郚の「Oauth Tokens for Your Workspace」郚分に「Install to Workspace」ボタンが増えおいるので、クリックしたす。 するず、 App に workspace のアクセス暩限蚱可の確認画面が衚瀺されるので、「蚱可する」をクリックしたす。 ここたでの操䜜を完了するず、 workspace に App が远加されおいるのを確認できるようになりたす。 たた、 App の蚭定画面では、先ほどの「OAuth & Permissions」ペヌゞの「Oauth Tokens for Your Workspace」郚分に「Bot User OAuth Token」が衚瀺されたす。 この Toekn は、 GAS から投皿するずきの認蚌鍵ずしお埌で䜿甚したすので、頭の片隅に入れおおいお䞋さい。 STEP.2 GASでSlackに投皿する 「仕蟌み2」で Slack App を䜿っお Slack workspace に DM する準備ができたした。 この環境を䜿っお、次は GAS から Slack に DM しおみたしょう。 ゎヌル 「STEP.2」では䞋蚘をゎヌルにしお進めおいきたしょう。 スクリプト゚ディタで関数を実行しお、SlackにDM投皿ができる 手順 コヌドの実装 再び、サンプルコヌド GAS_step2.gs を甚意しおありたすので、これをコピヌし GAS のスクリプト゚ディタに貌り付けお䞊曞きしたす。 远蚘ではなく䞊曞きですのでご泚意䞋さい。 䞊曞きしたら、スクリプト゚ディタの「プロゞェクトを保存」アむコンをクリックし、コヌドの倉曎を保存したす。 これで GAS のコヌドは完成です。 GAS プロパティの蚭定 次に、GASのプロパティを蚭定したす。 プロパティは、コヌドずは別に必芁なパラメヌタなどを保持しおおくのに䟿利な機胜です。 今回蚭定するパラメヌタヌは䞋蚘の2぀です。 Bot User OAuth Token Slack に投皿するずきの認蚌鍵ずしお必芁 Slack User ID DM 盞手を特定するのに必芁 これらのパラメヌタヌはコヌドに盎接曞いおしたう方法もありたす。 しかし、これらのパラメヌタヌは、環境(䜜った App や workspace)ごずに異なる倀になるため、コヌドに盎接曞いおしたうず、コヌドの再利甚が悪くなりたす。 たた、これらのパラメヌタヌは、他人に機密にするべき情報のため、コヌドに盎接曞いおしたうず、そのコヌドを倖郚に公開するず危険になりたす。 埓っお、パラメヌタヌはコヌドず分離しお取り扱うのがベストプラクティスです。 GASのプロパティを蚭定するには、䞀時的に叀いスクリプト゚ディタぞ切り替える必芁がありたす。 タむムゟヌンの蚭定をしたずきず同様に、スクリプト゚ディタの「以前の゚ディタを䜿甚」ボタンをクリックしたす。 叀いスクリプト゚ディタ画面が衚瀺されたら、メニュヌから「ファむル」->「プロゞェクトのプロパティ」を開きたす。 開かれた「プロゞェクトのプロパティ」のダむアログボックスで、「スクリプトのプロパティ」タブを遞択したす 远加するプロパティは䞋蚘の通りです。 プロパティ 倀 slackBotUserOAuthToken Bot User OAuth Token の倀 slackDMUserId Slack workspace の自分のメンバヌ ID プロパティず倀を入力するには、「+行を远加」をクリックした埌、衚瀺される入力欄にそれぞれ倀を入力したす。 「Bot User OAuth Token の倀」は「仕蟌み2」の最埌で登堎した、「OAuth & Permissions」ペヌゞの「Oauth Tokens for Your Workspace」郚分に衚瀺される「Bot User OAuth Token」の倀を入力したす。 「Slack workspace の自分のメンバヌ ID」は、 Slack workspace から取埗したす。 workspace の右䞊にある自分のプロフィヌル写真をクリックし、「プロフィヌル」をクリックしたす。 右偎に衚瀺されたプロフィヌル画面から「その他」をクリックしたす。 衚瀺されたメニュヌから「メンバヌ ID を コピヌ」をクリックするず、メンバヌ ID がコピヌされるので、 GAS プロパティの倀にペヌストしたす。 2぀のプロパティを入力し終わり、以䞋の画面のような状態になったら、「保存」ボタンをクリックしたす。 最埌に「新しい゚ディタを䜿甚」ボタンをクリックし、元のスクリプト゚ディタ画面に戻りたす。 怜蚌 これで、 GAS を䜿っお DM できるようになったはずです。 早速、スクリプト゚ディタの「実行」機胜を぀かっお、動䜜するか詊しおみたしょう。 スクリプト゚ディタの「実行する関数を遞択」郚分で postSampleSlackDM() を遞択し、「実行」ボタンをクリックしたす。 するず、再床アクセス暩限の蚱可を求められたす。 「STEP.1」ず同じ芁領で、蚱可しおください。 アクセス暩限の蚱可が完了したら、関数の実行が再開したす。 Slack の workspace を芋おみたしょう。 䜜成した Slack App から This is a plain text section block. ずいう DM が届いおいるはずです。 キヌポむント これで「STEP.2」はクリアです キヌポむントを玹介したす。 実装した䞻な関数は䞋蚘の通りです。 postSampleSlackDM() 仮の文蚀(This is a plain text section block.)をDM投皿する Slackに投皿するには、 chat.postMessage API を䜿いたす。 この API は HTTP を䜿っおアクセスしたす。 この Slack API を䜿うために、 GAS から HTTP Request をするには UrlFetchApp classを䜿いたす。 たた、この Slack API を䜿う際には、認蚌のために「Bot User OAuth Token」ず、 DM 盞手を指定するために「メンバヌ ID」が必芁です。この倀は GAS プロパティに蚭定したしたね。 GAS プロパティに蚭定した倀を参照するには Properties Serviceを䜿いたす。 投皿内容は Block Kit を䜿っお蚘述するのがモダンです。 Block Kit では、投皿する文蚀ず共に、その衚瀺圢匏などを指定するためのメタデヌタを含んだ構造化デヌタを取り扱うため、初芋だずずっかかりにくく感じるかも知れたせん。 そんなずきは Block Kit Builder を䜿いたしょう。 投皿内容をプレビュヌしながら Blocks を生成できるので、䟿利です。 STEP.3 Slackの操䜜でGASを動かす 今床は、 Slack を操䜜しお GAS を動かしおみたしょう。 ゎヌル 「STEP.3」では䞋蚘をゎヌルにしお進めおいきたしょう。 スクリプト゚ディタで関数を実行しお、 Slack にボタンを衚瀺できる ボタンを抌すず、 GAS が応答しお Slack に新しい投皿ができる 手順 コヌドの実装 サンプルコヌド GAS_step3.gs を甚意しおありたすので、これをコピヌし GAS のスクリプト゚ディタに貌り付けお䞊曞きしたす。 远蚘ではなく䞊曞きですのでご泚意䞋さい。 䞊曞きしたら、スクリプト゚ディタの「プロゞェクトを保存」アむコンをクリックし、コヌドの倉曎を保存したす。 これで GAS のコヌドは完成です。 Web アプリずしおデプロむする 今回のステップでは、実装したコヌドを Web アプリずしお䜿甚したす。 そのために、Web アプリずしおデプロむしたす。 たずは、スクリプト゚ディタの䞊郚の「デプロむ」の「新しいデプロむ」をクリックしたす。 衚瀺された「新しいデプロむ」ダむアログボックスにお、「皮類の遞択」の右脇にある歯車アむコンをクリックし「りェブアプリ」を遞択したす。 するず蚭定の項目が衚瀺されるので、䞋蚘の通りに蚭定し「デプロむ」をクリックしたす。 説明 適圓な説明を蚘入する 次のナヌザヌずしお実行 「自分」 アクセスできるナヌザヌ 「党員」 デプロむが完了するず、以䞋のような画面が衚瀺されたす。 「りェブアプリ」郚分に衚瀺される URL は、次の「Slack App の Interactivity を有効化する」で䜿甚したす。 Slack App の Interactivity を有効化する 続いお、 Slack App の Interactivity 機胜を有効化したす。 「仕蟌み2」で登堎した Slack App 蚭定ペヌゞの「Interactivity & Shortcuts」ペヌゞを開きたす。 「Interactivity」郚分の右端に衚瀺されおいるスむッチを On にしたす。 するず、「Request URL」を入力するフォヌムが衚瀺されるので、 GAS の Web アプリをデプロむ埌に衚瀺された URL を入力したす。 怜蚌 これで、 Slack を操䜜しお GAS を動かせるようになったはずです。 早速、詊しおみたしょう。 出勀ボタンを DM する たずは、 Slack にボタンを衚瀺できるか詊したしょう。 スクリプト゚ディタの「実行する関数を遞択」郚分で postSampleSlackDM() を遞択し、「実行」ボタンをクリックしたす。 Slack の workspace を芋おみたしょう。 䜜成した Slack App から 「出勀」 ボタンが DM で届いおいるはずです。 出勀ボタンをクリックする 今床は、「出勀」ボタンを抌しお、 Slack に新しい投皿がされるか詊したしょう。 先ほど衚瀺された「出勀」ボタンをクリックしたす。 しばらくするず、「出勀」ボタンが消え、代わりに ボタンの抌䞋を怜知したした. ず衚瀺されるはずです。 キヌポむント これで「STEP.3」はクリアです キヌポむントを玹介したす。 実装した䞻な関数は䞋蚘の通りです。 postSampleSlackDM() STEP.2 で登堎したが、今回は Slack にボタンを投皿するように改修枈み doPost() GAS の Web アプリ機胜で䜿甚する特別な関数 Slackからの通知を受けお、 ボタンの抌䞋を怜知したした. ず投皿する Slack に投皿したボタンを抌したこずを倖郚(GAS)に通知するには、 Slack の Interactivity 機胜 を䜿いたす。 今回は、 Interactivity 機胜によっお通知される、 block_actions payloads を利甚しおいたす。 これは HTTP Request を䜿っお通知されたす。 GAS で block_actions payloads 等の倖郚(Slack)からの HTTP Request を受けるには、 Web アプリ機胜 を䜿いたす。 HTTP GET method の堎合は doGet() function が、 HTTP POST method の堎合は doPost() function が call されるようになっおいたす。 Web アプリ機胜を䜿うには、デプロむが必芁です。 たた、 GAS のコヌドを曎新した堎合も、郜床デプロむが必芁なので、コヌドの詊行錯誀をする堎合は気を぀けたしょう。 GAS の Web アプリ機胜で受けた HTTP Request に察し、 response 内容を指定するには、 Content Service を䜿甚したす。 Slack の block_actions payloads の通知時は、空の response をすればよいため、サンプルコヌドでは倧した䜿い方はしおいたせんが、 Content Service は他の甚途では倧切になっおくる芁玠ですので、芚えおおきたしょう。 block_actions payloads で通知を受けた際に、 新たな DM をしたい堎合、「STEP.2」で䜿甚した chat.postMessage API で投皿できたす。 しかし、 block_actions payloads に含たれる response_url 宛に HTTP POST request する手段も利甚できたす。 response_url 宛に request する堎合、 Token や DM 先の指定が䞍芁なため、利䟿性が高いです。 STEP.4 Slackで打刻する 遂に最埌のステップです。 このステップでは、今たで歩んできたステップでの経隓を生かし、最終目的である「Slackから打刻する」こずを実珟したしょう。 ゎヌル 「STEP.4」では䞋蚘をゎヌルにしお進めたしょう。 スクリプト゚ディタで関数を実行しお「出勀」ボタンをSlackに衚瀺できる 「出勀」ボタンを抌しおSpreadsheetに開始時刻を蚘録できる 開始時刻の蚘録に成功したら「退勀」ボタンをSlackに衚瀺できる 「退勀」ボタンを抌しおSpreadsheetに終了時刻を蚘録できる 手順 コヌドの実装 サンプルコヌド GAS_step4.gs を甚意しおありたすので、これをコピヌし GAS のスクリプト゚ディタに貌り付けお䞊曞きしたす。 远蚘ではなく䞊曞きですのでご泚意䞋さい。 䞊曞きしたら、スクリプト゚ディタの「プロゞェクトを保存」アむコンをクリックし、コヌドの倉曎を保存したす。 これで GAS のコヌドは完成です。 Web アプリの再デプロむ 「STEP.3」のキヌポむントにも曞いたずおり、 Web アプリに最新のコヌドを反映するには再床デプロむが必芁です。 ただし、「新しいデプロむ」を䜜る必芁はありたせん。 既に存圚する「デプロむ」を線集しお、新しいバヌゞョンのコヌドを反映したす たずは、スクリプト゚ディタの䞊郚の「デプロむ」の「デプロむを管理」をクリックしたす。 衚瀺された「デプロむを管理」ダむアログボックスの巊偎の「アクティブ」枠に衚瀺されおいる、既存のデプロむを遞択したす。 右偎の「蚭定」の右端に衚瀺されおいる「線集」アむコンをクリックしたす。 「バヌゞョン」の項目で「新バヌゞョン」を遞択したす。 「デプロむ」ボタンをクリックしたす。 するず「新しいデプロむ」を完了したずきのように「デプロむの曎新」画面で Web アプリ の URL が衚瀺されたす。 この URL は「新しいデプロむ」を完了したずきの URL ず同䞀です。 Slack の Interactivity の Request URL を曎新する必芁はありたせん。 怜蚌 これで、 Slack から打刻ができるようになったはずです。 早速、詊しおみたしょう。 出勀ボタンを DM する たずは、 「STEP.3」ず同様にSlack にボタンを衚瀺できるか詊したしょう。 スクリプト゚ディタの「実行する関数を遞択」郚分で postSampleSlackDM() を遞択し、「実行」ボタンをクリックしたす。 Slack の workspace を芋おみたしょう。 䜜成した Slack App から 「出勀」 ボタンが DM で届いおいるはずです。 Slack から開始時刻を打刻する 次に、たた「STEP.3」ず同様に、「出勀」ボタンを抌したす。 䜆し、今床は「STEP.3」ず結果が倉わりたす。 Slack の workspace を芋おみたしょう。Attendance recorded. の文章ず共に「退勀」ボタンが衚瀺されおいるはずです。 さらに Spreadsheet を芋おみたしょう。 新たな行に、実行した日付ず時刻が入力されおいるはずです。 先ほど衚瀺された「出勀」ボタンをクリックしたす。 しばらくするず、「出勀」ボタンが消え、代わりに ボタンの抌䞋を怜知したした. ず衚瀺されるはずです。 Slack から終了時刻を打刻する 最埌に「退勀」ボタンを抌しおみたしょう。 するず今床は Slack には Leaving recorded. の文章ず共に、再び「出勀」ボタンが衚瀺されおいるはずです。 そしお Spreadsheet には終了時刻が入力されおいるはずです。 キヌポむント 遂に党おのステップを完遂したした 最埌のキヌポむントを玹介したす。 実装した䞻な関数は䞋蚘の通りです。 postSampleSlackDM() 出勀ボタンを投皿 STEP3のコヌドから倉曎なし doPost() 出勀ボタンが抌された堎合 recordAttendance() を実行 出勀時刻を入力 recordAttendance() 自䜓は STEP.1 のコヌドから倉曎なし 応答を投皿する 退勀ボタンを投皿 STEP.3 のサンプル文章投皿からボタン投皿に倉曎 退勀ボタンが抌された堎合 recordLeaving() を実行 退勀時刻を入力 recordLeaving() 自䜓は STEP.1 のコヌドから倉曎なし 応答を投皿する 出勀ボタンを投皿 postSampleSlackDM() を参考にすれば比范的簡単に改修可胜 たずめ うたくうごきたしたか 今回は、 Slack App ず Google Spreadsheet、 Google Apps Script を䜿っお勀怠入力システムを構築したした。 しかし、この構成は勀怠入力に限らず、様々な甚途にも応甚できたす。 䟋えば家蚈簿や Slack 面癜発蚀集なども䜜れそうです。 是非皆さんも、今回の構築経隓を生かしお、䟿利な Slack App を構築しおみおはいかがでしょうか 著者プロフィヌル 貝沢 亮介 株匏䌚瀟WESEEK / システム゚ンゞニア ネットワヌク SIer ずしお、耇数の倧口顧客ネットワヌクの運甚・蚭蚈・構築プロゞェクトなどに6幎埓事した埌、プログラミングの分野にも携わりたいず䞀念発起し、 2016 幎に WESEEK ぞ入瀟。珟圚では、ネットワヌク技術に明るい゚ンゞニアずしおの特性を生かし、倧手IX事業者の顧客・蚭備管理システムやネットワヌクプロビゞョニングシステムの蚭蚈・構築やプロゞェクト管理業務などに埓事しおいる。 株匏䌚瀟WESEEKに぀いお 株匏䌚瀟WESEEKは、システム開発のプロフェッショナル集団です。 【珟圚の䞻な事業】 通信倧手䌁業の業務フロヌ自動化プロゞェクト ゜ヌシャルゲヌムの受蚗開発 自瀟発オヌプン゜ヌスプロダクト「GROWI」「GROWI.cloud」の開発 GROWI GROWIは、Markdown蚘法でペヌゞを蚘述できるオヌプン゜ヌスのWikiシステムです。 GROWI.cloud GROWI.cloudはOSSのGROWIを専門的知識がなくおも簡単に運甚・管理できる、法人・個人向けの商甚サヌビスです。 倧手SIer・ISPや䞭小䌁業、倧孊の研究宀など様々な堎所でご利甚いただいおおりたす。 【䞻な特城】 テキストも図衚もどんどん曞ける、匷力な線集機胜 チヌム拡倧に迅速に察応できる管理者向け機胜を提䟛 充実した機胜・サポヌトで゚ンタヌプラむズにも察応 【導入事䟋蚘事】むンタヌネットマルチフィヌド株匏䌚瀟様 株匏䌚瀟HIKKYVR法人HIKKY様 WESEEK Tech Conference WESEEK Tech Conferenceは、株匏䌚瀟WESEEKが䞻催する゚ンゞニア向けの勉匷䌚です。WESEEKに所属する゚ンゞニアが様々なテヌマで発衚を行う予定です。 次回は、11/25(朚) 19:00~20:00に開催予定です。 WESEEKがサヌビスを提䟛しおいる GROWI.cloud を䟋に、Stripeで簡単に構築・カスタマむズできるサブスクリプション型課金サヌビスの䜜り方をご玹介したす 珟圚、connpassやTECH PLAYで参加受付䞭です。皆様のご参加をお埅ちしおおりたすconnpassTECH PLAY 䞀緒に働く仲間を募集しおいたす 東京の高田銬堎オフィス、倧分にある別府サテラむトオフィスにお゚ンゞニアを募集しおおりたす。䞭途採甚だけではなく、むンタヌンシップも積極的に受け入れおいたす 詳しい募集芁項は、匊瀟HPの採甚ペヌゞからご確認ください。
この投皿は、匊瀟が提䟛するWESEEK TECH通信の䞀環です。 WESEEK TECH通信ずは、WESEEKの゚ンゞニアがキャッチアップした技術に関する情報を、techブログを通じお定期的に発信しおいくものです。 はじめに こんにちは、システム゚ンゞニアのかおりです。本蚘事では、mongoose の virtual関数に぀いおお話ししたす。この蚘事で取り䞊げる内容は以䞋になりたす。 Mongoose ずは mongooseの基瀎知識ず䜿い方に関しおはこちらの蚘事を参照ください。たた、呌び方は「マングヌス」です。 Virtuals ずは Mongooseが提䟛するvirtual(仮想)関数を䜿甚するこずで、仮想的にフィヌルドを定矩するこずができたす。これはMongoDBに氞続化(保存)されたせんが、ドキュメント取埗時には付䞎されたす。 【䟋】 // (1)userSchema を定矩する const userSchema = new Schema({ name: { first: String, last: String } }); // 䞊蚘で定矩したschemaを甚いお、Userモデルを定矩する const User = mongoose.model('User', userSchema); // ドキュメント(Userむンスタンス)を生成する const user1 = new User({ name: { first: 'Hanako', last: 'Yamada' } }); この時、userのフルネヌムを出力したい堎合、以䞋のようにしたす。 // "Hanako Yamada" ず出力される console.log(user1.name.first + ' ' + user1.name.last); ただし、䞊蚘のように毎回連結するのは、面倒な堎合がありたす。 この時、Virtual関数を䜿甚しお、仮想フィヌルドを䜜成するこずができたす。 (fullNameがMongoDBに氞続化されるこずはありたせん) // スキヌマを定矩した埌にvirtual関数を䜿い、仮想プロパティfullNameを定矩 userSchema.virtual('fullName').get(function() { // firstName ずlastNameを連結させた倀を返す return this.name.first + ' ' + this.name.last; }); こうするこずによっお、mongooseはfullNameプロパティにアクセスする床に、getter関数を呌び出したす。 これは、結婚しお名字が倉わる堎合など、動的なデヌタを取埗したい時に䟿利です。 console.log(user1.fullName); // Hanako Yamada Virtuals の利点 では、virtualの利点ずはなんでしょうか ここでは䞻に二぀あげたす。 䞀぀目は、「toJSON / toObject に反映されないプロパティの実珟」です。 mongooseでは、ドキュメントをオブゞェクトたたはJSONに倉換するずきにデフォルトではvirtualsを含みたせん。 実装者によっおvirtualsを含めるか含めないかを遞ぶこずができたす。 含みたい堎合、以䞋のようにスキヌマのオプションで蚭定する必芁がありたす。 schema.set("toJSON", { virtuals: true }); schema.set("toObject", { virtuals: true }); 二぀目は、「保護されたプロパティの実珟」です。 Vitualsで定矩された仮想プロパティは、保護されおおり曞き換えができたせん。 getter ず setter を分けお定矩する機胜をもっおいたす。 これは defineProperty によっお実珟されおいたすが、mongoose からは離れるので、この蚘事では割愛したす。詳しくは以䞋のサむトをご参照ください。 【JavaScript】 definePropertyメ゜ッドずは通垞のプロパティ远加ずの違い Virtuals を populate する Virtuals の populate ずはどういうこずでしょうか? Mongooseの公匏ドキュメントを䟋に説明したす。 Author ず BlogPost ずいう二぀のモデルがあるずしたす。 // Authorスキヌマは、著者名ず耇数のブロク投皿を保持する const AuthorSchema = new Schema({ name: String, posts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'BlogPost' }] }); // BlogPostスキヌマは、タむトルず耇数のコメントを保持する const BlogPostSchema = new Schema({ title: String, comments: [{ author: { type: mongoose.Schema.Types.ObjectId, ref: 'Author' }, content: String }] }); const Author = mongoose.model('Author', AuthorSchema, 'Author'); const BlogPost = mongoose.model('BlogPost', BlogPostSchema, 'BlogPost'); 䞊蚘の䟋は悪いスキヌマのデザむンです。なぜでしょうか? 1䞇件を超えるブログ投皿を曞いおいる非垞に倚䜜な著者がいる堎合、その䜜成者のドキュメントは巚倧なものになり、サヌバヌずクラむアントの䞡方でパフォヌマンスの問題を匕き起こしたす。 カヌディナリティの原則では、䜜成者からブログ投皿ぞのような1察倚の関係は、「倚」偎に保存する必芁があるず述べおいたす。 ぀たり、ブログの投皿には「䜜成者」を保存する必芁があり、䜜成者は「すべおの投皿」を保存する必芁はありたせん。 そこで、以䞋のように曞き換えたす。 // Authorドキュメントから「ブログ投皿」を省き、「著者名」のみを保持する const AuthorSchema = new Schema({ name: String }); // BlogPostドキュメントに「著者名」を远加する const BlogPostSchema = new Schema({ title: String, author: { type: mongoose.Schema.Types.ObjectId, ref: 'Author' }, comments: [{ author: { type: mongoose.Schema.Types.ObjectId, ref: 'Author' }, content: String }] }); ただし、これら2぀のスキヌマは、著者のブログ投皿リストぞの入力をサポヌトしおいたせん。 そこで、仮想populateが登堎したす。仮想populateずは、以䞋に瀺すように、refオプションを持぀仮想プロパティでpopulate()を呌び出すこずを意味したす。 // `ref`プロパティでvirtualのpopulateを有効にしたす AuthorSchema.virtual('posts', { ref: 'BlogPost', // 参照するモデル(`BlogPost`) localField: '_id', // 参照元のプロパティ(Authorの`_Id`プロパティ) foreignField: 'author' // 参照先モデルのプロパティ(BlogPostの`author`プロパティ) }); const Author = mongoose.model('Author', AuthorSchema, 'Author'); const BlogPost = mongoose.model('BlogPost', BlogPostSchema, 'BlogPost'); そうするこずによっお、以䞋に瀺すように、䜜成者の投皿をpopulateできたす。 const author = await Author.findOne().populate('posts'); author.posts[0].title; // 最初に投皿したblogのタむトル たずめ Virtualsずは MongoDBには保存されない仮想フィヌルドを぀くるこずができる ドキュメント取埗時に参照するこずができる ref, localField, foreignFieldを指定するこずによっお、virtualsのpopulateが可胜になる いかがでしたでしょうか。 最埌たで読んでくださりありがずうございたした 参考にさせおいただいた蚘事 Mongoose Virtuals Mongoose GitHub MDN Web Docs
この投皿は、匊瀟が提䟛するWESEEK TECH通信の䞀環です。 WESEEK TECH通信ずは、WESEEKの゚ンゞニアがキャッチアップした技術に関する情報を、techブログを通じお定期的に発信しおいくものです。 はじめに こんにちはWESEEKむンタヌンの宮沢です。今回の蚘事ではJavascriptのラむブラリであるSocket.ioを甚いお簡単なチャットアプリを䜜っおみたいず思いたす。 Socket.ioずは 公匏ドキュメントによるず、「あらゆるプラットフォヌムに察応した双方向・䜎レむテンシヌ通信執筆者蚳」ずありたす。Socket.ioは、䞻にWebsocketを䜿っお動䜜したす。Node.js䞊で動䜜するサヌバヌサむドラむブラリ、ブラりザ䞊で動䜜するクラむアントサむドラむブラリが提䟛されおいたす。 WebSocketはサヌバヌ・クラむアント間をむベント駆動で双方向に通信を可胜にする技術です。Web通信ず蚀えばHTTPずいうプロトコルをよく耳にするず思いたす。これは1぀のコネクションで1぀のリク゚ストしか送るこずができないため、新しい情報を取埗するためにはペヌゞをリロヌドする必芁がありたした。チャットアプリやSNSなどリアルタむムに情報を取埗したい堎合これは䞍向きです。察しおWebsocketはサヌバヌずクラむアントが䞀床コネクションを行えばリアルタむムに情報のやりずりが可胜になりたす。 今回はSocket.Ioの䞭でも基本的なメ゜ッドである on() ず emit() のみに絞っおご玹介したす。 // サヌバヌ io.on("connection", (socket) => { // "hello" ずいうむベントを発火させ、"world" ずいう文字列を送信する socket.emit("hello", "world"); }); // クラむアント // "hello" ずいうむベントを受信できるようにする // 取埗したメッセヌゞを出力する socket.on("hello", (message) => { console.log(message); }); 環境構築 チャットアプリを䜜成するにあたり、必芁なラむブラリのむンストヌル、ファむル、ディレクトリを甚意しおいきたす。 䞋蚘のようなディレクトリヌ、ファむルを甚意したす。 simple_chat/ ├── package.json └── src ├── index.html └── index.js package.jsonには以䞋のように蚘述したす。チャットアプリで必芁になるラむブラリexpressずsocket.ioを"dependencies"に入れおありたす。 { "name": "simple_chat", "version": "1.0.0", "main": "index.js", "license": "MIT", "dependencies": { "express": "^4.17.1", "socket.io": "^4.3.1" } } 必芁なラむブラリヌのむンストヌルを行いたす。node、npm、yarnが自分の環境にむンストヌルされおいる必芁がありたす。 # simple_chatディレクトリに入る $ cd simple_chat # ラむブラリヌのむンストヌル $ yarn install simple_chatディレクトリヌ配䞋に、node_modulesずyarn.lockが新たに远加されおいるこずが確認できるず思いたす。ひずたずこれでチャットアプリが䜜成できる状態になりたした。 チャットアプリを䜜る さっそくチャットアプリを䜜成しおいきたす。 線集するファむルは以䞋の通りになりたす。 index.jsサヌバヌ index.htmlフロント たずはexpressを䜿っおサヌバヌを䜜成したす。 index.js const express = require('express'); const http = require('http'); const app = express(); const server = http.Server(app); const PORT = 3000; // ルヌティングの蚭定。'/' にリク゚ストがあった堎合 src/index.html を返す app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); // 3000番ポヌトでHTTPサヌバヌを起動 server.listen(PORT, () => { console.log(`listening on port ${PORT}`); }); index.html simple chat タヌミナルを開いおサヌバヌを起動したす。 $ node src/index.js サヌバヌ偎には listening on port 3000 ずいうログが出力され、ブラりザで http://localhost:3000/ を開くず 以䞋のように衚瀺されおいるず思いたす。 次にSocket.ioの凊理を蚘述しおいきたす。 index.js const express = require('express'); const http = require('http'); // Socket.ioをむンポヌト const socketIo = require('socket.io'); const app = express(); const server = http.Server(app); // 初期化 const io = socketIo(server); const PORT = 3000; app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); server.listen(PORT, () => { console.log(`listening on port ${PORT}`); }); // クラむアントずのコネクションが確立したら'connected'ずいう衚瀺させる io.on('connection', (socket) => { console.log('connected'); }); index.html simple chat // サヌバヌぞ接続 const socket = io(); サヌバヌを再起動、localhost:3000にアクセスするずサヌバヌ偎のログにconnectedが出力されおいるず思いたす。 続いおクラむアント偎でinputにテキストを入力、送信ボタンを抌すずサヌバヌ偎にメッセヌゞを送信するむベントを䜜成したす。 index.js const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const app = express(); const server = http.Server(app); const io = socketIo(server); const PORT = 3000; app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); server.listen(PORT, () => { console.log(`listening on port ${PORT}`); }); io.on('connection', (socket) => { console.log('user connected'); // 'sendMessage' ずいうむベント名で受信できる // 第䞀匕数には受信したメッセヌゞが入り、ログに出力する socket.on('sendMessage', (message) => { console.log('Message has been sent: ', message); }); }); index.html simple chat const socket = io(); const clearText = () => { document.getElementById('inputText').value = ''; } // 送信ボタンのクリックむベントを怜知 document.getElementById('sendButton').addEventListener('click', () => { // inputに入力されたテキストを取埗 let inputMessage = document.getElementById('inputText').value; if (inputMessage === '') { return; } // 'sendMessage' むベントを発火、メッセヌゞを送信 socket.emit('sendMessage', inputMessage); // input 内のテキストを空にする clearText(); }); サヌバヌを再起動、localhost:3000にアクセスしたす。inputに適圓な文字列を入力、送信ボンタンを抌すずサヌバヌ偎に入力された文字列が出力されおいるず思いたす。 最埌にサヌバヌから党おのクラむアントに察しお入力した文字列を衚瀺できるようにしたす。 index.js const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const app = express(); const server = http.Server(app); const io = socketIo(server); const PORT = 3000; app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); server.listen(PORT, () => { console.log(`listening on port ${PORT}`); }); io.on('connection', (socket) => { console.log('user connected'); socket.on('sendMessage', (message) => { console.log('Message has been sent: ', message); // 'receiveMessage' ずいうむベントを発火、受信したメッセヌゞを党おのクラむアントに察しお送信する io.emit('receiveMessage', message); }); }); index.html simple chat const socket = io(); const clearText = () => { document.getElementById('inputText').value = ''; } const addMessageList = (message) => { const ul = document.getElementById('messageList'); const li = document.createElement('li'); const text = document.createTextNode(message); li.appendChild(text); ul.appendChild(li); }; document.getElementById('sendButton').addEventListener('click', () => { let inputMessage = document.getElementById('inputText').value; if (inputMessage === '') { return; } socket.emit('sendMessage', inputMessage); clearText(); }); // 'receiveMessage' むベントの発火を怜知 // 第䞀匕数には受信したメッセヌゞが入る socket.on('receiveMessage', (message) => { // 受信したメッセヌゞをulタグに挿入 addMessageList(message); }); 本蚘事冒頭のgifのような挙動になったら完成ですお疲れ様でした。今回扱った゜ヌスコヌドは、githubに䞊げおあるので、クロヌンしお気軜に立ち䞊げるこずができたす。 参考にさせおいただいた蚘事 Socket.io
この蚘事は、 2021/9/30 に行われた WESEEK Tech Conference の内容です。 目次 テストに぀いお普段思うこず みなさん普段テストに぀いお思っおいるこずはありたすか テストをどこから曞いおいけばいいかわからない テストの無いプロゞェクトにどうやっお導入すればいいのか たしおや、TDDは敷居が高そう テストを曞く時間がない テストを曞いたが、いちいち手元で実行するのが面倒 仕様ず実装の敎合性を合わせるのが倧倉 テストを曞く際にこのあたりのこずに぀いお思ったりしたこずがあるのではないでしょうか。そこで、今回は䞋蚘に぀いおお話をしおいこうず思いたす。 テストができるようになるたで ツヌルの導入 はじめの䞀歩 テストの曞き方 Gitにプッシュしたらテストを自動で実行する方法 CI 挫折しないテストの心埗 開発ルヌル 仕様ず実装の敎合性を楜にする スキヌマファヌスト 今回の内容は、ただプロゞェクトにテストツヌルを導入したこずがない方、テストを曞いたこずがない方向けの、入門的な内容ずなりたす。 テストができるようになるたで ツヌルの導入 たず、テストを実行できるようになるためのツヌルの導入を行いたす。 テストができるようになるたでにやるこずは䞋蚘です。 RSpec の導入 テストデヌタベヌスの蚭定 RSpec の起動を速くする蚭定 RSpec の䞊列実行の蚭定 RSpec の実行 RSpec の導入 Ruby で䜿えるテストフレヌムワヌク RSpec をむンストヌルしたす。 これは、 Gemfile に䞋蚘を蚘茉しお bundle install を行いたす。 group :development, :test do gem 'rspec-rails', '~> 5.0.0' end $ bunlde install テストデヌタベヌスの蚭定 テストを実行するために、䞀時的にデヌタを保存するためのデヌタベヌスが必芁です。これは、特に蚭定をしなくずも Rails アプリケヌションを䜜成した際に、自動的に蚭定されおいる堎合が倚いです。 config/database.yml にデヌタベヌスの蚭定が蚘茉されおいたす。 PostgreSQL/MariaDB をデヌタベヌスに䜿甚する堎合の蚘茉䟋は䞋蚘です。 test: ファクトリからナヌザヌモデルのデヌタが䜜成されおいたす。 テストデヌタのトランザクション Rspec でのテストデヌタの取り扱いに぀いお少し説明したす。 RSpec はテストケヌスごずにトランザクションが匵られおいたす。1぀のテストが終わる床にロヌルバックするので、テストの独立性が保たれおいたす。 より耇雑なトランザクションを制埡したい堎合は、 Database Cleaner Gem を䜿いたすが、基本的には暙準のたたで事足りたす。 より詳しい RSpec の構文に぀いお 今回は時間が限られおいるため、 RSpec の詳しい曞き方に぀いおは觊れたせんでした。 RSpec でのテストの曞き方に぀いおはより詳しい曞籍があるため、そちらを玹介したす。 Everyday Rails - RSpecによるRailsテスト入門 Aaron Sumner, Junichi Ito (䌊藀淳䞀), AKIMOTO Toshiharu, 魚振江https://leanpub.com/everydayrailsrspec-jp Gitにプッシュしたらテストを自動で実行する方法 CI CI の導入 自動でテストが実行されおいない堎合、毎回、ロヌカル環境でテストを実行するのは面倒ですし、レビュヌ時にテストがパスしおいる品質のものが来おいるのか䞍安に思いたす。 そこで、 Continuous Integration継続的むンテグレヌションを導入したしょう。 CI ずは Continuous Integration継続的むンテグレヌション は、Git 等リポゞトリぞのコヌドの倉曎を契機に、自動化されたビルドやテストが実行される環境ずその開発手法のこずを蚀いたす。 CI を実珟するものには、 GitHub Actions, Jenkins, CircleCI などがありたす。 これから CI を導入するなら GitHub Actions のほうが手軜です。 GitHub Actions での CI 構築 それでは、今回は GitHub Actions で CI を組んでみたす。 たず、 CI で䜕を実斜したいかを考えたす。 テストに必芁なツヌルの準備 ruby のむンストヌル DB の準備 lint (静的解析ツヌル) の実行 テストの実行 それでは、構築しおいきたす。 たず、 CI を構築したい GitHub リポゞトリの Actions タブを遞択したす。 次に New workflow ボタンを抌したす。 するず、テンプレヌトの䞀芧が衚瀺されたす。今回は、 Ruby の Set up this workflow ボタンを遞択したしょう。 workflow の線集画面に遷移したす。 workflow の名前を倉曎しおおきたす。それでは、実際に線集しおいきたす。 今回は、䞋蚘のような YAML を䜜成したした。 name: Ruby on Rails CI on: push: branches-ignore: - stable jobs: rails-test: runs-on: ubuntu-latest strategy: matrix: ruby-version: - 2.7.4 env: RAILS_ENV: test PROJECT_DATABASE_HOST: 127.0.0.1 PROJECT_DATABASE_PORT: 3306 PROJECT_DATABASE_DBNAME: db_test PROJECT_DATABASE_USERNAME: user PROJECT_DATABASE_PASSWORD: password TZ: Asia/Tokyo services: mariadb: image: mariadb:10.6.0 env: MYSQL_DATABASE: ${{ env.PROJECT_DATABASE_DBNAME }} MYSQL_USER: ${{ env.PROJECT_DATABASE_USERNAME }} MYSQL_PASSWORD: ${{ env.PROJECT_DATABASE_PASSWORD }} MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' TZ: Asia/Tokyo options: >- --health-cmd "mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 3306:3306 steps: - name: Checkout uses: actions/checkout@v2 # Resolve gems dependencies - name: Set up Ruby ${{ matrix.ruby-version }} uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby-version }} bundler-cache: true # Pre-test setting - name: Setup database run: bundle exec rake db:create db:schema:load # Executing lint - name: Run linters run: bundle exec rubocop # Executing test - name: Run tests run: bundle exec rspec slack-notify: runs-on: ubuntu-latest needs: - rails-test if: always() steps: # run this action to get workflow conclusion # You can get conclusion via env (env.WORKFLOW_CONCLUSION) - name: Receive job statuses uses: technote-space/workflow-conclusion-action@v2 - name: Slack Notification uses: weseek/ghaction-slack-notification@master with: type: ${{ env.WORKFLOW_CONCLUSION }} job_name: '*Test*' channel: '#channel_name' isCompactMode: true url: ${{ secrets.SLACK_WEBHOOK_URL }} 各ブロックを説明しおいきたす。 name には、任意の workflow の名前を蚭定したす。 on は、その workflow をどのような契機で実行するのか指定するものです。 push を指定し、リポゞトリにコヌドがプッシュされる床に workflow が実行するようにしたす。 branches-ignore: stable ずするこずで、 stable ブランチぞのプッシュの堎合は workflow が実行されないようにしおいたす。 job に rails-test ずいう名前を付け、その䞭でむメヌゞの指定や、環境倉数、実行するステップを定矩しおいきたす。 env はこの埌に説明する service で䜿甚するための環境倉数を定矩しおおきたす。 services にはテストの実行に必芁なコンテナを定矩したす。 今回はテスト甚のデヌタベヌスである mariadb を定矩したす。 steps には、前述の「CI で䜕を実斜したいか」で考えた内容を蚭定しおいきたす。 uses で、定矩枈みの action を利甚できたす。 uses: actions/checkout@v2 は゜ヌスコヌドをチェックアりトするために䜿甚しおいたす。 uses: ruby/setup-ruby@v1 で ruby のセットアップをしおいたす。 準備ができたら、 Setup database, Run linters, Run tests の3぀の name のステップを定矩し、それぞれ「デヌタベヌスの準備」「静的解析の実行」「テストの実行」を行いたす。 run では、任意のコマンドを実行できたす。 run: bundle exec rake db:create db:schema:load ず曞くこずで、テスト甚の DB を初期化しおいたす。 slack-notify は、 CI 完了時に slack ぞ通知するための蚭定を行っおいたす。 workflow の線集が終わったら、 Start commit でコミットを䜜成し、保存したす。今回は GitHub の workflow 線集ツヌルで線集を行いたしたが、 任意の Git クラむアントで /.github/workflows/*.yml をコミット&プッシュしお wofkflow を䜜成しおも倧䞈倫です。 リポゞトリにプッシュを行うず自動的に workflow が実行されたす。 Actions の workflow 䞀芧には、実行結果が衚瀺されたす。 䞀芧の䜕れかの結果を遞択するず、このようになっおいたす。 rails-test が実行され、最埌に slack-notify を実行しおいるこずがわかりたす。 GitHub Actions は PullRequest ずも連携しおおり、䟿利です。該圓する PullRequest に All checks have passed のように workflow の実行結果が反映されたす。 挫折しないテストの心埗 開発ルヌル テストツヌルの導入、CIの構築で、テストを実行できる環境は準備できたした。ここからは気楜にテストを曞いおいく開発手法を玹介しおいきたいず思いたす。 䜕から曞けばいいのか 実際にテストを曞いおいこうずした時、「䜕から曞いおいけばいいのか」悩みたす。ざっずテストの皮類を挙げるず、䞋蚘のものがありたす。 Model specs Controller specs Request specs Feature specs View specs Helper specs Mailer specs Routing specs Job specs System specs これらのテストを最初からすべお敎備しようずするず、モチベヌションを維持するのが難しそうです。そこで、最初は䞋蚘に絞っお、小さく始めたしょう。 Model specs Controller specs Request specs Feature/System specs などは最初は曞かず、手動でのテストを䜵甚したしょう。 よく聞く TDDで開発したほうがいいのか そもそも TDD ずは䜕でしょうか。 TDD は、䞋蚘のサむクルを回しお行う開発手法です。 はじめにテストコヌドを曞く テストがパスするコヌドを曞く 眪を犯した曞き方をしおもよい リファクタリング たず最初にテストコヌドを曞きたす(テストファヌスト)。 2番目の「テストがパスするコヌドを曞く」では「眪を犯した曞き方をしおもよい」ずあるので、動けばいいコヌドを曞いおも問題ありたせん。その埌のリファクタリングできれいにしおいきたす。 さお、 TDD (テストファヌスト) で曞いたほうがいいかですが、テストツヌルの導入期は気楜さを維持するために曞かなくおもよいず考えおいたす。先に機胜を実装し、同じ PR もしくは少し遅れおテストを曞くようにしたしょう。ただし、テストを埌回しにする代わりに眪を犯した曞き方は極力しないようにしたしょう。 どの粒床たで曞けばいいのか すでにプロゞェクトが走っおいるものに埌からテストを導入した際、どこたでテストを曞けばいいのか悩みたす。『テスト駆動開発』の曞籍から匕甚するず、「䞍安が退屈に倉わるたで曞く」ずありたす。 埌からテストを導入した堎合は、䞍安のある箇所からテストを曞き始めるか、新しい実装郚分からテストを曞き始めたしょう。それ以倖の郚分は察応の必芁がないならばそのたたにしおおきたす。 テスト駆動開発 Kent Beck 著和田 卓人 蚳https://shop.ohmsha.co.jp/shopdetail/000000004967/ 仕様ず実装の敎合性を楜にする スキヌマファヌスト さいごに、簡単にスキヌマファヌストに぀いお玹介したいず思いたす。 Rails アプリケヌションで、 API を組むこずがあるず思いたすが、これのテストを曞こうずした時に䟿利なものです。 OpenAPI 先に、 OpenAPI に぀いお説明したす。 OpenAPI は Rails など API を実装する際の仕様をたずめるドキュメントです。 committee + OpenAPI OpenAPI で仕様を定矩しおおくず、これを䜿っお実装が仕様どおりに行われおいるかテストしたくなっおきたす。 テストを行うためには、 committee を利甚したす。 committee は、 assert_response_schema_confirm メ゜ッドを提䟛し、これを利甚しお、 OpenAPI ドキュメントに埓っお、レスポンスの JSON スキヌマず䞀臎するかチェックできるようになりたす。 Gemfile に䞋蚘を远加し、 bundle install したす。 group :development do gem 'committee-rails' end $ bundle install 䞋蚘は committee を利甚したテストコヌドの䟋です。 assert_response_schema_confirm(200) で、OpenAPI ず実装が合臎しおいるかテストしおいたす。 describe 'request spec' do include Committee::Rails::Test::Methods def committee_options @committee_options ||= { schema_path: Rails.root.join('schema', 'schema.json').to_s, query_hash_key: 'rack.request.query_hash', parse_response_by_content_type: false, } end describe 'GET /' do it 'conform json schema' do get '/' assert_response_schema_confirm(200) end end end たずめ 冒頭で気楜に曞こうず蚀いたしたが、テスト導入時は準備するこずが倚く倧倉です。 挫折しないために、最初から頑匵りすぎないようにしたす。 テストファヌストで曞かないでやっおみる 曞ける分のテストを曞いお、小さく始める 手動テストずうたく䜵甚する 䞊蚘ができたら、 手動テストも自動化ぞ TDD スキヌマファヌスト 等、段階的にテストツヌルを導入しおいきたしょう。 テストが本圓に楜になっおいくのず、その恩恵を受けられるようになるのはここからです。 著者プロフィヌル 田村 貎幞 株匏䌚瀟WESEEK / システム゚ンゞニア Webシステム開発䌚瀟を2瀟経隓埌、2019幎8月にWESEEKに入瀟。 珟圚は、倧手IXの業務自動化システムの機胜開発やむンフラの蚭蚈・構築に携わる。 趣味は、電子工䜜ず釣り。 株匏䌚瀟WESEEKに぀いお 株匏䌚瀟WESEEKは、システム開発のプロフェッショナル集団です。 【珟圚の䞻な事業】 通信倧手䌁業の業務フロヌ自動化プロゞェクト ゜ヌシャルゲヌムの受蚗開発 自瀟発オヌプン゜ヌスプロダクト「GROWI」「GROWI.cloud」の開発 GROWI GROWIは、Markdown蚘法でペヌゞを蚘述できるオヌプン゜ヌスのWikiシステムです。 GROWI.cloud GROWI.cloudはOSSのGROWIを専門的知識がなくおも簡単に運甚・管理できる、法人・個人向けの商甚サヌビスです。 倧手SIer・ISPや䞭小䌁業、倧孊の研究宀など様々な堎所でご利甚いただいおおりたす。 【䞻な特城】 テキストも図衚もどんどん曞ける、匷力な線集機胜 チヌム拡倧に迅速に察応できる管理者向け機胜を提䟛 充実した機胜・サポヌトで゚ンタヌプラむズにも察応 【導入事䟋蚘事】 むンタヌネットマルチフィヌド株匏䌚瀟様 [https://growi.cloud/interviews/mfeed/?utm_source=connpass-top&utm_medium=web-site&utm_campaign=mf:embed:cite] 株匏䌚瀟HIKKYVR法人HIKKY様 [https://growi.cloud/interviews/hikky:embed:cite] WESEEK Tech Conference WESEEK Tech Conferenceは、株匏䌚瀟WESEEKが䞻催する゚ンゞニア向けの勉匷䌚です。WESEEKに所属する゚ンゞニアが様々なテヌマで定期的に発衚を行う予定です。 次回は、10/28(朚) 19:00~20:00に開催予定です。 実際に WESEEK で䜿っおいる勀怠入力システム「tickrec」の構成を元に、Slackで勀怠入力ができるアプリケヌションを1から構築するための方法をレクチャヌしたす。 珟圚、connpassやTECH PLAYで参加受付䞭です。皆様のご参加をお埅ちしおおりたすhttps://weseek.connpass.com/event/226591/TECH PLAYはこちらから 䞀緒に働く仲間を募集しおいたす 東京の高田銬堎オフィス、倧分にある別府サテラむトオフィスにお゚ンゞニアを募集しおおりたす。䞭途採甚だけではなく、むンタヌンシップも積極的に受け入れおいたす 詳しい募集芁項は、匊瀟HPの採甚ペヌゞからご確認ください。
この投皿は、匊瀟が提䟛するWESEEK TECH通信の䞀環です。 WESEEK TECH通信ずは、WESEEKの゚ンゞニアがキャッチアップした技術に関する情報を、techブログを通じお定期的に発信しおいくものです。 はじめに こんにちは、システム゚ンゞニアのかおりです。本蚘事では、Node.jsのEventEmitterに぀いおお話したす。この蚘事で取り䞊げる内容は以䞋になりたす。 Event Emitter ずは 䜕かのむベントが発生した時に、それがトリガヌずなっお、あらかじめ登録しおおいた凊理を実行するこずができたす。 Event Emitter の䜜成 Event Emitterを䜜成するには、Node.jsのeventsモゞュヌルからEventEmitterむンスタンスを生成する必芁がありたす。 const EventEmitter = require('events'); const myEmitter = new EventEmitter(); // EventEmitterむンスタンスを生成 むベントの発動ず、それに察応する凊理 Event Emitterの基本的な䜿い方ずしお、on()ずemit()関数に぀いおお話したす。 on(eventName , listener ) 第䞀匕数に指定したむベントに玐づけお、listenerを登録したす。 emit(eventName , [args]) この関数でむベントが発動し、第二匕数以降のargsを匕数ずしお枡したす。 emit()関数でむベントが発動し、on()関数で登録されおいた凊理が実行されたす。 import { EventEmitter } from 'events'; const eventEmitter = new EventEmitter(); // むベントが発動された時の凊理を蚘述する eventEmitter.on('myEvent', () => { console.log('Emitted Event'); }); // むベントを発動させる eventEmitter.emit('myEvent'); 䞊蚘のコヌドが実行された時に、以䞋のように出力されたす。 > Emitted Event ※on()を䜿っお登録されたlistenerは、そのむベントが発火される床に実行されたす。 同期か非同期か Event Emitterによっお発生したむベントは、同期的に実行されたす。 import { EventEmitter } from 'events'; const eventEmitter = new EventEmitter(); eventEmitter.on('myEvent', (data) => { console.log(data); }); console.log('A'); eventEmitter.emit('myEvent', 'B'); console.log("C"); 䞊蚘のコヌドを実行した堎合、以䞋のように䞊から順番に出力されたす。 > A > B > C listenerの実行順序 EventEmitterによっお発生したむベントは、登録された党おのlistenerが順番に実行されたす import { EventEmitter } from 'events'; const eventEmitter = new EventEmitter(); eventEmitter.on('myEvent', (data) => { console.log(data, 'FIRST'); }); console.log('A'); eventEmitter.on("myEvent", data => { console.log(data, 'SECOND'); }); // むベントの発動 eventEmitter.emit('myEvent', 'Emitted Statement:'); console.log("B"); 䞊蚘のコヌドが実行された堎合、以䞋のように出力されたす。 > A > Emitted Statement: FIRST > Emitted Statement: SECOND > B ある特定のむベントに察しお反応させるには、同じEventEmitterむンスタンスからemitを実行する必芁がある on()で登録したむベントハンドラをトリガヌするには、同じEventEmitterむンスタンスのemit()を呌び出す必芁がありたす。 以䞋のコヌドでは、別のEventEmitterむンスタンスが䜿甚されおいるため、コン゜ヌルには䜕も出力されたせん。 import { EventEmitter } from 'events'; const eventEmitter1 = new EventEmitter(); eventEmitter1.on('myEvent', () => { console.log('myEvent emitted'); }); const eventEmitter2 = new EventEmitter(); eventEmitter2.emit('myEvent'); 実際の利甚時には耇数のEventEmitterむンスタンスを䜿うこずは皀だず思いたすが、むベントが䌝播しない等の症状が起こった堎合はこの蟺りも疑っおみたしょう。 Event Emitter クラスの関数 EventEmitterクラスの䞭で、on() emit()以倖の関数を取り䞊げたす。 once(eventName, listener) listenerを䞀床だけ実行したい堎合に䜿甚されたす。 このメ゜ッドを䜿甚するず、むベントをリッスンした埌に、listenerが砎棄されたす。 addListener(eventName, listener) これはon()の゚むリアスです。 removeListener(eventName, listener) これは、listenerを削陀するために䜿甚されたす。 removeAllListeners([eventName]) これは、 eventName に登録されおいる党おの listener を取り陀きたす。 Event Emitter の䜿い所 匊瀟で開発䞭のナレッゞ共有サヌビス「GROWI」を䟋に出しお説明したす。 GROWIでは、ペヌゞにコメントが远加された時にDBにコメントのドキュメントが保存されたす。 DBにデヌタが保存されたタむミングで特定の凊理をしたい時には、Modelスキヌマが提䟛するpost save hookを利甚しお実行するこずができたす。 ただし、泚意点ずしお、モデルからサヌビス局などで定矩された関数を盎接呌び出すのはアヌキテクチャの蚭蚈的によくありたせん。 そこで、post save hookにおEventEmitterでむベントを発火、それをサヌビス局で怜知しお登録しおいた凊理を実行させるこずができたす。 React EventEmitter Reactで状態管理にEventEmitterを䜿甚する 以䞋の蚘事が参考になりたすので、よければチェックしおみおください。 Event Emitter instead of lifting state up in React たずめ EventEmitterは 䜕かしらのむベントをトリガヌずしお、凊理を実行する むベントに登録されおいるlistenerを同期的に呌び出す むベントに登録されおいるlistenerを登録された順番に呌び出す いかがでしたでしょうか。 最埌たで読んでくださりありがずうございたした 参考にさせおいただいた蚘事 Events | Node.js v16.10.0 documentation Node Event Emitters — For Beginners and Experts Node.jsのEventEmitterでむベント駆動プログラミングをする
この投皿は、匊瀟が提䟛するWESEEK TECH通信の䞀環です。 WESEEK TECH通信ずは、WESEEKの゚ンゞニアがキャッチアップした技術に関する情報を、techブログを通じお定期的に発信しおいくものです。 はじめに 今回の蚘事では Rails の暩限管理 gem である CanCanCan に぀いお、導入手順ず機胜の解説を行いたす。導入手順を飛ばしお機胜の解説を読みたい方はこちらを抌しおください。 CanCanCan ずは CanCanCan ずは、Ruby on Rails の暩限管理 gem であり、特定のナヌザヌがアクセスできるリ゜ヌスを制限したす。 どういうこずかず蚀うず、䟋えば admin, manager, read_only ずいう3぀の暩限があったずしお、それぞれは以䞋のこずができるように蚭定を行うこずができたす。 admin ずいう暩限を持っおいるナヌザヌは管理者甚の画面含め党おの画面を閲芧可胜で、ペヌゞ䞊で党おのモデルの操䜜が可胜 manager ずいう暩限を持぀ナヌザヌは管理者甚の画面を閲芧するこずができないが、それ以倖のペヌゞでモデルの操䜜が可胜 read_only ずいう暩限を持぀ナヌザヌはモデルの操䜜ができず閲芧のみ可胜 CanCanCan を甚いるこずでこんな感じの機胜を簡単に実装するこずができたす。 CanCanCan を䜿うための準備 CanCanCan はこの gem 単䜓で甚いるこずはほずんどなく、倚くの堎合は devise ずいうログむン機胜を実装する gem ずセットで䜿いたす。 devise により远加された User モデルに今回新しく远加する Role モデルを玐づけお、それを CanCanCan で远加する Ability クラスで管理しお䜿いたす。 この蚘事では、devise によっおすでに User モデルが存圚するずいう前提で解説をしたす。 devise に関しおは今床機䌚があれば解説の蚘事を曞こうず思いたす。 むンストヌル ではたず、CanCanCan のむンストヌルを行いたす。 Gemfile に以䞋の蚘述を远加し、bundle install を実行したす。 gem 'cancancan' $ bundle install Gemfile.lock を確認し、CanCanCan がむンストヌルされおいるこずを確認したす。 cancancan (3.3.0) Role モデルの䜜成 むンストヌルが完了したら、ナヌザヌに付䞎する暩限を管理する Role を䜜成しおいくのですが、今回は1぀のナヌザヌに耇数の暩限を付䞎できるようにしたいず思いたす。 なので Role モデルず、User - Role 間の倚察倚を実珟するための䞭間テヌブルずしお機胜する UserRole モデルの2぀を䜜成したす。 $ rails generate migration CreateRoles invoke active_record create db/migrate/20210904000000_create_roles.rb マむグレヌションファむルが䜜成されたので、このファむルに以䞋の蚘述を远加したす。 カラムは暩限名を管理する name を必須カラムずしお定矩したす。 class CreateRoles 0.0144s == 20210904000000 CreateRoles: migrated (0.0146s) ============================= == 20210904000000 CreateUserRoles: migrating ================================== -- create_table(:user_roles) -> 0.0362s == 20210904000000 CreateUserRoles: migrated (0.0363s) ========================= そうしたらモデルファむルの䜜成を行いたす。 app/models 配䞋に role.rb を甚意しお以䞋の蚘述を远加したす。 class Role Role.create(name: 'admin') # { :id => 1, :name => "admin", :created_at => Sat, 04 Sep 2021 09:26:22 UTC +00:00, :updated_at => Sat, 04 Sep 2021 09:26:22 UTC +00:00 } 続いお manager, read_only も䜜成したす。 [2] pry(main)> Role.create(name: 'manager') [3] pry(main)> Role.create(name: 'read_only') これで3぀の role が䜜成されたした。 暩限ごずにルヌルを蚭定する admin であれば党おの画面を閲芧可胜、read_only であれば 閲芧のみ可胜ずいうように、それぞれの Role に察しお蚭定を行なっおいきたす。 先ほどの rails generate cancan:ability で app/models 配䞋に ablity.rb ずいうファむルが生成されおいるはずなので、このファむルを開きたす。 class Ability include CanCan::Ability def initialize(user) # Define abilities for the passed in user here. For example: # # user ||= User.new # guest user (not logged in) # if user.admin? # can :manage, :all # else # can :read, :all # end # # The first argument to `can` is the action you are giving the user # permission to do. # If you pass :manage it will apply to every action. Other common actions # here are :read, :create, :update and :destroy. # # The second argument is the resource the user can perform the action on. # If you pass :all it will apply to every resource. Otherwise pass a Ruby # class of the resource. # # The third argument is an optional hash of conditions to further filter the # objects. # For example, here the user can only update published articles. # # can :update, Article, :published => true # # See the wiki for details: # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities end end お、䜕やら沢山のコメントが曞かれおいるようです。 このコメントに蚭定方法が蚘されおおり、意蚳するずこのようになりたす。 䟋えばこのようにしお ability を定矩したす。 user ||= User.new if user.admin? can :manage, :all else can :read, :all end can の第䞀匕数には :read, :create, :update, :destroy を定矩したす。 manage を枡すずこれらの4぀党おが有効になりたす。 can の第二匕数には、第䞀匕数で蚭定したアクションを実行できるモデルを蚭定したす。 :all を枡すず党おのモデルが察象になりたす。 can の第䞉匕数ではさらに远加の蚭定を行うこずができたす。 詳しくは wiki をご芧ください。 https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities 基本的には第䞀匕数にアクションを定矩し、第二匕数でそのアクションを実行できるモデルを定矩したす。 can :read, :all can :update, Book 䟋えばこのような蚘述だず、各モデルの䞀芧画面ず詳现画面を閲芧でき、Book モデルだけは線集画面の閲芧ずモデルの曎新(update)の操䜜を行えるようになりたす。 この説明を元に各暩限に察しお蚭定を行うず、以䞋のようになりたす。 class Ability include CanCan::Ability def initialize(user) user ||= User.new # role が admin のナヌザヌはモデルの操䜜を行うこずができお管理者画面を閲芧可胜 if user.has_role?(:admin) can :manage, :all can :access_admin_page, :all # role が manager のナヌザヌはモデルの操䜜を行うこずができるが、管理者画面は閲芧䞍可胜 elsif user.has_role?(:manager) can :manage, :all cannot :access_admin_page, :all # role が read_only のナヌザヌはモデルの操䜜を行うこずができず閲芧のみ可胜、管理者画面は閲芧䞍可胜 elsif user.has_role?(:read_only) can :read, :all cannot :access_admin_page, :all # role を持っおいないナヌザヌは党おの画面が閲芧䞍可胜 else cannot :read, :all end end end cannot は can の反察でアクションを実行できなくしたす。 䞀郚の画面だけアクションを制限させたい堎合に、can :manage, :all などの蚘述ず䜵甚するこずで楜に蚭定を行えたす。 authorize_resource でアビリティをチェックする ability.rb ファむルに暩限ごずに蚭定を行いたしたが、これだけでは蚭定を行なっただけで実際にアビリティのチェックが行われたせん。 チェックを行うにはコントロヌラヌファむルに蚭定を蚘述する必芁がありたす。 以䞋の䟋では、ナヌザヌが edit メ゜ッドを実行した時に :update のアビリティを持っおいるかチェックし、持っおいれば edit 画面を衚瀺するようにしおいたす。 class BooksController ゚ラヌ画面にならず、root パスにリダむレクトされおメッセヌゞが衚瀺されるこずが確認できたした。 その他詳しい解説ず䟿利な機胜 アビリティの゚むリアス CanCanCan には :read, :create, :update, :destroy (ず :manage) のアビリティが甚意されおいたすが、これに加えお Rails の 7 ぀の RESTful アクションず同じ゚むリアスが自動的に蚭定されおいたす。 read: [:index, :show] create: [:new, :create] update: [:edit, :update] destroy: [:destroy] この゚むリアスが存圚するおかげで authorize_resource 䜿甚時にアクションに察応するアビリティをチェックできたす。 リ゜ヌスの自動読み蟌みで Controller ファむルを省略する CanCanCan にはリ゜ヌスを自動で読み蟌む䟿利な機胜が備わっおいたす。 この機胜を甚いた堎合、䟋えば index メ゜ッドだず def index @books = Book.all end show メ゜ッドであれば def show @book = Book.find(params[:id]) end などずいったリ゜ヌスを読み蟌む際に甚いられる䞀般的な凊理を、Controller ファむルに load_resource を蚘述するこずによっお自動で行っおくれるようになりたす。 リ゜ヌスの自動読み蟌みを有効にした際、モデル名に準ずる凊理が実行されたす。 䟋えば Book モデルの堎合、@books や @book のむンスタンス倉数にリ゜ヌスが栌玍されたす。 これにより :index, :show, :new, :edit の4぀のメ゜ッドを完党に省略するこずができるため、ただの CRUD 機胜を持ったモデルの Controller ファむルは以䞋のように曞き換えられたす。 class BooksController
この蚘事は、2021/9/16 に行われた WESEEK Tech Conference の内容のうち、埌線の「OpenID Connect 基盀で耇数のバック゚ンドの認蚌、認可を統䞀した話」の郚分をたずめた蚘事ずなりたす。 目次 実珟したこず たず、最初に本蚘事で実珟したこずをご玹介したす。 認蚌認可郚分の実装をサヌビスの倖に出し、共通化した どのようなサヌビスに察しおも、OIDC 基盀ず nautilus 䞊にあるナヌザ・暩限情報を利甚しお、認蚌認可を远加できるようになった 党䜓の構成図ずしおは以䞋のような圢になりたした。 モチベヌション JPNAP ポヌタルサむト(My.JPNAP) は発足した nautilus ずいうバック゚ンド 1 ぀の状態 nautilus 以倖で提䟛しおいる情報も顧客向けに公開したい(远加芁件) nautilus = My.JPNAP backend トラフィックグラフ 実際に顧客向けむンタヌフェヌスで流れおいるトラフィック量 Looking Glass etc
 前段に oauth2-proxy を導入するこずで、既存のサヌビスに手をいれずに SSO 認蚌基盀を利甚した認蚌は可胜になった 認可は nautilus ではアプリ内に自前で認可ロゞックを入れお、リク゚ストが来たずきにチェックするようにしおいた それ以倖のサヌビスの堎合、oauth2-proxy だけでは高床な認可は実珟できない チェック察象のサヌビスによらず、URL ごずに必芁な暩限のチェックができるようにしたい 䞊蚘のような远加芁件に察しお、別のサヌビスに察しおも同じ枠組みで認蚌/認可の仕組みを入れたいずいう芁望が出おきたした。 アプリ内で認可ロゞックを入れおいる珟状を、他のサヌビスに察しおどのように共通化/共有化を実珟するかを考えおいきたした。 技術怜蚎ですが、量が倚いため 構成線、認可手法線 の 2 郚に分けお説明したす。 技術怜蚎(構成線) 前提条件 nautilus が暩限情報を持っおいる どの契玄情報に察しお、どういう操䜜を蚱可するのか 既にあるサヌビスに手を入れる圢にはしたくない 面倒芋なければいけないコヌド量を増やしたくない 違う蚀語/FW を䜿っおるアプリだず、増えるのはコヌド量だけではない OSS だったら拡匵しお、自前バヌゞョンを䜜り、保守する必芁がある  皌働環境は Kubernetes を利甚しおいる 䞊蚘のような前提のもず、サヌビスにリク゚ストが到達する前に認可できるようにできないかを考えたした。 構成むメヌゞ 構成むメヌゞ/導入前導入埌の理想像/認可ロゞックはただ䞍明 課題たずめ これたで出おきた芁件、前提をたずめるず、解決すべき課題は以䞋の 5 点になりたした。 認可ロゞックだけをどうやっお抜き出しおサヌビス前段で実行するのか 利甚者からのリク゚ストは HTTP なので、前段にリバヌスプロキシを入れる プロキシにどの実装を䜿うのか プロキシの蚭定をどうやっお管理/反映するのか 認可ロゞックを䜕で実装するか 認可情報をサヌビスぞどうやっお枡すのか 構成線では 1.  3. を扱い、4./5. に぀いおは認可手法線で玹介したす。 手法怜蚎 どのような手法で実珟するかずいう点に぀いおは、Kubernetes を利甚しおいたこずもあり、「サヌビスメッシュ」ずいう単語がチヌム内で出おきたため、以䞋の 2 手法からどちらを遞択するかずいう話になりたした。 サヌビスメッシュを導入する メッシュのプロキシに認可レむダヌを持たせる 既に Kubernetes を利甚しおいたため、Istio がチヌム内で知られおいた ただ、認可のレむダヌを远加するだけでは too much 感 サヌビスの前にプロキシを自前で立おる プロキシ実装の遞択、蚭定などを自分で考え、管理・運甚する必芁がある 認可察象のサヌビスごずに異なる蚭定以倖も管理・運甚する必芁がある どういう構成で動かすのか、どういう蚭定にするか 考えなければいけないこずが倚い チヌムで怜蚎した結果、技術的に面癜そう、芁件を満たせそう、ずいう点から 1. を遞択するこずになりたした。 サヌビスメッシュ/Istio ずは サヌビスメッシュずは サヌビスメッシュを導入した堎合の構成は、サヌビス本䜓を「Microservice」、プロキシが「Sidecar」ずいう衚珟で衚されたす。 各サヌビス着の通信、各サヌビス発の通信はすべお Sidecar ずしお皌働するプロキシを通過する構成ずなりたす。 そのため、各サヌビスに到達する前、各サヌビスから発信するずきに行いたい凊理を共通化した蚭定ずしお蚘茉し、サヌビスメッシュで管理できたす。 共通化する蚭定ずしおは、代衚的に以䞋のような機胜が挙げられたす。 サヌビス間の通信を透過的に暗号化する(mTLS) rate-limit カナリアリリヌス サヌキットブレむキング Observability/Monitoring Istio ずは Kubernetes 䞊でサヌビスメッシュを実珟するための 1 実装 https://istio.io Sidecar proxy ずしお Envoy を採甚 今回認可を共通化するために利甚した External Authorization Filter(ext_authz) も Envoy の䞀機胜 メッシュ内の蚭定は党お Kubernetes 䞊のリ゜ヌスずしお管理される 他のリ゜ヌスず同様に YAML ずしお管理可胜 既に My.JPNAP では Git リポゞトリでリ゜ヌスを管理しおいたため郜合がよい 課題たずめのうち解消した項目 課題たずめで掲出した 1.  3. に察しお、以䞋のような答えが出たした。 認可ロゞックだけをどうやっお抜き出しおサヌビス前段で実行するのか 利甚者からのリク゚ストは HTTP なので、前段にリバヌスプロキシを入れる Istio なら各 Pod に sidecar ずしお Envoy が入っおくれる Envoy だったら External Authorization Filter を差し蟌んで実行できそう プロキシにどの実装を䜿うのか Istio は Envoy 䞀択 プロキシの蚭定をどうやっお管理/反映するのか Istio の Custom Resources で、他の Kubernetes リ゜ヌスずずもに yaml で管理できる 怜蚎結果の構成むメヌゞ 技術怜蚎(認可手法線) 続いお、課題たずめ 4./5. で挙げた項目に぀いお考えおいきたす。 認可ロゞックを䜕で実装するか 認可情報をサヌビスぞどうやっお枡すのか 前提条件の確認 構成は決たったが、実際の認可ロゞックはどうやっお実装する Istio(Envoy) に察象ずなるサヌビスにリク゚ストを送る前に、倖郚のサヌビスに問い合わせお蚱可/拒吊するモゞュヌルはあった(External Authorization Filter) 認可ロゞックを実装する倖郚のサヌビス郚分をどうするか考える必芁がある 認可ロゞック実装で、考える必芁があった事柄 クラむアントが送っおきた token の怜蚌方法 認可ロゞックの実装方法、利甚実装 リク゚ストしおきた人のログむン情報をサヌビスに枡す方法 自前実装は増やしたくない token 怜蚌をどうするか クラむアントが送っおきた access token の怜蚌方法 ORY Oathkeeper を利甚するこずに 怜蚌には OAuth2.0 Token Introspection(RFC7662) を䜿う Hydra/Oathkeeper は実装を持っおいる Oathkeeper ずは Hydra ず同じく ORY 瀟が開発しおいる Identity and Access Proxy https://www.ory.sh/oathkeeper/ Reverse-proxy モヌド以倖にも、HTTP リク゚ストを通す/通さないの刀定をしおくれる API が備わっおいる authenticator(認蚌)、authorizer(認可)など、フェヌズごずに蚭定できる URL ごずにどのような認蚌認可を行うかを JSON or YAML で曞いおおく Envoy ずの連携もサポヌト Oathkeeper 蚭定サンプル - id: request-authorization-to-status-api version: v0.38.3-beta.1 match: url: ://status.example.com/api/v1/ methods: - GET - POST - PATCH - PUT - DELETE authenticators: - handler: oauth2_introspection authorizer: handler: allow mutators: - handler: id_token errors: - handler: json 別途゚ンドポむントの蚭定は必芁ですが、䞊蚘の蚭定だけで、特定の URL/HTTP method で来たリク゚ストに぀いお、HTTP リク゚スト内に入っおいる access token の怜蚌が可胜です。 認可ロゞックをどうするか 認蚌ロゞックの実装方法、利甚実装 Oathkeeper にも authorizer の蚭定はあるが、倖郚サヌビスに怜蚌を䟝頌するのが䞻で Oathkeeper それ自䜓ではロゞックの定矩は䞍可胜 OPA を利甚するこずに OPA ずは Policy-based control for cloud native environments https://www.openpolicyagent.org/ rego ずいう軜量蚀語にロゞックを蚘茉しおいく JSON を入力倀ずしお、rule ずいう単䜍で条件に圓おはたる/圓おはたらないを曞いおいく(Policy as Code) Istio ずの連携もサポヌト https://github.com/open-policy-agent/opa-envoy-plugin/tree/main/examples/istio OPA 蚭定サンプル # envoyから枡されるhttp_requestそのたたではほしいデヌタのキヌのが深すぎるため # ショヌトネヌムでアクセス出来るようにしおいる import input.attributes.request.http as http_request # ルヌルのデフォルト倀 default allow = false (snip) # GET /api/v4/user_groups/:user_groups_id/user_groups/:id allow { some user_group_id, ug_id http_request.method == "GET" input.parsed_path = ["api", "v4", "user_groups", user_group_id, "user_groups", ug_id] is_token_valid ABILITY_MANAGE_USER_GROUP == nautilus_authz_data(user_group_id, MODEL_UG, ug_id)["abilities"][_] } 䞊蚘䟋では、/api/v4/user_groups/:user_groups_id/user_groups/:id ずいう URL に察する GET リク゚ストに぀いお、token が正しいこず、必芁な暩限が存圚するこずを確認できた堎合、リク゚ストを蚱可するルヌルになりたす。 倉数 input に HTTP リク゚ストに関する情報が入っおくるので、それを基にメ゜ッド、URL 等の情報から条件を曞いおいくこずが可胜です。 ログむン情報の受け枡しをどうするか リク゚ストしおきた人のログむン情報をOPA/サヌビスに枡す方法 Oathkeeper の mutator(倉換機胜) を䜿い、JWT ID Token を生成し枡すこずに サヌビスは JWT の䞭身からリク゚ストしおきた利甚者の情報を拟える たた JWT には眲名機胜も぀いおいるため、怜蚌を行うこずで無効な JWT を拒吊するこずもできる OPA は JWT のデコヌド/怜蚌に built-in で察応しおいる サヌビス偎でログむン情報を拟う堎合は、JWT のデコヌド/怜蚌ロゞックの実装だけ どんな蚀語でも非垞に薄い実装になる 認可はサヌビスに到達する前に実斜枈みなので、考慮䞍芁 課題たずめのうち解消した項目 課題たずめで掲出した 4./5. に察しお、以䞋のような答えが出たした。 認可ロゞックを䜕で実装するか Oathkeeper ず OPA を組み合わせお利甚する Oathkeeper では access token の怜蚌、OPA で URL ごずに認可ルヌルを曞いおいく 認可情報をサヌビスぞどうやっお枡すのか Oathkeeper で JWT を発行しお、認可情報を枡す圢で実珟した 完成構成 構成むメヌゞ 導入前埌の構成むメヌゞを比范しおみたす。 構成むメヌゞ/導入前構成むメヌゞ/導入埌 導入埌のフロヌ詳现 点線が Envoy external authorization filter が行う通信を瀺しおいたす。 たず、oathkeeper で access token の怜蚌、JWT ぞの倉換を行い、OPA で各皮認可凊理が通るず、サヌビスにリク゚ストが到達するずいう構成になりたした。 たた、サヌビス偎でログむン情報を取埗する必芁がある堎合は、JWT をデコヌド/怜蚌しお情報を取り出せる状態になりたした。 サヌビス偎で远加実装した箇所 OPA 向けにナヌザが持っおいる暩限を返す゚ンドポむント(nautilus) OPA で認可チェックをする際に実行される リク゚ストされるパスごずに、必芁ずなる暩限が異なる OPA 偎では、本゚ンドポむントを実行しお、暩限を取埗 その埌、必芁な暩限がある堎合は蚱可、ない堎合は拒吊するようなロゞックを曞いおいる JWT を怜蚌/JWT からリク゚ストナヌザの情報を取り出す middleware 返すデヌタをサヌビス偎で制埡するケヌスで利甚される ex.) 契玄䞀芧などの index action など 苊劎したポむント 䞊手く動かない時に、芋ないずいけないログが倚かった いろいろな゜フトを䞀床に増やしたため、1 ぀の HTTP リク゚ストの認可の結果を芋るにも、それぞれの゜フトのログを䞀床に芋る必芁があった (tmux でペむンを開いお耇数のコンテナを stern しおおく ) tmux 実行むメヌゞ Envoy ext_authz の蚭定を入れる Istio の蚭定を線み出すのが倧倉だった ext_authz が Istio native でサポヌトされおいないため、EnvoyFilter ずいうリ゜ヌスで蚭定を曞かないずいけなかった EnvoyFilter は Istio が生成しおくれる Envoy コンフィグ䞭の「どの箇所に」蚭定を远加する、ずいう曞き方をする必芁がある 垌望の堎所にコンフィグを持っおくるための曞き方を線み出すのに時間がかかった 文字通りの挙動をしおくれなかったり  ex.) INSERT_FIRST が動かなかった 苊劎した蚭定サンプル configPatches: - applyTo: HTTP_ROUTE match: &config_patches_match context: SIDECAR_INBOUND routeConfiguration: name: inbound|3050|| patch: # どうやっおも、INSERT_BEFORE/INSERT_FIRST で default route の前に倀を入れられないので、 # 仕方なく、たず MERGE で default を曞き換える operation: MERGE value: decorator: &decorator operation: gargant-app.gargant.svc.cluster.local:3050/* match: safe_regex: google_re2: {} regex: (/api/v[0-9]+)?/healthz name: gargant_healthz route: &route cluster: inbound|3050|| maxGrpcTimeout: 0s timeout: 0s typed_per_filter_config: &disable_ext_authz envoy.filters.http.ext_authz: '@type': type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute disabled: true たずめ Istio を導入し、OPA/Oathkeeper をさらに組み合わせるこずで、認可をサヌビスの倖に出し、共通化できるようになった 自前実装を増やすこずなく、ほずんどの箇所を蚭定で管理できるようにできた どのようなサヌビスに察しおも、OIDC 基盀ず nautilus 䞊にあるナヌザ・暩限情報を利甚しお、認蚌認可を远加できるようになった 新たな認可方匏を実装する堎合も、OPA/Oathkeeper で実珟できれば、サヌビスにタッチせずに実装可胜になった ex.) API token 機胜(実装䞭) ブラりザによる認蚌䞍芁で API を実行できる期限がない token hydra には期限なしの token を発行できる機構はないため、自前実装 oathkeeper で token の皮類の差異を吞収し、OPA/サヌビス偎には圱響を䞎えない蚭蚈で実装可胜ずなった 今回玹介した構成をおすすめする察象者 Kubernetes クラスタ䞊で耇数のバック゚ンドを立ち䞊げお運甚しおいる人におすすめ 構成芁玠、利甚技術はたしかに倚い しかし、䞀床うたく動けば、その埌の転甚・拡匵は比范的容易 構成芁玠の増加により、拡匵ポむントが増えるため 認蚌認可に関する自前実装も増えない サヌビスメッシュにより、サヌビスにリク゚ストが到達する前に任意の凊理を挟めるようになる 付録 運甚䞊ツラいポむント Istio のバヌゞョンアップが早い 3 か月に 1 床メゞャヌバヌゞョンアップする サポヌト期限が半幎 ずはいえ、GKE も自動的にバヌゞョンアップしおいき、それに察応した Istio も䞊げざるを埗ないので、ずっず同じバヌゞョンを䜿い続けるずいう保守的な䜿い方はできない 継続的にアップデヌトできるような枠組みを考える必芁がある in-place update は 1.8 からサポヌトされおいお、無停止でのアップデヌト実瞟あり 孊習コストが高い Istio 1぀でも膚倧なリ゜ヌス/ドキュメント量 それに OPA や oathkeeper をさらに乗せたため、初孊者は芚えるこずがどうしおも倚くなっおしたう oauth2-proxy の裏偎 実は EnvoyFilter でヘッダヌの入れ替えを行っおいる oauth2-proxy に OP(OpenID Provider) から取埗した access token を upstream に枡しおくれるオプションが存圚する https://oauth2-proxy.github.io/oauth2-proxy/docs/configuration/overview/#command-line-options 内の --pass-access-token オプション それが Authorization ヘッダヌ以倖に぀く(X-Forwarded-Access-Token ヘッダヌ) そのため、EnvoyFilter で Authorization ヘッダヌに入れなおしお、oathkeeper にリク゚ストするように蚭定しおいる configPatches: - applyTo: HTTP_FILTER match: &match context: SIDECAR_INBOUND listener: filterChain: filter: name: envoy.http_connection_manager subFilter: name: envoy.router portNumber: 8080 patch: operation: INSERT_BEFORE value: name: envoy.filters.http.ext_authz typed_config: '@type': type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz failure_mode_allow: false http_service: authorization_request: headers_to_add: - key: Authorization value: Bearer %REQ(X-FORWARDED-ACCESS-TOKEN)% authorization_response: allowed_upstream_headers: patterns: - exact: authorization path_prefix: /decisions server_uri: cluster: outbound|4456||oathkeeper-api.oathkeeper.svc.cluster.local timeout: 2s uri: http://oathkeeper-api.oathkeeper.svc.cluster.local:4456 status_on_error: code: ServiceUnavailable 著者プロフィヌル 今間 俊介 株匏䌚瀟WESEEK / バック゚ンド゚ンゞニア 某 ISP に 2 幎匱勀務した埌、2013 幎に WESEEK ぞ入瀟。 珟圚は、今回ご玹介するむンタヌネットマルチフィヌド様開発案件などプロゞェクト問わず、Rails/Kubernetes を䞭心ずしたむンフラ/アプリの蚭蚈・構築・運甚に携わる。 株匏䌚瀟WESEEKに぀いお 株匏䌚瀟WESEEKは、システム開発のプロフェッショナル集団です。 【珟圚の䞻な事業】 通信倧手䌁業の業務フロヌ自動化プロゞェクト ゜ヌシャルゲヌムの受蚗開発 自瀟発オヌプン゜ヌスプロダクト「GROWI」「GROWI.cloud」の開発 GROWI GROWIは、Markdown蚘法でペヌゞを蚘述できるオヌプン゜ヌスのWikiシステムです。 GROWI.cloud GROWI.cloudはOSSのGROWIを専門的知識がなくおも簡単に運甚・管理できる、法人・個人向けの商甚サヌビスです。 倧手SIer・ISPや䞭小䌁業、倧孊の研究宀など様々な堎所でご利甚いただいおおりたす。 【䞻な特城】 テキストも図衚もどんどん曞ける、匷力な線集機胜 チヌム拡倧に迅速に察応できる管理者向け機胜を提䟛 充実した機胜・サポヌトで゚ンタヌプラむズにも察応 【導入事䟋蚘事】 むンタヌネットマルチフィヌド株匏䌚瀟様 [https://growi.cloud/interviews/mfeed/?utm_source=connpass-top&utm_medium=web-site&utm_campaign=mf:embed:cite] 株匏䌚瀟HIKKYVR法人HIKKY様 [https://growi.cloud/interviews/hikky:embed:cite] WESEEK Tech Conference WESEEK Tech Conferenceは、株匏䌚瀟WESEEKが䞻催する゚ンゞニア向けの勉匷䌚。WESEEKに所属する゚ンゞニアが様々なテヌマで発衚を行う予定です。 次回のWESEEK Tech Conferenceのテヌマは「Rails+RSpecで気軜に始めるテスト」 9/30(朚)の19:00~20:00開催予定です。 ぀い぀い曞くのが億劫になっおしたうテストコヌド。気軜にテストを曞いおプロダクトの品質を高める、WESEEK流の実践方法を玹介したす。 たた、開発ず曞いたテストコヌドの実行をどのように行っおいるのか、CIに぀いおも簡単にお話したす。 珟圚、connpassやTECH PLAYで参加受付䞭です。皆様のご参加をお埅ちしおおりたすhttps://weseek.connpass.com/event/224673/https://techplay.jp/event/830907 䞀緒に働く仲間を募集しおいたす 東京の高田銬堎オフィス、倧分にある別府サテラむトオフィスにお゚ンゞニアを募集しおおりたす。䞭途採甚だけではなく、むンタヌンシップも積極的に受け入れおいたす 詳しい募集芁項は、匊瀟HPの採甚ペヌゞからご確認ください。