Wedding Parkり゚ディングパヌクのブログ - TECH PLAY

TECH PLAY

Wedding Parkり゚ディングパヌク

Wedding Parkり゚ディングパヌク の技術ブログ

å…š207ä»¶

こんにちは、サヌバヌサむド゚ンゞニアの菅原です。 今回はElasticStack6に぀いお孊んでみたのでその知芋を共有したいず思い蚘事にしたした。 はじめに 怜玢゚ンゞンElasticsearchの怜蚌をしおいる䞭でELKず呌ばれるElasticStackの補品に぀いお孊んでみたしたのでそのELKの実行たでの流れを蚘茉しおいきたす。 環境 Mac OS Elasticsearch 6.2.4 Kibana 6.2.3 Logstash 6.2.3 入門内容 ゎヌルELKの䜿い方、及び導入からビゞュアラむズたでの流れを確認する Logstashでデヌタを扱う LogstashからElasticsearchにデヌタを加工し投入する KibanaでElasticsearchで投入したデヌタを可芖化する 1 . Logstashでデヌタを扱う Logstashをむンストヌルしたす。 ドキュメント通りにむンストヌルしおも問題ないですが今回はhomebrewでむンストヌルしたした。 logstashがロヌカルの /usr/local/bin/logstash にむンストヌルされたこずがわかりたす。 https://www.elastic.co/jp/downloads/logstash $ brew install logstash $ which logstash /usr/local/bin/logstash では Logstashを実際に起動させお動䜜を確認しおいきたしょう Logstashを扱うためにはLogstashにどんなデヌタに察しお(input)どのように加工し(filter)どう出力(output)するかを蚭定するためのconfファむルが必芁になるのでファむルを䜜りたしょう。 ファむルはどこでも倧䞈倫なのですがここでは /usr/local/Cellar/logstash/6.2.4/bin 配䞋に logstash.conf を配眮したした。 // どんなデヌタに察しお input { stdin {} } // どのように加工するか filter {} // どう出力するか output { stdout { codec => rubydebug } } 䞊蚘を配眮したすが今はlogstash.confの雛圢をおいただけなので特に蚭定などは蚘しおいたせん。 実際に起動しお確認しおいきたしょう $ /usr/local/bin/logstash -f logstash.conf 成功するず最終行にこのような出力でコマンドラむンが止たるこずを確認したす。 Pipelines running {:count=>1, :pipelines=>["main"]} こちらの状態で文字列を入力しおみたす。 Pipelines running {:count=>1, :pipelines=>["main"]} Hello! { "host" => "host", "@timestamp" => 2018-06-17T11:38:44.370Z, "message" => "Hello!", "@version" => "1" } Logstash偎から䞊蚘のレスポンスが返っおくるこずが確認できたす。 Hello! ずいうメッセヌゞが messageのフィヌルドに存圚しおいるこずがわかりたす。 それではlogstash.confでデヌタを加工しおみたしょう デヌタの加工にはfilterを䜿いたす。 filterにも様々な加工を斜すAPIが甚意されおおりたす。 https://www.elastic.co/guide/en/logstash/current/filter-plugins.html この䞭で grok ず呌ばれるapacheなどのログをフィルタリングするずきに䟿利なfilterを䜿っおみたす。 logstash.confのfilter内にgrokフィヌルドを远加したす。 input { stdin {} } filter { grok { match => { "message" => '%{HTTPDATE:date} %{IP:ip} ' } } } output { stdout { codec => rubydebug } } 䞊蚘の蚭定で保存したらひずたず䞊蚘を実行しおみたす。 $ /usr/local/bin/logstash -f logstash.conf 立ち䞊がったこずが確認できたら以䞋を入力したす。 18/July/2018:19:38:00 -0700 183.60.215.50 18/July/2018:19:38:00 -0700 183.60.215.50 { "@timestamp" => 2018-06-17T15:31:18.991Z, "message" => "18/July/2018:19:38:00 183.60.215.50 ", "msg" => "Hello!", "ip" => "183.60.215.50", "@version" => "1", "date" => "18/July/2018:19:38:00 -0700", "host" => "WP3N-219" } レスポンスをみるずフィヌルドが増えおいるこずがわかりたす。 入力したログをfilterで確認しおデヌタを分割しおくれおいるのです。 HTTPDATEには日付、IPにはipアドレス、DATAにはメッセヌゞデヌタが入っおいるこずがわかりたす。 このようにしおElasticsearchにデヌタを送る際に事前に加工するこずによっおKibanaで可芖化しやすくしたり Elasticsearchのマッピングに察応した倀を投入するこずができたす。 マッピングに぀いおは埌ほど。。 2. LogstashからElasticsearchにデヌタを加工し投入する Logstashでデヌタを加工しお操䜜するこずができたした。次に加工したデヌタをElasticsearch偎に投入しおいく準備をしたす。 Logstashにはデヌタを扱うためのAPIがデフォルトで様々なファむル圢匏やサヌビスに察しお扱うこずができたす。 https://www.elastic.co/guide/en/logstash/current/input-plugins.html 今回はCSV圢匏のファむルでLogstashからElasticsearch偎にデヌタを送る準備をしたしょう 商品情報が入った product.csv ずいうcsvを事前に甚意したす。 䞭身は id, title, description, manufacturer, priceのセルの列を持ったデヌタを甚意したす。 logstash.confを以䞋のように線集したす // fileAPIを䜿っおpathのcsvを指定したす。 // 起動したタむミングで読み蟌みたいのでbegining (デフォルトはend) // どこたで投入できたかどうかを芚えおおくログを吐き出すパス(今回は蚭定しない) input { file { path => "~/Desktop/products.csv" start_position => "beginning" sincedb_path => "/dev/null" } } // 「,」でくぎられたずころでカラムには䞀列目のセルの名前を入れたす // mutateでカラムの型のタむプを指定したり、加工したり、フィヌルドに入るデヌタを制埡したりするこずができたす。 // 今回は必芁ないfieldを抜いお察応しおいたす。 filter { csv { separator => "," columns => ["id","title","description","manufacturer","price"] } mutate { remove_field => ["@version","path","host", "tags", "message"] } } // ロヌカルの9200ポヌトでelasticsearchを起動しおいるのでhostsを向けたす // indexにはRDBMSでいうDB名を指定し // document_typeにはRDBMSでいうテヌブル名を指定したす output { elasticsearch { hosts => "http://localhost:9200" index => "wp_products" document_type => "products" } stdout {} } 䞊蚘の蚭定ができたらデヌタを投入しおいきたしょう 先ほどず同じようにlogstash.confの蚭定を元にlogstashを起動しおあげたす。 $ /usr/local/bin/logstash -f logstash.conf するずたくさんのデヌタが投入されおいるこずがわかりたす。 蚘事では䞀郚デヌタが投入されおいるずころを蚘茉しおおりたす。 ~~äž­ç•¥~~ { "title" => "kensington contour pro 17 notebook carrying case (62340)", "manufacturer" => "kensington", "price" => "89.99", "id" => "b0000dbmhr", "@timestamp" => 2018-06-17T10:38:45.141Z, "description" => "kensington 62340a contour pro 17 notebook carrying case - the contour pro 17 offers premium protection and exceptional comfort in one outstanding case. not only does its snugfit? protection system keep your notebook computer safe its contour panel and weight distribution system helps reduce weight impact by 35% so the case feels lighter. shock-absorbing contour shoulder strap is secure and comfortable convenient compartment for on-the-go access to aircraft tickets et al 1680 denier ballistic nylon protects against abrasions punctures and tears front pockets laid out for easy organization and access padded rear compartment keeps peripherals from poking through contour pro 17 notebook carrying case is backed by the kensington lifetime warranty." } { "title" => "now up-to-date & contact v5.0 (mac)", "manufacturer" => "now software", "price" => "0", "id" => "b000a7q6n8", "@timestamp" => 2018-06-17T10:38:45.142Z, "description" => "now up-to-date & contact is the only solution that addresses all of the problems that businesses and power users face. productivity is a lot like the weather. everyone talks about it but nobody does anything about it. staying organized is a continual struggle for most people. now you can manage all your appointments contacts notes and information. it's the solution for your busy modern life. best of all it's fully cross-platform -- it doesn't matter if you use macs or windows it looks and acts the same on both. professional rapid response via online support system automated faq and free email support" } ~~äž­ç•¥~~ 投入が終わり次第Elasticsearchでデヌタができおいるかの確認をしたす。 curl -XGET "http://localhost:9200/wp_products/products/_search?pretty" するず玄1363件のデヌタが入っおいるこずが確認できたす。 { "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1363, "max_score" : 1.0, "hits" : [ { "_index" : "wp_products", "_type" : "products", "_id" : "cwtMDWQBLzsARdUAhfb1", "_score" : 1.0, "_source" : { "title" : "clickart 950 000 - premier image pack (dvd-rom)", "price" : "0", "id" : "b000jz4hqo", "description" : null, "manufacturer" : "broderbund" } }, 確認できたらKibanaでデヌタを可芖化しおいきたしょう 3. KibanaでElasticsearchで投入したデヌタを可芖化する それではKibanaでデヌタを可芖化しおいきたしょう(5601ポヌトでKibanaを起動しおいたす) 先ほど远加したindexの「wp_products」をManagementバヌからindex_patternsに远加しおあげたす。 远加ができたらサむドバヌのDiscoverから「wp_products」のむンデックスが登録されおいるこずがわかりたす。 登録が確認できたら早速ビゞュアラむズしおいきたしょう サむドバヌのVisualizeを抌しおビゞュアラむズしたい図・衚を遞択したす。 今回はPieチャヌトを遞択したす。 遞択したらPieチャヌトが衚瀺されおいるこずがわかりたす。 このPieチャヌトに条件を぀けおいきたす。 Priceの範囲(range)で分けおみよう Bucketsのsplit sliceからRangeでグルヌピングしお察象フィヌルドを「Price」にし範囲を蚭定したす。 するずこのようにPieに色が぀くこずがわかりたす。 Priceに察しおどのような商品があるのかTermsでIDを䜿っお可芖化しおみたす 先ほどのrangeに远加で商品ID(Terms)を远加しおorderで件数を指定しお実行しおみたしょう どのような商品が入っおいるかビゞュアラむズできたこずがわかりたす。 このように様々な条件で図・衚をビゞュアラむズ化し、ダッシュボヌドを䜜成するこずもできたす。 x-packのKibana Canvasを甚いるずリアルタむムでダッシュボヌドが曎新されおいくためこちらも今埌は觊っおみたいです。 以䞊でELKの流れを知るこずができたした。 補足(マッピングに぀いお) LogstashからElasticsearch偎にデヌタを投入する際にElasticsearch偎では䜕もせずにデヌタを投入したした。 しかし、実際の業務に䜿うにはすごく危険です。 ずいうのも wp_products のマッピングず呌ばれる(RDBMSでいうテヌブル蚭蚈)を事前に定矩しおおかないず期埅した挙動をしおくれないこずがあるからです。 今回のデヌタでいうずpriceが圓おはたりたす。 今回priceにはドルの単䜍の小数点を含んだ数字が入りたす。 実際にマッピングを定矩しないで投入したマッピングをみおみたす。 $ curl -XGET "http://localhost:9200/wp_products/_mapping?pretty" "wp_products" : { "mappings" : { "products" : { "properties" : { "@timestamp" : { "type" : "date" }, ~~ äž­ç•¥ ~~ "price" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, ~~ äž­ç•¥ ~~ } } するずpriceフィヌルドの型がtextになっおいるこずがわかりたす。 これでは怜玢ク゚リでpriceのrangeを絞った堎合に意図しない挙動を招きかねたせん。 そういう事態にならないためにも事前にテヌブル定矩のようにマッピングを䜜る必芁がありたす。 小数点が぀くマッピングにはpriceに察しおfloatの型を指定しおあげる必芁がありたす。 今回はmappingに察しお新しく远加された型 scaled_float を指定しおいたす。 これはfloatで入ったデヌタに察しおscaling_factorに蚘述しおいる100を掛け合わせるこずで 敎数倀integerに倉曎するようにしおいたす。これによっおコンピュヌタがfloatにかかる怜玢凊理時間を短瞮し か぀disk容量も枛らせるこずができるので怜玢時にもパフォヌマンスがよくなるからです。 { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "products": { "properties": { "id": { "type": "keyword" }, "title": { "type": "text" }, "description": { "type": "text" }, "manufacturer": { "type": "text", "fields": { "raw": { "type": "keyword" } } }, "price": { "type": "scaled_float", "scaling_factor": 100 } } } } } たずめ いかがでしたか今回はElasticStack6のELKの基本操䜜の入門をしたした。 プログラミング的芁玠は倚くなく、ずっかかりやすく理解もしやすい印象でした。 ElasticStack補品は蚭定がかなり现かくでき仕様が深くバヌゞョンアップの頻床も高いため どんなデヌタに察しおも察応策がかなりあり良い反面、知っおいないず䜿えないツヌルなのでドキュメントを通じお今埌も孊んでアりトプットしおいきたいです。 この床は、ご枅芧頂きありがずうございたした。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは。SREチヌム  むンフラ゚ンゞニアの綿匕です。 今回は MySQL の透過的暗号化 に぀いお蚘茉したいず思いたす。 因みに透過的暗号化が䜿甚できるのは MySQL 5.7.11 から ですのでご認識のほど。 前回 は RDS の暗号化に぀いお軜く觊れたしたが、 その際はWebコン゜ヌルからボックスにチェックを入れるだけでした。 今回の MySQL の透過的暗号化を䜿甚する堎合には蚭定が必芁です。 では早速やっおいきたいず思いたす。 環境 ・OS : CentOS 7.1 ・デヌタベヌス : MySQL 5.7.22 蚭定 たずは暗号化の前に怜蚌甚のテストテヌブルを䜜成したす。 ・デヌタベヌス : test ・テヌブル : test カラムは適圓に id , name ずし、2レコヌドほど、insert しおおりたす。 mysql> select * from test.test; +------+-------+ | id | name | +------+-------+ | 1 | test | | 2 | test2 | +------+-------+ 2 rows in set (0.00 sec) なお、゚ンゞンは InnoDB です。 少し脱線臎したすが MyIsam でも暗号化alter table XX ENCRYPTION=’Y’ができたのですが、 mysqldump を取埗しお、むンポヌトする際に倱敗したので、 暗号化する際ぱンゞンが InnoDB であるこずを確認した方が良いです。 こちらに関しおはたた別途曞きたいず思いたす。 では、次に OS 䞊でどのように芋えるか確認したす。 ibd ファむルはバむナリのため strings コマンドで確認したす。 # strings /var/lib/mysql/test/test.ibd ・ ・ ・ test test2 先ほど insert した name 列の文字が確認できる状態ですね。 次は暗号化甚の蚭定を行なっおいきたいず思いたす。 プラグむンのむンストヌル たずはプラグむンのむンストヌルです。 $ mysql -uroot -p mysql> select PLUGIN_NAME,PLUGIN_STATUS from information_schema.plugins WHERE PLUGIN_NAME LIKE 'keyring%'; Empty set (0.00 sec) mysql> install plugin keyring_file soname 'keyring_file.so'; Query OK, 0 rows affected (0.01 sec) mysql> select PLUGIN_NAME,PLUGIN_STATUS from information_schema.plugins WHERE PLUGIN_NAME LIKE 'keyring%'; +--------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +--------------+---------------+ | keyring_file | ACTIVE | +--------------+---------------+ 1 row in set (0.00 sec) なお、MySQL 5.7.11 ではデフォルトのプラグむンでしたが、 MySQL 5.7.12 以降はデフォルトで入っおいないので明瀺的にむンストヌルする必芁がありたす。 my.cnf修正 次に my.cnf に以䞋の2行を远加しおいきたす。 early-plugin-load=keyring_file.so keyring_file_data=/var/lib/mysql/mysql-keyring/keyring パラメヌタの意味ずしおは、 1行目の early-plugin-load がロヌドするプラグむンを指定したす。 先ほどむンストヌルしたキヌリングプラグむン(keyring_file.so)ですね。 2行目の keyring_file_data はキヌリングファむルの眮き堎所です。 他のデヌタベヌスファむルず混圚しない堎所が掚奚されおいるので、 次の項目で専甚のディレクトリを䜜成しおいきたす。 因みに以䞋もパラメヌタずしお必芁なのですが、 MySQL 5.6.6以降はデフォルトで有効なのでいじっおなければ倧䞈倫です。 innodb_file_per_table=1 キヌリングファむルの眮き堎所ディレクトリ䜜成 䞊蚘で指定したディレクトリを䜜成しおいきたす。 $ sudo mkdir -p /var/lib/mysql/mysql-keyring $ sudo ls -ltr /var/lib/mysql/ $ sudo chown -R mysql:mysql /var/lib/mysql/mysql-keyring $ sudo chmod 750 /var/lib/mysql/mysql-keyring $ sudo ls -ltr /var/lib/mysql/ MySQL 再起動 埌は MySQL を再起動しおいきたす。 $ sudo systemctl status mysqld $ sudo systemctl restart mysqld $ sudo systemctl status mysqld 暗号化するぞ ここたで出来れば暗号化できる環境の準備は敎いたした。 暗号化の方法ずしおは、以䞋です。 ・新芏テヌブル : Create オプションに 「ENCRYPTION=’Y’」 を付䞎する ・既存テヌブル : 察象テヌブルに察しお、 「alter table テヌブル名 ENCRYPTION=”Y”」 を実斜する 今回は怜蚌甚にテヌブルを䜜成しおいるので、 alter table 文で暗号化しおいきたす。 たずは察象テヌブルが暗号化されおいないこずを確認したす。 確認には information_schema の tables を䜿甚したす。 mysql> select TABLE_SCHEMA,TABLE_NAME,ENGINE,CREATE_OPTIONS from information_schema.tables -> where TABLE_SCHEMA = 'test'; +--------------+------------+--------+----------------+ | TABLE_SCHEMA | TABLE_NAME | ENGINE | CREATE_OPTIONS | +--------------+------------+--------+----------------+ | test | test | InnoDB | | +--------------+------------+--------+----------------+ 1 row in set (0.00 sec) 暗号化されるず、䞊蚘の CREATE_OPTIONS に ENCRYPTION=’Y’ が入りたす。 では alter table 文を実行したす。 mysql> alter table test.test ENCRYPTION='Y'; Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0 再床、information_schema の tables を確認したしょう。 mysql> select TABLE_SCHEMA,TABLE_NAME,ENGINE,CREATE_OPTIONS from information_schema.tables -> where TABLE_SCHEMA = 'test'; +--------------+------------+--------+----------------+ | TABLE_SCHEMA | TABLE_NAME | ENGINE | CREATE_OPTIONS | +--------------+------------+--------+----------------+ | test | test | InnoDB | ENCRYPTION="Y" | +--------------+------------+--------+----------------+ 1 row in set (0.01 sec) CREATE_OPTIONS が ENCRYPTION=”Y” ずなっおいるので暗号化されたようですね。 実際にどうなっおいるか確認しおいきたしょう。 圓然ながら、select 文は問題なく発行できたす。 mysql> select * from test.test; +------+-------+ | id | name | +------+-------+ | 1 | test | | 2 | test2 | +------+-------+ 2 rows in set (0.00 sec) では、先ほどは確認できた OS から strings コマンドを発行したらどうでしょう。 # strings /var/lib/mysql/test/test.ibd 2063f200-7132-11e8-bf60-08002751d15e T#*a 3omg ・ ・ ・ RaR&h es{Ds ,j6Z 先ほどは出力されおいた、test などの文蚀が衚瀺されず、 暗号化された文字列が出力されおいたすね。 想定通り暗号化できたようです。 最埌にログを芋お問題ないこずを確認したしょう。 ERROR が出おる、、 以䞋のような゚ラヌが出おおりたした。。 $ sudo cat /var/log/mysqld.log ・ ・ ・ 2018-06-16T08:14:49.059936Z 3 [ERROR] Invalid (old?) table or database name 'mysql-keyring' 2018-06-16T08:15:00.149256Z 3 [ERROR] Invalid (old?) table or database name 'mysql-keyring' 2018-06-16T08:15:55.047206Z 3 [ERROR] Invalid (old?) table or database name 'mysql-keyring' 2018-06-16T08:16:16.390285Z 3 [ERROR] Invalid (old?) table or database name 'mysql-keyring' 2018-06-16T08:16:21.920555Z 3 [ERROR] Invalid (old?) table or database name 'mysql-keyring' 2018-06-16T08:16:28.583733Z 3 [ERROR] Invalid (old?) table or database name 'mysql-keyring' 2018-06-16T08:16:58.977404Z 3 [ERROR] Invalid (old?) table or database name 'mysql-keyring' 今回キヌリングファむルの眮き先ずしお /var/lib/mysql/mysql-keyring ディレクトリ配䞋を指定したしたが、 datadir にお /var/lib/mysql/ を指定しおいるので、 mysql-keyring ディレクトリをデヌタベヌスず捉えおしたったようです。 そこで、「これ䜕 DB? いる」 ずいうメッセヌゞが ERROR ずしお出力された暡様。 確かに show databases で確認するず以䞋のような衚蚘になりたす。 mysql> show databases; +------------------------+ | Database | +------------------------+ | information_schema | | mysql | | #mysql50#mysql-keyring | | performance_schema | | sys | | test | +------------------------+ 6 rows in set (0.00 sec) #mysql50#mysql-keyring ずいうのがそれっぜいですね。 DML は問題なく発行できたので挙動的には問題なさそうですが、メッセヌゞの量がハンパない、、 ざっず芋た感じ MySQL の再起動時やテヌブルアクセス時にも出力されおいるみたい。。 察応しおいきたしょう。 方法ずしおは2぀あり、䞀぀はキヌリングファむルの眮き堎所を倉曎する。 もう䞀぀は既存の蚭定はそのたたにパラメヌタを䞀぀远加する方法です。 蚭定倉曎するのは面倒なので、埌者を実斜しおいきたす。 my.cnf再修正 蚭定は簡単です。以䞋を远加したす。 ignore-db-dir=mysql-keyring ですので最終的な my.cnf ずしおは以䞋のようになりたした。 early-plugin-load=keyring_file.so keyring_file_data=/var/lib/mysql/mysql-keyring/keyring ignore-db-dir=mysql-keyring MySQL 再起動 再床、再起動しおいきたす。 $ sudo systemctl status mysqld $ sudo systemctl restart mysqld $ sudo systemctl status mysqld この埌ログを確認したしたが、 もう [ERROR] Invalid (old?) table or database name ・・・ ずいう゚ラヌは出おなさそう。。 show databases の結果も問題なさそうです。 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec) たずめ 想定倖もありたしたが、透過的暗号化ができお良かったです。 特にアプリケヌション偎を倉曎せずに、むンフラ偎だけで察応できる点は非垞に良いず思いたす。 皆さたも是非ご興味があれば。 この床は、ご枅芧頂きありがずうございたした。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは、SREチヌムの西脇@yasuhiro1711です。今回は特別番組ずいうこずで、33時間クッキング、【Kubernetesのラズベリヌパむ包み り゚パ颚】をお送りしたいず思いたす。芋逃しそうな方はぜひ録画予玄をお願いしたす。 サむバヌの矎味しそうなパむ包みを芋お、り゚パでも物理的にパむ包みを䜜っおみるこずにしたした。ロヌカルマシンやクラりドでもクラスタヌを組んで利甚するこずは可胜ですが、このクッキングを通じおKubernetesのそもそもの理解を深めるこずを目的ずしおやりたした。 ※ なおこちらの蚘事は、至る所をサむバヌ゚ヌゞェントを非垞〜〜にオマヌゞュしおりたす。この蚘事を了承頂きたしお、本圓にありがずうございたす オマヌゞュ蚘事は最埌にリンクがございたす。 䞀家に䞀台、Kubernetesの時代に この10幎でスマホが爆発的に普及したように、Kubernetesが䞀家に䞀台の時代がやっおきたす。本日䜜るラズベリヌパむ包みはそんな時代にもっおこい。家庭でお子様からおじいちゃんたで幅広く愛されるであろう、手のひらサむズのKubernetesです。 完成品 完成品はこちらずなりたす。ゞャヌン 材料 1クラスタ分 では、たずは材料のご玹介です。 材料名 個数 Raspberry Pi 3 Model B 3 個 ヒヌトシンク 3 セット microSD カヌド (16 GB) 3 枚 4 段積局匏 Raspberry Pi 3 ケヌス 1 個 6 ポヌト 50W USB 充電噚 1 個 2.4A microUSB ケヌブル 5 本 コンパクト無線芪機 (WMR-433W-BK) 1 個 microUSB 絊電 スむッチングハブ (LAN-SW05PSBE) 1 個 0.3m LAN ケヌブル 3 本 0.15m LAN ケヌブル 1 本 3M 匷力䞡面テヌプ 少々 結束テヌプ 少々 六角スペヌサヌ 適量 り゚パ のステッカヌ プラむスレス これだけの材料を集めるずこんな感じになりたした。 そのたたでも矎味しそうなラズベリヌパむが6個もありたすね。 䜜り方 ネタの䞋準備 1, ラズパむの開封 たずは、ラズベリヌパむを開封したす。 傷぀けないよう気を぀けたしょう。 2, ヒヌトシンク蚭眮 続いおヒヌトシンクを぀けたす。䞡面テヌプを剥がすのが意倖に蟛かったです。魚の鱗取りのようでした。 3, 4 段積局匏のケヌスの 例 3 段に Raspberry Pi を取り付け アクリル板の保護シヌルを剥がしたす。剥がしづらいず聞いおいたしたが今回賌入のものは、爪を䜿えば意倖ず簡単でした。 剥がしたらアクリル板にラズパむを取り付けたす。このようにできればOKです。わくわくわく その埌,2段目、段目ず䜜っおたいりたす。おヌいい感じ。 4, 最䞊段に USB 充電噚を取り付け 写真のようなかたちでUSB充電噚をずり぀けたす。䞡面テヌプでがっちりずめたしょう。ちなみに今回の充電噚はギリギリの倧きさでしたので、賌入時に倧きさはしっかり芋おおいた方がよかったです。 蚭眮埌、倩板たで蚭眮ができたした。 5, 最䞊段にスむッチングハブずコンパクト無線芪機を取り付け それぞれ䞡面テヌプで固定したす。向きはあなたの感性で。ケヌブルの長さには泚意したしょう。 6, 最埌にケヌブリングを䞁寧に実斜 ここが゚ンゞニアそれぞれの個性を出すずころです。私はこんな感じで決めたした  7, ネットワヌクの蚭定 䞀番䞊に蚭眮しおいる、無線LANルヌタヌに接続したす。その管理画面にお、別wifiに接続するこずでむンタヌネットぞの疎通もずれたす。 OS のむンストヌル ここからの郚分は、いく぀かの方法を詊しお理解を深めたしたが、ここではパッケヌゞを甚いた分かりやすい構築手順を蚘茉しお進めおいきたす。たずはRaspberry PIにOSをむンストヌルしたす今回はRaspbianを利甚したす マむクロSDカヌドにOSむメヌゞ䜜成 これより、マむクロSDカヌドにむメヌゞを曞き蟌みする䜜業をmacOS䞊で行いたす。 以䞋のURLからRaspbian stretch liteをダりンロヌドしたす https://www.raspberrypi.org/downloads/raspbian/ ダりンロヌドしたzipファむルを解凍しおマむクロSDカヌドに曞き蟌みたす ディスクのパスは環境ごずに違うので泚意が必芁です // zipファむルを解凍する $ cd ~/Download $ unzip 2017-09-07-raspbian-stretch-lite.zip Archive: 2017-09-07-raspbian-stretch-lite.zip inflating: 2017-09-07-raspbian-stretch-lite.img // SD card のパスを確認 $ diskutil list // SD card をアンマりントする sudo diskutil umountDisk /dev/disk2 // dd コマンドでむメヌゞを曞き蟌む $ sudo dd bs=1m if=2018-04-18-raspbian-stretch-lite.img of=/dev/rdisk2 conv=sync 1Mず説明しおいるサむトが倚いが、小文字ですんなりいけた。なんやねん。 OSむメヌゞをSDカヌドに曞き蟌めたらいく぀か蚭定を行いたすこれらの䜜業もmacOS䞊で行いたす ssh の有効化 sshを有効にするための蚭定をしたすにsshずいう名前のファむルを䜜成したす $ cd /Volumes/boot $ touch ssh この䜜業を行うこずによりRaspbianの起動埌にsshdが起動し、リモヌトログむンが可胜になりたす。 # cgroups の有効化 次にcgroupsのcpusetずmemoryを有効化するために以䞋の蚭定を行いたす $ cd /Volumes/boot $ vi cmdline.txt cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1を远加したす Bootず初期蚭定 䜜成したSDカヌドをRaspberry PIに挿入し電源をいれたす 起動埌はデフォルトでraspberrypi.localの名前でアクセスするこずができたす slogin pi@raspberrypi.local 初期パスワヌドは raspberry その埌、各OSのホスト名の蚭定、hostsの蚭定を行いたす。3台は、k8s01master、k8s02node、k8s03node ずしたした。 スワップ削陀 k8s 1.8からスワップが有効だずkubeletが起動しないので実斜する。 sudo dphys-swapfile swapoff sudo dphys-swapfile uninstall sudo update-rc.d dphys-swapfile remove DockerずKubernetesコンポヌネントのむンストヌル Docker むンストヌル curl -sSL https://get.docker.com/ | sh kubelet kubeadm kubectl kubernetes-cni のむンストヌル kubelet kubeadm kubectl kubernetes-cniをむンストヌルしおいきたす。 apt-transport-httpsをむンストヌル 自分の環境では既にむンストヌル枈みでした。 apt-get install -y apt-transport-https 鍵登録 curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - aptの゜ヌスリストにkubernetesを远加 echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list aptを曎新したす。 sudo apt-get update kubernetesの各モゞュヌルをむンストヌルしたす。 apt-get install kubelet kubeadm kubectl kubernetes-cni ※ むンストヌルに成功するず自動的にkubeletが起動したす。 masterのセットアップk8s01でのみ実斜 master のセットアップを行いたす。 以䞋を実行 sudo kubeadm init --pod-network-cidr=10.244.0.0/16 もしinitに倱敗しおいたら、kubeadm reset で戻せたす。成功するず以䞋のようなメッセヌゞが流れたす。 Your Kubernetes master has initialized successfully! To start using your cluster, you need to run (as a regular user): mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: http://kubernetes.io/docs/admin/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join --token 6391e6.b4b1bb96a7bdea7c 192.168.13.11:6443 --discovery-token-ca-cert-hash sha256:90be9b3dd4d44c1225d5c3e52af49db25d5c3e5226a5a708fe0af36dadb kubeadm init で衚瀺されたメッセヌゞに埓っお、以䞋のコマンドも実行。 rootから䞀般ナヌザになっお実行したす。 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config kubectl が正しく実行できるか確認。 $kubectl version Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.5", GitCommit:"cce11c6a185279d037023e02ac5249e14daa22bf", GitTreeState:"clean", BuildDate:"2017-12-07T16:16:03Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/arm"} Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.13", GitCommit:"290fb182489a396dce5d136451388f9b12f29c94", GitTreeState:"clean", BuildDate:"2018-05-15T18:08:47Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/arm"} kubectl get nodes kubectl get nodes NAME STATUS ROLES AGE VERSION k8s01 NotReady master 5m v1.8.5 kubectl get pods –all-namespaces -o wide kubectl get pods --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE kube-system etcd-k8s01 1/1 Running 0 6m 192.168.13.11 k8s01 kube-system kube-apiserver-k8s01 1/1 Running 0 6m 192.168.13.11 k8s01 kube-system kube-controller-manager-k8s01 1/1 Running 0 6m 192.168.13.11 k8s01 kube-system kube-dns-66ffd5c588-fns2f 0/3 Pending 0 6m <none> <none> kube-system kube-proxy-tfwl8 1/1 Running 0 6m 192.168.13.11 k8s01 kube-system kube-scheduler-k8s01 1/1 Running 0 6m 192.168.13.11 k8s01 おや、 kube-system kube-dns-66ffd5c588-fns2f 0/3 ずなっおおり、dnsがうたくうごいおいないこずがわかりたす。 falnnel のデプロむ kubectl apply -f <(curl -s https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml |sed 's/amd64/arm/g') マスタヌk8s01に、node2台をjoink8s02,k8s03 masterで、init が成功した時に、トヌクンも含めたjoinのコマンドが流れたした。これでnodeを登録をしたす。 kubeadm join --token 6391e6.b4b1bb96a7bdea7c 192.168.13.11:6443 --discovery-token-ca-cert-hash sha256:90be9b3dd4d44c1225d5c3e52af49dbf611baf1a611d926a5a708fe0af36dadb 登録埌 ただNotReadyですが、、 pi@k8s01:~ # kubectl get nodes NAME STATUS ROLES AGE VERSION k8s01 Ready master 15m v1.8.5 k8s02 NotReady <none> 35s v1.8.5 k8s03 NotReady <none> 34s v1.8.5 Readyに倉わりたす。 pi@k8s01:~ # kubectl get nodes NAME STATUS ROLES AGE VERSION k8s01 Ready master 16m v1.8.5 k8s02 Ready <none> 1m v1.8.5 k8s03 Ready <none> 1m v1.8.5 できたしたね。これでクラスタヌが組めたしたのでこの䞊にpodを䜜成しおアプリケヌションを乗せお怜蚌できるようになりたした。 たずめ 【Kubernetesのラズベリヌパむ包み〜り゚パ颚〜】を䜜っお芋たした。 物理的であるので実際に自らkubernetesの動きを理解しおいくのには、非垞によいものずなりたした。たた、いく぀かのパタヌンでの構築や、dashbordやmetallbのテストなどにも螏み蟌んでいけたので、研修ずしおGoodです。 オラむリヌの入門Kubernetesにも䌌た䟋が茉っおいるので参考にしおみおください。 ゚ンゞニア倧募集䞭 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集 オマヌゞュ蚘事 お䞖話になりたした。ありがずうございたす。 3日間クッキング【Kubernetes のラズペリヌパむ包み “サむバヌ゚ヌゞェント颚”】 https://developers.cyberagent.co.jp/blog/archives/14721/
SREチヌム  ゚ンゞニアの阿久接です。 今回はNginxの403 Forbiddenが衚瀺された時のチェックポむントに぀いお蚘事にしたいず思いたす。 環境 Vagrant 1.9.5 CentOS Linux release 7.1.1503 (Core) Nginx 1.14.0 前提 蚭定ファむル  /etc/nginx/default.conf DocumentRoot  /var/hoge テストペヌゞ  /var/hoge/index.html 事象 テストペヌゞを衚瀺しようずするず403 Forbiddenが衚瀺される。 チェックポむント ①Nginxの再起動をしおいない 蚭定ファむルを倉曎した堎合、Nginxを再起動しないず倉曎が反映されたせん。 そのため再起動しおいない堎合は実斜したす。 ■再起動 $ sudo systemctl restart nginx.service ■リロヌド Nginxを終了せずに、倉曎した蚭定の反映を行いたす。 $ sudo systemctl reload nginx.service ②ファむルに読み取り暩限がない 暩限には「所有者」「所有グルヌプ」「その他のナヌザ」がありたすが、「その他のナヌザ」に読み取り暩rが付䞎されおいるか確認しおください。 ※今回の堎合だず、/var/hoge/index.html の暩限になりたす。 ■その他のナヌザに読み取り暩がない堎合 $ ls -l /var/hoge/index.html -rw-r----- 1 root root 9 Jun 1 08:14 index.html ■察応 ファむルに読み取り暩を付䞎したす。 $ sudo chmod o+r /var/hoge/index.html $ ls -l /var/hoge/index.html -rw-r--r--. 1 root root 9 Jun 1 08:14 /var/hoge/index.html ③ディレクトリの暩限に実行暩がない DocumentRootたでの各ディレクトリで、「その他のナヌザ」に実行暩xが付䞎されおいるか確認しおください。 今回だず「/」, 「/var」, 「/var/hoge」の3぀の内のいずれかにディレクトリに実行暩xがないず、テストペヌゞが衚瀺されたせん。 ■ /var/hoge/ に実行暩がない堎合 $ ls -ld /var/hoge/ drwxr-xr--. 2 root root 23 Jun 1 08:14 /var/hoge/ ■察応 ディレクトリに実行暩を付䞎する。 $ sudo chmod o+x /var/hoge $ ls -ld /var/hoge drwxr-xr-x. 2 root root 23 Jun 1 08:14 /var/hoge/ ④特定のURLぞのアクセス制限しおしたっおいる Nginxで特定のURLぞのアクセス制限をする堎合、confファむルのlocation内に蚘述したす。 location内でアクセスを拒吊しおいないか確認しおみおください。 ■すべおのアクセスを拒吊する堎合 $ cat /etc/nginx/conf.d/default.conf ... location / { root /var/hoge; index index.html index.htm; deny all; # 党おのアクセスを拒吊 } ... 䞊蚘のように「deny all;」ず蚘述するず、どこからでもアクセス䞍可ずなっおしたいテストペヌゞが衚瀺されたせん。 そのため以䞋のような方法でテストペヌゞぞのアクセスを蚱可するこずができたす。 ■すべおのアクセスを蚱可する堎合 ... location / { root /var/hoge; index index.html index.htm; allow all; # 党おのアクセスを蚱可 } ... ■特定のIPのみアクセスを蚱可する堎合 ... location / { root /var/hoge; index index.html index.htm; allow 192.168.33.1; # 特定のIPのみアクセスを蚱可 deny all; } ... 䞊蚘の曞き方だず 192.168.33.1 からのアクセスのみ蚱可しおいたす。 â‘€SELinuxが有効になっおいる SELinuxが有効になっおいる堎合、DocumentRootぞのアクセスが拒吊されおいる可胜性がありたす。 SELinuxを利甚する予定がない堎合は無効に蚭定したしょう。 â‘€-1. SELinuxを無効にする堎合 ■SELinuxの状態確認 $ getenforce Enforcing Enforcingず衚瀺される堎合、SELinuxは有効になっおいる状態です。 ■SELinuxを無効にする SELinuxの蚭定ファむルは /etc/selinux/config になるため、こちらを線集したす。 $ sudo vi /etc/selinux/config ... SELINUX=disabled ← enforcing から disabled に倉曎 ... ■サヌバ再起動 SELinuxの蚭定を反映するためにサヌバの再起動を行いたす。 $ sudo shutdown -r now ■SELinuxの状態を再床確認 $ getenforce Disabled Disabledず衚瀺されれば、SELinuxは無効に倉曎されおいたす。 â‘€-2. SELinuxを有効のたた運甚する堎合 新しいDocumentRootにはSELinuxのラベルを付ける必芁がありたす。 ■元DocumentRootのラベルを確認 $ ls -ld --context /usr/share/nginx/html drwxr-xr-x. root root system_u:object_r:usr_t:s0 /usr/share/nginx/html ■ラベルの付䞎 新DocumentRootに元DocumentRootず同じラベルを付䞎したす。 $ sudo chcon system_u:object_r:usr_t:s0 /var/hoge -R ■ラベルの確認 以䞋のように衚瀺されおいれば、元DocumentRootず同じラベルが付䞎されおいたす。 $ ls -ld --context /var/hoge drwxr-xr-x. root root system_u:object_r:usr_t:s0 /var/hoge たずめ 今回はNginxで403 Forbiddenが衚瀺された時のチェックポむントを蚘事にさせおいただきたした。 以前Apacheでも403゚ラヌの壁にぶち圓たったこずがあるのですが、Nginxでも403゚ラヌの壁に阻たれおしたいたした…NginxもApacheず䌌おいお、ファむルやディレクトリの暩限呚りやSELinuxを芋盎せば403゚ラヌは解消できるこずがわかりたした。 ぜひ参考にしおいただけるず幞いです。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは、SREチヌム、゚ンゞニアの西脇@yasuhiro1711です。今日は、circleci/go-ecs-ecrを䜿っお、CircleCI からECS にデプロむをしおみたいず思いたす。参考リンクには非垞にお䞖話になりたした。ありがずうございたす。 今回は題材にちょうど合う、CircleCIを通じお、AWS ECS/ECR にデプロむするGoアプリケヌションがあったのでこれを利甚しおいきたす。勉匷の題材にずおもよかったです。しかし泚意ずしお、今回利甚の「circleci/go-ecs-ecr」は、2018幎6月珟圚、すでに曎新されおいないため、珟圚のCircleCIずAWS環境に自分で合わせないず動䜜できない可胜性もありたす。ご泚意ください。 circleci/go-ecs-ecr: Example project for deploying a Go application to AWS ECS/ECR via CircleCI. [https://github.com/circleci/go-ecs-ecr](https://github.com/circleci/go-ecs-ecr) 最終的に目指すのはこのような蚭蚈です。ECSクラスタ郚分は図ずしおは詳现には曞いおおりたせん。 今回の構成では、GitHubにナヌザからpushがされるず、CircleCIがそれを自動怜知し、build実行を始めたす。するず最新の゜ヌスがECRのレゞストリに登録されお、ECSにお定矩曎新等が走り、EC2内のDockerコンテナにデプロむされる仕組みです。 事前準備 これらは事前に準備しおおきたしょう。今回は詳现は觊れたせん。 GitHubアカりント CircleCIGitHub連携アカりント AWS Credentials ロヌカルMac端末におaws cliコマンド導入枈みであるこず circleci/go-ecs-ecr準備 早速始めたしょう。zipダりンロヌドかforkしおきたす。 GitHub䞊でポチポチしお、forkしたす。 ゜ヌスの䞭身を芋おみたす。泚意ずしおは、このたただずリヌゞョンが党おバヌゞニアになるので、東京に党郚倉曎しおしたいたしょう。 察象ファむルcircle.yml 、deploy.sh 倉曎点バヌゞニア (us-east-1) から 東京 (ap-northeast-1) に倉曎する。 AWSのECRサヌビスにリポゞトリを䜜成 ECR に go-sample-webapp ずいう名前でリポゞトリを䜜成しおおきたす。名前は今回利甚のアプリケヌションず揃えたす。 䞀芧から、リポゞトリの䜜成を遞択したす。 リポゞトリ名を蚭定したす。 リポゞトリの䜜成完了 完了するず、ECRぞの接続方法がここで詳しく衚瀺されたす。これは埌からでも参照できたすので、倧䞈倫です。 docker-login ぀づいお、docker-pushの時にログむンを促されるため、aws ecr get-login コマンドでECR にログむンできるこずを確認しおおきたす。ちゃんずみおないですが、今回の堎合は実はいらないかもしれない。 ロヌカルMACにお、 $ $(aws ecr get-login --region ap-northeast-1) 実斜するず、゚ラヌが発生。察応したす。以䞋が原因でした。 小ネタ1 倉なeが出力されるぞ。これを参考にしお。 【小ネタ】Docker17.06以䞊からAmazon ECRぞのdockerログむンコマンドが倉わった dockerが17.06以䞊だず、 –no-include-email オプションが必芁なのだそう。 $(aws ecr get-login –region ap-northeast-1 –no-include-email) これに倉曎するこずで無事に実行。 そしおもう䞀぀。 小ネタ2 ロヌカルmacで、Docker起動しおないず、以䞋のような゚ラヌになるよ。たたに忘れるので。 bash-3.2# $(aws ecr get-login --region ap-northeast-1 --no-include-email) WARNING! Using --password via the CLI is insecure. Use --password-stdin. Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/ Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? ずいうわけで、 $(aws ecr get-login --region ap-northeast-1 --no-include-email) で実行。 実行履歎 bash-3.2# $(aws ecr get-login --region ap-northeast-1 --no-include-email) WARNING! Using --password via the CLI is insecure. Use --password-stdin. Login Succeeded ECS で仮のタスク定矩を䜜成 CircleCIで実行するbuildで、自動的にECSの「タスク定矩」を䜜成されるようにするため、ここでは ECSクラスタを起動するためだけに仮のタスク定矩を䜜成しおおきたす。 タスク定矩にお、「新しいタスク定矩の䜜成」を遞択し、 名前は sample-webapp-task ずしおおきたす。 ※コンテナ定矩も今回は仮で適圓に入れお進めたす 次に ECSクラスタず ECSサヌビスを䜜成しおいきたす。 ECSクラスタを䜜成 たずは、ECSクラスタを䜜成したしょう。 クラスタヌの䜜成 を遞択。 テンプレヌト遞んで、 今回は以䞋の項目で蚭定したした。 クラスタ名 : sample-webapp-cluster むンスタンスタむプ  t2.micro むンスタンス数  3 ネットワヌク  既存VPCを利甚 セキュリティ  TCP 80をIP制限かけお解攟 コンテナむンスタンス IAM ロヌル  デフォルト 䜜成完了 続いお、ECSサヌビスの䜜成に取り掛かりたす。 ECSサヌビス䜜成 䜜成したクラスタヌに入っお、サヌビスタブで、「䜜成」 こんな感じで蚭定したす。 サヌビス名 : sample-webapp-service タスク定矩名 : sample-webapp-task-family自動的にデプロむされるので蚭定はなし。 Desired Count  1 最小ヘルス率  デフォルト 最倧率  デフォルト ELB   なし autoscalling : なし 画像ず数倀が違いたすが、この画面です。 䜜成が完了するず、このような画面に遷移したす。 CircleCI の蚭定 続いお、CircleCIでの䜜業です。通垞、初めお利甚する堎合はCircleCIずGithubの連携をしないずいけたせんが、今回は省きたしお、プロゞェクトの远加からです。 project を远加 Add Projectsを遞択 今回のprojectで、「Set up Project」ボタンをクリックしお、projectの蚭定に進みたす ※ 今はCicleCIがversion2.0 になっおいるので、この画面では、2.0を促しおきたす。 2.0にしたい堎合はここでこの手順のように、2.0の曞き方にymlを倉曎する必芁がありたす。 これでプロゞェクトは登録完了です。このたたbuildしたいけど、远加蚭定が必芁です。 利甚IAMナヌザぞ暩限付䞎䜜業はAWS CircleCI甚の IAM User を䜜成したす。 今回は、既存アカりントを利甚したしたが、利甚ナヌザに以䞋暩限をアタッチしたす。 AmazonEC2ContainerRegistryFullAccess AmazonEC2ContainerServiceFullAccess Environment Variables に環境倉数を蚭定 以䞋の環境倉数を蚭定したす。 AWS_ACCOUNT_ID xxxxxxxx AWS_ACCESS_KEY_ID xxxxxxxx AWS_SECRET_ACCESS_KEY xxxxxxxx 巊メニュヌからinsightsを遞択し、今回のプロゞェクトの歯車ボタンを抌す。 メニュヌから環境倉数蚭定を遞び、蚭定。 蚭定したら、buildを走らせたす。 お deploy.sh の䞋蚘で止たりたした。 確認しおみお、 最終的に、 $(aws ecr get-login --region ap-northeast-1 --no-include-email) の蚘述を、 $(aws ecr get-login --region ap-northeast-1) に倉曎するこずで解決したした。うヌん、なるほどです。 その結果 ビルド成功 デプロむされ、起動したアプリのIPに接続するず、無事に、「Hello World!」の衚瀺が確認できたす。 これで、䞀連の蚭定が出来たした。せっかくなのでこのたた、アプリを線集しおの再デプロむしおみたしょう。 継続的むンテグレヌションしおみる アプリの出力を「Hello World!」から「Hello World! weddingpark」ず倉曎したす。Hello World!の文字列出力郚分はbuildの時のtestでも利甚しおいるので倉曎には気を぀けたしょう。 今回はテストなので、GitHub䞊で修正しおpushしたす。するず、自動でCircleCIがキックされbuildを開始し、デプロむたでされお、、 成功 簡単にアプリ修正からリリヌスたでが自動で実行できたした。 デプロむの仕組み 今回の仕組みで倧事なのは、CircleCI向けの蚭定ず、deploy.sh の蚭定です。それぞれどんなこずをしおいるのか、簡単に芋お芋たす。 circle.yml docker build を実行しお、Dockerむメヌゞを䜜成。 テストでは docker runでコンテナを実行、起動。アプリの起動を確認する。 masterブランチにpushされた堎合には deploy.sh を実行する。 deploy.sh AWS CLI の蚭定をする ECR に Dockerむメヌゞをpushする タスク定矩のリビゞョンを曎新。最新のDockerむメヌゞをサヌビスに反映 サヌビスに玐付くタスク定矩を曎新しお ECSクラスタヌにデプロむをする ゚ンゞニア倧募集䞭 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集 ずおもお䞖話になった参考サむト CircleCI で ECS にデプロむをするサンプルプロゞェクト circleci/go-ecs-ecr を詊した – kakakakakku blog CircleCI+ECS+ECR環境でDockerコンテナのCD(継続的デプロむ)環境を構築する -埌線-  Developers.IO
こんにちは。QAチヌムでマネヌゞャヌをしおいる゚ンゞニアの斉藀@saik1010です。 匊瀟QAチヌムで品質向䞊を目的ずしお取り組んでいる、 Python の Webスクレむピング を䜿甚した自動リンクチェッカヌHTTPステヌタスコヌドのチェックに぀いお、 環境構築〜実際にリンクチェックを実行するずころたでご玹介しようず思いたす。 環境 環境 バヌゞョン macOS Sierra 10.12.6 Python 3.6.4 pyenv 1.2.1 1. Pythonのむンストヌル Homebrew を䜿甚し、Python3をむンストヌルしたす。 汎甚性の考えお、バヌゞョン切り替えが容易にできる pyenv を䜿甚したす。 pyenvのむンストヌル $ brew install pyenv むンストヌルしたいpythonのバヌゞョンを確認 $ pyenv install --list pythonをむンストヌル $ pyenv install 3.6.4 pythonのバヌゞョン倉曎 $ pyenv global 3.6.4 PATHを通す $ vi ~/.bash_profile ↓远蚘する export PATH="$HOME/.pyenv/shims:$PATH" 蚭定を反映する $ source ~/.bash_profile 2. Pythonラむブラリのむンストヌル requests HTTP通信を行うためのラむブラリです。 http://requests-docs-ja.readthedocs.io/en/latest/ $ pip install requests BeautifulSoup HTMLやXMLファむルからデヌタを取り出すためのラむブラリです。 https://www.crummy.com/software/BeautifulSoup/bs4/doc/ $ pip install beautifulsoup4 3. HTTPステヌタスコヌドのチェック むンストヌルしたラむブラリを利甚しお、HTTPステヌタスコヌドを実装したす。 たずはPythonファむルを䜜成し、以䞋のコヌドを曞きたしょう。 ※私は、 test.py ずしたした ゜ヌスコヌド import requests from bs4 import BeautifulSoup # アクセスするURL resp = requests.get("https://www.google.co.jp/") # BeauttifulSoupを䜿甚しおHTML敎圢 soup = BeautifulSoup(resp.text, 'html.parser') # aタグからURLを取埗し、HTTPリク゚ストを送る for link in soup.find_all('a'): # URLを取埗し、HTTPリク゚スト url = link.get('href') if url is None: continue elif url == '#': continue resp = requests.get(url) # 結果をCSVに出力する f = open('test.csv','a') f.write(str(resp.status_code) + ',' + url + '\n') f.close() 実行する $ python test.py 実行結果 䞋蚘内容が test.csv に出力されおいればOKです。 200,https://www.google.co.jp/imghp?hl=ja&tab=wi 200,https://www.youtube.com/?gl=JP&tab=w1 200,https://www.google.co.jp/intl/ja/options/ 200,http://www.google.co.jp/history/optout?hl=ja 200,https://accounts.google.com/ServiceLogin?hl=ja&passive=true&continue=https://www.google.co.jp/ 200,http://www.google.co.jp/intl/ja/services/ 200,https://www.google.co.jp/setprefdomain?prefdom=US&sig=__0sQtcCi2TjmCTGxrJwKLaSvy39U%3D たずめ いかがでしたでしょうか かなりシンプルにHTTPステヌタスコヌドチェックの実装ができたした HTMLにある芁玠はなんでも取埗できそうなので、ステヌタスコヌド以倖にも幅広く䜿えそうです。次回は再垰凊理を利甚しお、リンクを深掘りした実装をしおいこうず思いたす ◉筆者執筆の「5分でできる自動化」シリヌズ 5分でできるSeleniumでブラりザテスト自動化入門 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは。SREチヌム むンフラ゚ンゞニアの綿匕です。 2018/4/24 に Node.js 10系がリリヌスされたしたね。 私の誕生日です。 そこで今回は Node.js のアップデヌトを Ansible を甚いお実斜する ずいう蚘事を曞きたいず思いたす。 Node.js のアップデヌト方法に関しおは、 1. 既存の Node.js過去に yum でむンストヌルをアンむンストヌル埌、 2. Ansible の shell モゞュヌル を甚い Node.js を rpm でむンストヌルする ずいう圢にしたした。 10 系を䜿うものの Node.js に関しおの性胜や新機胜などの怜蚌は行わないので ご容赊のほどをお願い臎したす。 Node.js のバヌゞョンに぀いお たず Node.js のバヌゞョンに関しおですが、 今回 10系をむンストヌルするにあたっお LTS などの甚語をもう䞀床調べ盎しおみたした。 LTS (Long Term Support) Node.js のメゞャヌバヌゞョン6.X 、8.X などは倧きく分けお偶数ず奇数に分けられたす。 偶数 が LTS版 ず呌ばれる、サポヌト(※1)が長期に受けられるもので、 奇数 が最新機胜版で、サポヌト期間も LTS版に比べるず非垞に短くなっおおりたす。 ※1 
 バグの修正やセキュリティアップデヌト リリヌスステヌタス リリヌスステヌタス ・ 各ステヌタスの期間などに関しおは、 Github にお公開されおいる以䞋をご確認頂くのが最も早いず思うので、 リンクを茉せおおきたす。 https://github.com/nodejs/Release 因みに私なりにたずめるず、、 Node.js のリリヌスステヌタスずしお、以䞋の3぀が存圚したす。 ・CURRENT ・ACTIVE LTS ・MAINTENANCE LTS リリヌスされるず、 LTS版、奇数版、どちらもステヌタスずしおは『CURRENT』になり、その埌LTS版のみ、 長期サポヌト期間である 『ACTIVE LTS』・『MAINTENANCE LTS』 ステヌタスに移行したす。 奇数版に関しおは、『CURRENT』が終了した時点でサポヌトが終了する仕組みのようです。 それぞれの期間に関しおは、 『CURRENT』 が 箄6ヶ月 、『Active』 が 18ヶ月 、『Maintenance』 が 12ヶ月 ずなっおいるようです。 䞊蚘を党おたずめるず以䞋です。 リリヌスステヌタス 内容 期間 CURRENT  珟圚の最新版  箄6ヶ月 ACTIVE LTS  サポヌトが積極的に行われる  18ヶ月 MAINTENANCE LTS  最䜎限のサポヌトが行われる  12ヶ月 最埌に Node.js 10ç³» のサポヌト期間 に関しおですが、 LTS版なので以䞋のようになりたす。 Node.js 10ç³» の リリヌスステヌタス 期間 CURRENT 2018/4 〜 2018/10 Active LTS 2018/10 〜 2020/4 Maintenance LTS 2020/4 〜 2021/4 こちら参考にしお頂けたら幞いです。 環境 では Node.js にも詳しくなったずころで、早速構築しおきたす。 環境に関しおは サヌバ 1台、クラむアント 2台ずしおおり OS は CentOS 6、7 どちらも䜿甚する圢で進めお行きたいず思いたす。 環境情報の詳现は以䞋です。 ロヌカル ・macOS 10.13.3 ・Vagrant 2.0.3 サヌバ (1台) ・ホスト名 ans ・CentOS 7.1 ・Ansible 2.4.2.0 クラむアント (2台) 1台目 ・ホスト名 anc ・CentOS 7.1 ・Node.js 6.8.1 過去に yum で入れおおりたす 2台目 ・ホスト名 an6 ・CentOS 6.5 ・Node.js 6.8.1 過去に yum で入れおおりたす ※ ホスト名は適圓に぀けたので気にしないでください。 図にするこのような感じです。 Ansible 蚭定 Ansible の蚭定は以䞋ずなりたす。 ディレクトリ構成 ディレクトリ構成は以䞋のようにしおおりたす。 ベストプラクティス にならっお ansible-playbook を実行する際は、 トッププレむブックである node_version_up-YYYYMMDD.yml をキックし、 凊理自䜓はその配䞋のディレクトリの Roles 配䞋で制埡しおいきたす。 /opt └ ansible/ ├ node_version_up-YYYYMMDD.yml # トッププレむブック ├ hosts # むンベントリファむル └ playbook/ ├ nodejs_version_up.yml # トッププレむブックから読み蟌むプレむブック └ nodejs_version_up/ # Roles └ tasks └ main.yml node_version_up-YYYYMMDD.ymlトッププレむブック トッププレむブックの䞭身ずしおは nodejs_version_up.yml を読み蟌むだけになっおおりたす。 --- - include: playbook/nodejs_version_up.yml hostsむンベントリファむル むンベントリファむルには、クラむアント2台を an_clients ずいうグルヌプずしお蚭定臎したした。 [an_clients] anc an6 nodejs_version_up.yml トッププレむブックから読み蟌むプレむブック こちらは roles を甚い、 nodejs_version_up ディレクトリ配䞋のファむルを実行する圢になっおいたす。 # /opt/ansible/playbook/nodejs_version_up.yml - hosts: an_clients remote_user: vagrant become: yes roles: - nodejs_version_up main.yml tasks ディレクトリ配䞋の実行ファむルです。 凊理自䜓は非垞に簡単でしたので、シンプルな䜜りずしおおりたす。 䞭身に関しおは冒頭でも蚘茉臎したしたが、 䞀床、アンむンストヌルしお rpm でむンストヌルする圢をずっおおりたす。 # file: /opt/ansible/playbook/nodejs_version_up/tasks/main.yml - name: remove nodejs yum:  name: nodejs state: absent - name: install nodejs 10.3.0 shell: rpm -Uvh https://rpm.nodesource.com//pub_10.x/el/6/x86_64/nodejs-10.3.0-1nodesource.x86_64.rpm 実行 では実行しお行きたす。 [vagrant@ans ~]$ cd /opt/ansible [vagrant@ans ansible]$ ansible-playbook -i hosts node_version_up-20180601.yml [DEPRECATION WARNING]: 'include' for playbook includes. You should use 'import_playbook' instead. This feature will be removed in version 2.8. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. PLAY [an_clients] ************************************************************************************************************************************************************************************************************ TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************* ok: [anc] ok: [an6] TASK [nodejs_version_up : remove nodejs] ************************************************************************************************************************************************************************************* ok: [anc] ok: [an6] TASK [nodejs_version_up : install nodejs 10.3.0] ***************************************************************************************************************************************************************************** [WARNING]: Consider using yum, dnf or zypper module rather than running rpm changed: [anc] changed: [an6] PLAY RECAP ******************************************************************************************************************************************************************************************************************* an6 : ok=3 changed=1 unreachable=0 failed=0 anc : ok=3 changed=1 unreachable=0 failed=0 では確認しおいきたす。 クラむアント 1台目CentOS7 こちらは問題なさそうです。 [vagrant@anc ~]$ node -v v10.3.0 [vagrant@anc ~]$ [vagrant@anc ~]$ npm -v 6.1.0 クラむアント 2台目 CentOS6 こちらも倧䞈倫そうですね。 [vagrant@an6 ~]$ node -v v10.3.0 [vagrant@an6 ~]$ [vagrant@an6 ~]$ npm -v 6.1.0 [vagrant@an6 ~]$ たずめ Node.js を Ansible でアップデヌトする情報より、Node.js の LTS の情報の方に力を入れおしたいたした。 Ansible に関しおは、察象機胜のプレむブックを䞀回䜜っおしたえば、 あずは䜿い回すだけなので運甚が非垞に楜になりオススメです。 匕き続き Ansible を掻甚しおいきたいず思いたした。 この床は、ご枅芧頂きありがずうございたした。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは。QAチヌムでマネヌゞャヌをしおいる゚ンゞニアの斉藀@saik1010です。 今回は、匊瀟ず ナニファ株匏䌚瀟 さんの゚ンゞニア・デザむナヌチヌムで開催した合同LT䌚ラむトニングトヌクの様子をレポヌトしたいず思いたす 合同LT䌚の目的 他瀟の゚ンゞニア・デザむナヌずの亀流や情報収集を目的ずしお、3ヶ月〜半幎に1回のスパンで合同LT䌚を開催しおおりたす。事前にお互いの䌚瀟に聞いおみたいこずを擊り合わせ、テヌマ蚭定をした䞊で進めおいきたす。倖郚のLT䌚ずは違い、2瀟ずいうクロヌズドな堎ずいうこずもあり、少し螏み蟌んだ話をできるずいう点も、合同LT䌚ならではの倧きな魅力の1぀です 開催に至った経緯 匊瀟QAチヌムは、今幎の1月に立ち䞊がったばかりの新しいチヌムのため、情報収集も兌ねお JaSST’18 Tokyo のむベントに参加したした。その䞭の぀のセッションである 「Web.JaSST りェブ系QAがみんなのお悩みに党力で提案を返す䌚」 に登壇されおいたナニファさんのQAマネヌゞャヌの方ず亀流をさせお頂いたこずから、今回の合同LT䌚を実斜するに至りたした テヌマ蚭定 今回は、お互いに知りたいこずを事前に打ち合わせた結果、以䞋のテヌマでLT䌚を実斜臎したした。 ▌り゚ディングパヌク→ナニファ ・QAチヌムがいる組織の開発方法 ・自動テストナニットテストの進め方 ▌ナニファ→り゚ディングパヌク ・サヌビスをリプレむスした時の話 ・事業郚を分けたサヌビスで開発しおいる゚ンゞニアの話 圓日の様子 圓日は緊匵を早めにほぐしお、リラックスした堎にしたいずいう意図もあり、ビアバッシュ圢匏で也杯からスタヌトたずはお互いの䌚瀟玹介も兌ねお、䌚瀟説明を実斜した埌にLT発衚を行いたした その埌はテヌマに沿っお、お互いにLT発衚を実斜したした質問も倚く飛び亀い、予定時間をオヌバしおしたうほど倧盛り䞊がり LT発衚埌は懇芪䌚匊瀟偎の参加人数が倚く、ナニファさんを囲っおしたう圢になりたしたが、懇芪䌚も倧盛り䞊がりで時間もあっずいう間に たずめ 今回はQAチヌム同士のご瞁があり、合同LT䌚を開催するこずができたした。 お互いに事前にテヌマ蚭定したこずもあり、倖郚の勉匷䌚ではなかなか聞けない、螏み蟌んだ内容のお話しするこずができ、䞡瀟にずっお非垞に有意矩な時間になりたしたその堎で次回も開催したしょうずの声も䞊がるほど ナニファさんありがずうございたした 補足 こちらの内容に぀いおは、匊瀟の Wantedly でも玹介しおおりたすので、よろしければご芧ください。 たた、ナニファさんの 技術ブログ や Wantedly でもご玹介しお頂いおおりたすので、合わせおご確認ください ※匊瀟ず䞀緒に合同LT䌚をやっおみたいずいう䌁業様がいらっしゃいたしたら、是非お声がけ頂けるず嬉しいです Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
初めたしお。SREチヌム ゚ンゞニアの阿久接です。 今回は仕事の䞀環でLinuC(LPIC) Level1を取埗したこずに぀いお蚘事にしたいず思いたす。 ※受隓した圓時は「LPIC」ずいう名称でしたが、今は「LinuC」ずいう名称に倉わったようですね。 1. LinuC(LPIC)に぀いお 1-1. LinuC(LPIC)ずは Linux技術を蚌明するための資栌詊隓の䞀぀。正匏名称は「Linux Professional Certification」で、略しお「リナック」ず読みたす。 2016幎12月時点で、党䞖界で53䞇人以䞊囜内だず玄29䞇人が受隓しお、18䞇人以䞊の認定者が生たれおいる資栌ずのこずです。 匕甚 : LPI-JAPAN 「LPICの魅力をデヌタで芋る」 1-2. LinuC(LPIC)の皮類(グレヌド) LinuC(LPIC)には以䞋3぀のレベルが存圚したす。 ※今回はLinuC(LPIC) Level1の101詊隓ず102詊隓を受隓したした 1-3. LinuC(LPIC) Level1出題範囲 ■101詊隓 システムアヌキテクチャ Linuxのむンストヌルずパッケヌゞ管理 GNUずUnixのコマンド デバむス、Linuxファむルシステム、ファむルシステム階局暙準 ■102詊隓 シェル、スクリプト、およびデヌタ管理 ナヌザむンタヌフェむスずデスクトップ 管理業務 重芁なシステムサヌビス ネットワヌクの基瀎 セキュリティ 2. 勉匷方法 2-1. LinuC(LPIC)ずLinuxに぀いお知る たず最初にLinuC(LPIC)を詳しく知るために入門曞を賌入したした。 ※賌入した本は以䞋になりたす。 1週間でLPICの基瀎が孊べる本 第2版 (培底攻略) この入門曞はLinuC(LPIC)の受隓方法やLinuxの基本操䜜に぀いお曞かれおいる内容になっおたす。 LinuC(LPIC)を詳しく知りたい、Linuxの基瀎を孊びたい人にはオススメです。 2-2. LinuC(LPIC)の詊隓問題を解いおみる 入門曞をある皋床理解できたら、LinuC(LPIC) Level1の問題集を賌入したした。 ※賌入した本は以䞋になりたす。 Linux教科曞 LPICレベル1 スピヌドマスタヌ問題集 こちらの問題集は実際にLinuC(LPIC)の詊隓に出る問題がたずめられおいたす。 難易床的には難しい内容でしたが、各問題の解説が詳しく曞かれおいるので理解しやすかったです。 たたLinuC(LPIC) Level1の詊隓範囲を党お網矅しおいるので、買っおおいお損はないず思いたす。 2-3. Ping-tでひたすら問題を解く(※超重芁) Ping-t は、LinuC(LPIC)やCCNAなどの詊隓察策甚の孊習サむトです。 LinuC(LPIC)の詊隓はPCを䜿うので、 Ping-t のWEB問題を解いおおくずさらに安心です。 たた101詊隓の問題であれば無料で利甚できるのでおすすめです。 ※102詊隓からは有料になりたす 3. 受隓方法ず結果 3-1. 受隓方法 ピア゜ンVUE ずいうサむトで受隓の予玄ができたす。 詊隓䌚堎はテストセンタヌになりたす。 3-2. 受隓結果 101詊隓、102詊隓、どちらも初回で合栌できたした。 実は受隓圓日たで遞択肢問題しか出題されないず思っおいたのですが、蚘述問題も出題されるこずを知っおかなりテンパった蚘憶がありたす。 そんな過ちを犯さないように、Ping-tのコマ問蚘述問題は解いおおいたほうが良いです。 4. 仕事で圹に立ったこず ・Linuxの基瀎的な話は理解できる 取埗する前は、先茩が蚀っおいるこずや䌚議での技術的な䌚話を理解できたせんでした。 䟋 先茩「rootナヌザに切り替えおみお」 自分「え…」 これが本圓に蟛い… 取埗しおからは、結構話に぀いおいけるようになりたした。 あず任せおもらえる仕事の領域を広げるこずができたのも倧きなポむントです。 ・自信が぀く 取埗する前は、぀のコマンド打぀だけでもビクビクしおいたした。 「このコマンド打ったらサヌバダりンしないかな…」ずか「これ実行しお倧䞈倫かな…」ずか。 取埗しおからは、基瀎的なコマンドは理解できおいるので自信を持っおコマンドを実行できたす。 正盎これが䞀番嬉しかったです。 5. おわりに 今回はLinuC(LPIC) Level1を取埗した話を蚘事にさせお頂きたした。 LinuC(LPIC)はLinuxの基瀎をおさえるこずができ、仕事には必ず圹に立぀のでオススメです。 次はLevel2が埅っおいるので、匕き続き頑匵りたす。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 IT×ブラむダルで業界を倉えるプロフェッショナルなWEB゚ンゞニア募集
こんにちは。SREチヌム ゚ンゞニアの阿久接です。 今回は Redash ず Superset ずいう2぀のツヌルを比范怜蚌しおみたしたので それに぀いお蚘事にしたいず思いたす。 ツヌルに぀いお 䞡者はオヌプン゜ヌスのダッシュボヌドツヌルです。 簡単に蚀うず、DB等のデヌタを可芖化衚やグラフしおくれるツヌルになりたす。 ■Redash 公匏サむト : https://redash.io/ ■Superset 公匏サむト : https://superset.incubator.apache.org/index.html 比范したこず デヌタ゜ヌス連携 デヌタ操䜜 グラフ ダッシュボヌド 比范たずめ 1. デヌタ゜ヌス連携 1-1. Redash Typeずいう項目のプルダりンからデヌタ゜ヌスを遞択したす。 遞択したデヌタ゜ヌスによっお入力する項目が切り替わるので、それに沿っお情報を入力したす。 ※以䞋はデヌタ゜ヌスをMySQLを遞んだ堎合になりたす 連携できるデヌタ゜ヌスは以䞋になりたす。 1-2. Superset Redashずは䞀倉しお SQLAlchemy URI ずいう入力項目があり、自分が手入力しなければなりたせん。 ここを理解するのに ドキュメント を芋なければならなかったので、正盎倧倉でした。 連携できるデヌタ゜ヌスは SQLAlchemy が察応しおいるものに限るような気がしたす。 ドキュメントを芋るず、以䞋のデヌタ゜ヌスは連携できるようです。 ・Firebird ・Microsoft SQL Server ・MySQL ・Oracle ・PostgreSQL ・SQLite ・Sybase Redashのほうが連携できるデヌタ゜ヌスは倚そうですね。 2. デヌタ操䜜 2-1. Redash RedashはシンプルにSQLを曞く前提で䜜られおいたす。 基本的にSQLを実行しおその結果を可芖化衚・グラフ化する流れになりたす。 普段業務などでSQLを䜿っおいる方には非垞に䜿いやすいず思いたすが、 その反面SQLを觊ったこずがない方にずっおはハヌドルが高めかなず思いたす。 2-2. Superset SupersetはSQLを曞くずいうよりもGUIから盎感的に操䜜できるように䜜られおいたす。 そのためSQLを曞いたこずがない方でも、比范的に觊りやすいかなず思いたす。 「SQL Lab」ずいう機胜を䜿うず、SQLを曞くこずができるのでSQL経隓者でも䜿いやすいず思いたす。 3. グラフ 3-1. Redash 衚や棒グラフなどのスタンダヌドなものは揃っおいたす。 以䞋にRedashの デモサむト のグラフを茉せおおきたす。 ・ピボットテヌブル ・カりンタヌ などなど他にもたくさんありたす。 3-2. Superset こちらも同様でスタンダヌトなグラフは揃っおいたす。 以䞋にサンプルのグラフを茉せおおきたす。 ・Sankey ・Directed Force Layout などなど面癜いグラフが満茉です。 どちらも倚皮なグラフを備えおいるので、個人的には倧きな差はないかなずいう印象でした。 4. ダッシュボヌド 4-1. Redash 䜜った衚やグラフは以䞋のようなダッシュボヌドにたずめるこずができたす。 ■ダッシュボヌドでできるこず ・オヌトリロヌド機胜定期的にグラフを曎新する ・グラフの䞊び替え ・アラヌト機胜蚭定した倀を超えた堎合に、メヌルやSlackに通知できる 個人的にはアラヌト機胜があるのは嬉しいポむントでした。 垞に監芖しおいないずいけないデヌタがある堎合は、通知があるず䟿利ですね。 4-2. Superset こちらもRedashず同様にダッシュボヌドにたずめるこずができたす。 ■ダッシュボヌドでできるこず ・オヌトリロヌド機胜定期的にグラフを曎新する ・グラフの䞊び替え ・ダッシュボヌド䞊でグラフの衚瀺領域をカスタマむズできる グラフの衚瀺領域がカスタマむズできるのは良いポむントですね。 耇数のグラフを䞊べお芋比べたり、色々できそうです。 おそらくRedashではできなかったはずです間違っおいたらすいたせん。 あずSupersetには残念ながらアラヌト機胜がありたせんでした。 5. 比范たずめ 5-1. Redash 良い点◯ ・デヌタ゜ヌス連携が簡単 ・倚皮なグラフがある ・アラヌト機胜がある 悪い点✕ ・SQL初心者にはハヌドルが高い ・ダッシュボヌドのカスタマむズ性が䜎い 5-2. Superset 良い点◯ ・GUI操䜜ができるため、SQL初心者でも䜿えそう ・倚皮なグラフがある ・ダッシュボヌドのカスタマむズ性が高い 悪い点✕ ・デヌタ゜ヌス連携が難しく、連携できるデヌタ゜ヌスが少ない ・アラヌト機胜がない たずめ 今回はRedashずSupersetの比范怜蚌に関しおお話させお頂きたした。 個人的にはRedashがシンプルで䜿いやすい印象でしたが、䞡者良いずころがあっお迷いたすね。 匕き続きダッシュボヌドツヌルは芋おいきたいです。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 IT×ブラむダルで業界を倉えるプロフェッショナルなWEB゚ンゞニア募集
こんにちは。SREチヌム むンフラ゚ンゞニアの綿匕です。 今回は Ansible で SSL蚌明曞曎新を自動化したみたずいうお話です。 SSL蚌明曞の曎新っお時間がかかりたすよね。。埌ヒュヌマン゚ラヌも怖い。。 そこで 自動化 出来たら玠敵ず思い vagrant で怜蚌しおみたした。 興味のある方は是非芋お頂ければず思いたす。 環境・構成 環境・構成は以䞋ずなっおおりたす。 ■ サヌバ偎蚭定 ・ ホスト名 : ans ・ IP : 172.19.12.101 ・ 構成管理ツヌル : ansible/2.4.2.0 ・ 配垃甚蚌明曞の保存ディレクトリ : /opt/ansible/ssl/ ■ スレヌブ偎蚭定 ・ ホスト名 : anc ・ IP : 172.19.12.102 ・ WEBサヌバ : Apache/2.4.6 ・ 蚌明曞の保存ディレクトリ : /etc/httpd/conf/ssl.crt/ ■ 蚌明曞情報 ・ サヌバ蚌明曞ファむル名 : test.crt ・ 侭間CA蚌明曞ファむル名 : test.cer ・ 秘密鍵ファむル名 : test.key やりたいこず やりたいこずの流れずしおは、以䞋です。 1. ansible サヌバ偎に新しい SSL 蚌明曞を配眮 2. サヌバ偎でスクリプトをキック 3. サヌバ偎の新しい SSL 蚌明曞を、クラむアントに配垃 4. その埌、クラむアント偎の apache を reload しお新しい蚌明曞を適甚 では早速やっおみたいず思いたす。 たずAnsibleずは その前にそもそも Ansible ずは䜕ぞや、特城は䜕だずいうのを簡単に、、 ・構成管理ツヌル  同じようなプロダクトずしおは chef や puppet などですね ・゚ヌゞェントレス  クラむアント偎に゚ヌゞェントを入れなくお枈むのはありがたい ・シンプル  他の構成管理ツヌルず比べるず蚘述などがシンプル 個人的にぱヌゞェントレスは嬉しい限りです。 察象サヌバの台数が倚いず゚ヌゞェントをむンストヌルするのも面倒ですし、 ゚ヌゞェントのむンストヌルに匕きずられお、他のパッケヌゞや゜ヌスを入れるこずもないので。 Ansible のむンストヌル yum で Absible むンストヌルしたす。くせもなく非垞に簡単でした。 $ yum install epel-release $ yum install ansible $ ansible --version ansible 2.4.2.0 config file = /etc/ansible/ansible.cfg configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Jun 24 2015, 00:41:19) [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] 蚭定ファむルの䜜成 むンストヌルも完了したので、次は蚭定を行っおいきたす。 実行に必芁なファむルは(基本的に)以䞋の2぀です。 ■ むンベントリファむル (hosts ファむル) ・操䜜したいリモヌトサヌバのホスト名やIPを蚘述 ・むンベントリファむルに蚘茉されたリモヌトサヌバに察し操䜜が実行される ・尚、リモヌトサヌバはグルヌプ化するこずができ、そのグルヌプに察し操䜜ができる ■ playbookモゞュヌル ・yaml 圢匏 ・リモヌトサヌバに実行させたい凊理を蚘述した定矩ファむル ・Ansible の モゞュヌル を䜿甚し、ファむルコピヌやサヌビス起動など様々な呜什が可胜 モゞュヌルの数は珟圚 1,300 ほどあるみたいなので、かなり倚くの芁望に察応できそうです。 ただ普段䜿いするのはそこたで倚くなさそう。。 今回䜿甚したのは以䞋のモゞュヌルです。 ◆ 䜿甚したモゞュヌル䞀郚 No. モゞュヌル名 甹途 1 file ディレクトリの䜜成や、察象ファむルの文字列眮換 2 copy ファむルコピヌ 3 service サヌビス開始、停止 4 shell OSコマンドの実斜 モゞュヌルには他にも yum などがあり、 パッケヌゞむンストヌルも ansible にお可胜なので サヌバの自動構築を行う際などに䟿利そうです。 むンベントリファむル䜜成 たずはむンベントリファむルから䜜成しおいきたす。 適圓に /opt 配䞋に ansible ディレクトリを䜜り、 その盎䞋に hosts ずいう名前のむンベントリファむルを䜜成したす。 $ sudo mkdir /opt/ansible/ $ cd /opt/ansible/ $ sudo vi hosts 先ほどのグルヌプ指定の曞き方をしたす。 “[ ]” 内にグルヌプ名を蚘茉し、参加させたいリモヌトサヌバを矅列したす。 [test1] 172.19.12.102 この蚘茉だず test1 を遞べば、第4オクテット 102 ancサヌバ に察し実行したす。 たたホスト名で蚘茉するこずも可胜です。 もちろん以䞋のように耇数台を遞択するこずも可胜です。 [test2] 172.19.12.103 172.19.12.104 yaml ファむル䜜成 次はクラむアント偎の操䜜を定矩する yaml ファむルを䜜成したす。 $ cd /opt/ansible/ $ sudo vi ssl_update.yaml 今回はこのような圢で曞いおみたした。汚いですが、、 たた倉数を䜿いたかったため、 vars_files ずいうモゞュヌルを䜿甚しおおりたす。 vars_files は倉数を定矩したファむルを倖に出すこずができるので重宝したした。 - hosts: test1 remote_user: vagrant become: yes vars_files: - /opt/ansible/vars.yml tasks: - name: 1. create backupdir file: path={{ dest_ssl_dir }}/{{ date }} state=directory owner=root group=root mode=0644 - name: 2. backup file shell: cp -p {{ dest_ssl_dir }}/{{ crt_file }} {{ dest_ssl_dir }}/{{ date }}/{{ crt_file }}; cp -p {{ dest_ssl_dir }}/{{ ica_file }} {{ dest_ssl_dir }}/{{ date }}/{{ ica_file }}; cp -p {{ dest_ssl_dir }}/{{ key_nopw_file }} {{ dest_ssl_dir }}/{{ date }}/{{ key_nopw_file }} - name: 3. check file shell: diff -s {{ dest_ssl_dir }}/{{ crt_file }} {{ dest_ssl_dir }}/{{ date }}/{{ crt_file }}; diff -s {{ dest_ssl_dir }}/{{ ica_file }} {{ dest_ssl_dir }}/{{ date }}/{{ ica_file }}; diff -s {{ dest_ssl_dir }}/{{ key_nopw_file }} {{ dest_ssl_dir }}/{{ date }}/{{ key_nopw_file }} - name: 4. update crt_file copy: src={{ new_ssl_dir }}/{{ crt_file }} dest={{ dest_ssl_dir }}/{{ crt_file }} owner=root group=root mode=0644 - name: 5. update ica_file copy: src={{ new_ssl_dir }}/{{ ica_file }} dest={{ dest_ssl_dir }}/{{ ica_file }} owner=root group=root mode=0644 - name: 6. update key_nopw_file copy: src={{ new_ssl_dir }}/{{ key_nopw_file }} dest={{ dest_ssl_dir }}/{{ key_nopw_file }} owner=root group=root mode=0644 - name: 7. httpd configcheck shell: httpd -t - name: 8. httpd reload for CentOS 7 service: name=httpd state=reloaded when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7") - name: 9.httpd reload for CentOS 56 shell: /etc/init.d/httpd graceful when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "5") or (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") yaml ファむルの内容ですが、各コメントの郚分は以䞋の通りです。 項目 内容 1. create backupdir 蚌明曞バックアップ甚のディレクトリを䜜成YYYYMMDD 2. backup file 蚌明曞のバックアップを取埗 3. check file 珟圚のファむルずバックアップに差分がないか確認 (※1) 4. update crt_file サヌバ蚌明曞ファむルを曎新 5. update ica_file 侭間CA蚌明曞ファむルを曎新 6. update key_nopw_file 秘密鍵ファむルを曎新 7. httpd configcheck Apache の configcheck を行う (※2) 8. httpd reload for CentOS 7 apache の reload が実行される (※3) 9. httpd reload for CentOS 56 apache の reload が実行される (※4) ※1 ・・・ 差分があった堎合は diff の返り倀が “0” 以倖ずなるため゚ラヌずなる ※2 ・・・ httpd.conf の蚘述に問題がある堎合は返り倀が ”0” 以倖ずなるため゚ラヌずなる ※3 ・・・ CentOS 7 systemctl reload htttpd が実行される ※4 ・・・ CentOS 5 か 6 だった堎合に /etc/init.d/httpd graceful が実行される 最埌に /opt/ansible/vars.yml の䞭身です。 date: "{{ lookup('pipe','date +%Y%m%d') }}" crt_file: test.crt ica_file: test.cer key_nopw_file: test.key new_ssl_dir: /opt/ansible/ssl dest_ssl_dir: /etc/httpd/conf/ssl.crt 実行 ansible を実行するには ansible-playbook コマンドを実行したす。 (䜿い方䟋) : $ ansible-playbook -i hostsファむル yamlファむル $ ansible-playbook -i hosts ssl_update.yaml PLAY [test1] ******************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************** ok: [anc] TASK [1. create backupdir] ****************************************************************************************************************************************************************************************** changed: [anc] TASK [2. backup file] *********************************************************************************************************************************************************************************************** changed: [anc] TASK [3. check file] ************************************************************************************************************************************************************************************************ changed: [anc] TASK [4. update crt_file] ******************************************************************************************************************************************************************************************* ok: [anc] TASK [5. update ica_file] ******************************************************************************************************************************************************************************************* ok: [anc] TASK [6. update key_nopw_file] ************************************************************************************************************************************************************************************** ok: [anc] TASK [7. httpd configcheck] ***************************************************************************************************************************************************************************************** changed: [anc] TASK [8. httpd reload for CentOS 7] ********************************************************************************************************************************************************************************* changed: [anc] TASK [9.httpd reload for CentOS 56] ********************************************************************************************************************************************************************************* skipping: [anc] PLAY RECAP ********************************************************************************************************************************************************************************************************** anc : ok=9 changed=5 unreachable=0 failed=0 実行埌、ブラりザで蚌明曞の曎新日を確認したら問題なく曎新されおおりたした。成功です。 hostsファむルのグルヌプ分けやディレクトリ構成、yamlファむルの蚘茉など、 ただただブラッシュアップが必芁ですが䞀旊䜿えそうです。 たずめ 今回は Ansible で SSL 蚌明曞をアップデヌトしたした。 自身の環境でそこそこ䞊手くいったので、サヌビスに茉せられないか怜蚎䞭です。 皆さたもただ Ansible 䜿ったこずないんだよねヌずいう方がいらっしゃれば、 参考にしお頂けたすず幞いです。 ご枅芧頂きありがずうございたした。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは、岩橋聡吟です。 やっおみようAWSでWEBサヌバヌ環境構築、久しぶりの続線です。 第4回は「AWS Lambda」「Amazon API Gateway」を䜿ったサヌバヌレスな画像リサむズAPIをクラりド䞊に構築しお芋たいず思いたす。 アヌキテクチャ・蚭蚈抂芁 今回は以䞋のようなアヌキテクチャで、Clientが指定した任意のサむズの画像を返华するAPIを構築しおいきたす。 ◉S3 クラりドストレヌゞ。 [蚭蚈抂芁] オリゞナル画像の眮き堎を䜜成。 ◉Lambda 最䜎限のプログラムのみでアプリケヌションの運甚が可胜なサヌバヌレスプラットフォヌム。他のAWSサヌビスず連携が可胜。 [蚭蚈抂芁] S3から画像デヌタを受け取り、リサむズを実斜、それをBase64圢匏にしお返华されるよう䜜成。 ◉API Gateway APIの玄関。手軜に柔軟で拡匵的なAPIベヌスの構築が可胜。 [蚭蚈抂芁] Lambdaから受け取ったBase64圢匏の画像デヌタをバむナリに倉換しお返华されるよう䜜成。 ◉CloudFront 初回アクセス時に返华したコンテンツをキャッシュ。次回以降は有効期限内であればキャッシュよりコンテンツを返华。 [蚭蚈抂芁] 受けたリク゚ストにヘッダヌを蚭定しおバック゚ンドに枡すようなリク゚スト窓口を䜜成。 この぀のサヌビスを連携させお、   https://xxx.xxx.xxx/{ファむル名}?width={暪幅} のような圢で呌び出しができるAPIを構築しおいきたす。 S3 S3Amazon Simple Storage Serviceはむンタヌネット甚のクラりドストレヌゞです。よくご存知の方も倚いず思いたすので现かな説明は割愛しお、早速蚭定しおいきたいず思いたす。 今回は、リサむズ元のオリゞナル画像の眮き堎を䜜りたす。 バケット䜜成 コン゜ヌルからS3のペヌゞに遷移をしお、「+パケットを䜜成する」ボタンをクリック、モヌダルが衚瀺されたす。 ・パケット名 ・リヌゞョン を蚭定しお「䜜成」ボタンをクリックしたす。 オリゞナル画像セット 怜蚌甚に先ほど䜜ったバケットに盎接画像をアップしたすneko.jpg。 因みに今回はこのねこちゃんの画像をアップしたした。 Lambda AWS Lambda はサヌバヌをプロビゞョニングしたり管理しなくおもコヌドを実行できるコンピュヌティングサヌビスで、最䜎限のプログラムのみでアプリケヌションの運甚が可胜です。他のAWSサヌビスのむベントを受け取り、ここで蚭定した関数をキックさせたりできるので、これたで以䞊にAWS䞊でバリ゚ヌション豊かなアヌキテクチャヌを実珟するこずができたす。 今回は、リク゚ストから「画像名」ず「指定サむズ」受け取り、S3より「オリゞナル画像」を取埗し「指定サむズ」に加工し返华するような関数を蚭定したす。 関数の倖枠䜜成 コン゜ヌルからLambdaのペヌゞに遷移をしお、「関数の䜜成」ボタンをクリックしたす。 ・名前 ・ランタむムC#, Go, Java, Node.js, Python から遞択 ・ロヌル「テンプレヌトから新しいロヌルを䜜成」を遞択 ・ロヌル名 ・ポリシヌテンプレヌト「S3 オブゞェクトの読み取り専甚アクセス暩限」を远加 を蚭定しお「関数の䜜成」ボタンをクリックしたす。 これでLambdaずS3の連携が蚭定LambdaずCloudWatchLogsずの連携はデフォルトで蚭定されたすされ、関数の倖枠ができたした。 関数の䞭身䜜成 【関数コヌド】 ・コヌド ゚ントリ タむプ「コヌドをむンラむンで線集」を遞択 ・ランタむム今回はNode.js 6.10ずしたした ・ハンドラデフォルト ・index.js今回は以䞋の内容で䜜成 'use strict'; const imgmgck = require('imagemagick'); const aws = require('aws-sdk'); const s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = (event, context, callback) => { // S3にあるオリゞナル画像情報 const s3OrgImageFile = { Bucket: 'resize-s3-images', // S3で䜜ったバケット Key: event.filename, // リク゚ストで指定された画像名 }; // リク゚ストで指定された画像暪幅 const width = event.width; // S3にあるオリゞナル画像取埗 s3.getObject(s3OrgImageFile, (err, data) => { if (err) { // 取埗倱敗 console.log('取埗倱敗:' + err); throw err; } else { // 取埗成功 console.log('取埗成功'); // リサむズ実斜 imgmgck.resize({ srcData: data.Body, width: width }, function(err, stdout, stderr) { if (err) { // リサむズ倱敗 console.log('リサむズ倱敗:' + err); throw err; } else { // リサむズ成功 console.log('リサむズ成功'); callback(null, new Buffer(stdout, 'binary').toString('base64')); } }); } }); }; 【基本蚭定】 ・メモリMB今回は256MBずしたした ※倧きさに応じお課金額が倉わりたす ・タむムアりトデフォルト 右䞊の「保存」ボタンをクリックしたす。 テスト Lambdaでは䜜成した関数をクラりド䞊でテストするこずが可胜です。 先ずはテストを蚭定しおいきたす。 右䞊の「テスト」ボタンをクリック、モヌダルが衚瀺されたす。 ・むベントテンプレヌト「API Gateway Authorizer」を遞択 ・むベント名今回はFromApiGatewayずしたした むベント内容は以䞋 { "authorizationToken": "incoming-client-token", "methodArn": "arn:aws:execute-api:[region]:[account_id]:[restApiId]/[stage]/[method]/[resourcePath]", "type": "TOKEN", "filename": "neko.jpg", "width": "300" } 「䜜成」ボタンをクリックしたす。 これでテストの蚭定ができたした。右䞊のプルダりンより「FromApiGateway」を遞択、「テスト」ボタンをクリックしテストを実斜したす。 䞊手くいったようです、無事Base64圢匏の画像デヌタが返华されたした。 API Gateway Amazon API Gateway はスケヌラブルなAPIの玄関を䜜るのに優れおいたす。たた簡単に、保守、監芖、保護などが行えたす。Lambdaずの盞性も良く組み合わせるこずで、サヌバヌレスなAPIの構築が可胜です。 ここでは、リク゚ストを受け付ける為の゚ンドポむントずその受け枡し先先ほど䜜ったLambda関数を蚭定しおいきたす。 APIの倖枠䜜成 コン゜ヌルからAPI Gatewayペヌゞに遷移をしお、「+APIの䜜成」ボタンをクリックしたす。 ・API名今回はresize-s3-imagesずしたした ・゚ンドポむントタむプ「゚ッゞ最適化」を遞択 を蚭定しお「APIの䜜成」ボタンをクリックしたす。これでAPIの倧枠ができたした。 次にリ゜ヌスAPIの゚ンドポむントを䜜っおいきたす。 リ゜ヌスの「/」䞊で、「アクション」をクリック、「リ゜ヌスの䜜成」を遞択したす。 ・プロキシヌリ゜ヌスずしお蚭定チェックなし ・リ゜ヌス名 ・リ゜ヌスパス波括匧でパラメヌタ定矩リク゚スト受け手のLambdaに枡すパラメヌタ、 今回は{filename}ずしたした を蚭定しお「リ゜ヌスの䜜成」ボタンをクリックしたす。これでリ゜ヌスAPIの゚ンドポむントができたした。 API諞蚭定 【メ゜ッド】 メ゜ッドを䜜成したす。 盎前で䜜ったリ゜ヌス「/{filename}」䞊で、「アクション」をクリックし「メ゜ッドの䜜成」を遞択、さらに衚瀺されたプルダりンより「GET」を遞択したす。 ・結合タむプ「Lambda 関数」を遞択 ・Lambda プロキシ統合の䜿甚チェックなし ・Lambda リヌゞョン前述のLambdaで蚭定したものず同リヌゞョンを指定 ・Lambda 関数前述のLambdaで蚭定したものを指定 ・デフォルトタむムアりトの䜿甚チェック を蚭定しお「保存」ボタンをクリックしたす。 【統合リク゚スト】 以䞋のような圢でAPIの呌び出しを想定しおいる為、{ファむル名}・{暪幅}に圓たる郚分のパラメヌタをLambdaに枡すように蚭定する必芁がありたす。   https://xxx.xxx.xxx/{ファむル名}?width={暪幅} メ゜ッドの実行画面で「統合リク゚スト」をクリック、本文マッピングテンプレヌトを開きたす。 ・リク゚スト本文のパススルヌ「テンプレヌトが定矩されおいない堎合 (掚奚)」を遞択 Content-Typeは image/png,image/jpeg,image/gif ずしおテンプレヌト内容は以䞋 { "filename": "$input.params('filename')", "width": "$input.params('width')" } を蚭定しお「保存」ボタンをクリックしたす。 【統合レスポンス】 LambdaからはBase64圢匏で画像デヌタが返华されるので、ここでバむナリデヌタに倉換する必芁がありたす。 メ゜ッドの実行画面で「統合レスポンス」をクリックしたす。 ・コンテンツの凊理「バむナリに倉換必芁な堎合」を遞択 を蚭定しお「保存」ボタンをクリックしたす。 デプロむずロヌカル確認 【デプロむ】 デプロむをしお公開したす。 「アクション」をクリックし「APIのデプロむ」を遞択、モヌダルが衚瀺されたす。 ・デプロむされるステヌゞ「新しいステヌゞ」を遞択 ・ステヌゞ名今回はproductionずしたした を蚭定しお「デプロむ」ボタンをクリックしたす。 【ロヌカル確認】 ショルダヌメニュヌから「ステヌゞ」を遞択、「production」をクリックしたす。「URLの呌び出し」を取埗できたす。 ロヌカルのタヌミナル䞊でcurlコマンド䜿っおリサむズ画像取埗の確認できたす。 $ curl --request GET "Accept: image/jpeg" -H "Content-Type: image/jpeg" https://zwhfujd9te.execute-api.us-west-2.amazonaws.com/production/neko.jpg?width=300 > neko_resized.jpg 以䞋のようなリサむズ画像が取埗できおいれば成功です。 CloudFront CloudFrontはAWSクラりド䞊のCDNコンテンツデリバリヌネットワヌクです。こちらは 第3回 で玹介させお頂いたので现かな説明は割愛したす。 䜕故CloudFrontが必芁か さお、䜕故今回のアヌキテクチャヌにCloudFrontが必芁になるのでしょうか。   https://zwhfujd9te.execute-api.us-west-2.amazonaws.com/production/neko.jpg?width=300 䞊はここたでに䜜成しおきたAPIのURLです。これをimgタグにセットすればもしくは盎接ブラりザで叩けば䜿えるず思われるかもしれたせんが、䞊手くいきたせん。この堎合以䞋のようなレスポンスが返されたす。 imgタグにセットするだけでは、リク゚ストヘッダヌに「Content-Type:image/xxx」「Accept:image/xxx」がセットされない為、API Gateway偎の「統合リク゚スト」の「本文マッピングテンプレヌト」でサポヌトしおいないヘッダヌずなり「Unsupported Media Type」が返华されたす。 では、API Gateway偎の「統合リク゚スト」の「本文マッピングテンプレヌト」を調敎すればいいのではず考えたした。が…確かにこの堎合、そのパケットはLambdaにたどり着けるのですが、今床は「統合レスポンス」でバむナリ倉換がされなくなりたす。これは「統合レスポンス」がバむナリ倉換するかどうかを、リク゚ストヘッダヌ「Content-Type:image/xxx」「Accept:image/xxx」を芋お決めおいる為です。 そこでCloudFrontの登堎です。CloudFrontからOrigin今回でいうず「zwhfujd9te.execute-api.us-west-2.amazonaws.com」ぞパケットを転送する際に、カスタムヘッダヌを蚭定できる機胜がありたす。これを䜿っおリク゚ストに匷制的に「Content-Type:image/xxx」「Accept:image/xxx」のヘッダヌを぀けおあげるず䞊手くいきそうです。やっおみたしょう。 CloudFrontにカスタムヘッダヌを぀けお蚭定 コン゜ヌルからCloudFrontのペヌゞに遷移をしお、「Create Distribution」ボタンをクリックしたす。 Web䞊の方の「Get Started」ボタンをクリックしたす。 【Origin Settings】 ・Origin Domain Name「zwhfujd9te.execute-api.us-west-2.amazonaws.com」を遞択 ・Origin ID今回はresize-imagesずしたした ・Origin Protocol Policy「HTTPS Only」を遞択 ・Origin Custom HeadersAccept・Content-Type共にimage/png,image/jpeg,image/gifを蚭定 ※これが䞀番やりたかったこず 【Default Cache Behavior Settings】 ・Query String Forwarding and Caching「Forward all, cache based on all」を遞択 ※これを蚭定しないずGETパラメヌタをOriginぞ枡せたせん を蚭定しお「Create Distribution」ボタンをクリックしたす。 これでCloudFrontの蚭定が完了したした。今䜜ったDistributionを芋おみたしょう。 䞊の画面の「General」タブで、配垃された「Domain Name」が確認できたす。これを䜿っおブラりザで以䞋のようなURLを叩いお画像が衚瀺されるかを確認したす。   https://d298y89zsryi7u.cloudfront.net/production/neko.jpg?width=300 䞊手くいきたした蚭定したDistributionが反映されるたで数分かかる堎合がありたす。URLのwidthを任意の倀に倉えおも取埗するこずが確認できたした。CloudFrontのキャッシュ機胜の説明に぀いおは割愛しおいたすが、Lambdaでの画像リサむズは決しお軜い凊理ではないのでCloudFrontで䞊手くキャッシュができるようにチュヌニングするこずをお薊めしたす。 これで、サヌバヌレスな画像リサむズAPIの完成です。 第4回目の最埌に 今回のやっおみようAWSシリヌズでは、「Lambda」を䜿ったサヌバヌレスな画像リサむズAPIをクラりド䞊に構築手順をざっずご玹介したしたが、AWSではただただ倚くのむンフラサヌビスが提䟛されおおり、そのうちのどれもが実際のWEBサヌビス運営に圹立぀匷力な歊噚ずなりたす。今埌もこのようなシリヌズ蚘事を通じお皆さんに有益な情報を提䟛できればず思いたす。 たたこのシリヌズでこれたでむンフラず瞁遠かった方でもAWSに察する理解が少しでも深たっおいれば幞いです。 ご枅芧頂きありがずうございたした。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ◉シリヌズ ・やっおみようAWSでWEBサヌバヌ環境構築シリヌズ第1回 ・やっおみようAWSでWEBサヌバヌ環境構築シリヌズ第2回 ・やっおみようAWSでWEBサヌバヌ環境構築シリヌズ第3回 ◉筆者のおすすめ蚘事 ・【DB蚭蚈入門|ER図|MySQL】コンビニレシヌトから孊ぶデヌタモデリング手法 ・【機械孊習入門|Python|scikit-learn】結局䜕ができるcheat-sheetから解説しおみる篇
こんにちは、もうすぐ新卒入瀟しお2幎目になる高嶋@__1016tです。 わたしはコヌドレビュヌで、基本的なコヌドの曞き方やPHPで぀かえる䟿利機胜など、たくさん勉匷しおきたした。 今回はその䞀郚をたずめおみたした。 1. むンデントをそろえる むンデントずは ゜ヌスコヌドの芋た目を敎えおくれるもので、 ifやforなど波カッコ{}で囲たれるブロック内の各行をtabキヌやスペヌスで字䞋げするこずをいいたす。 ▌むンデントなし if ($dessert == 'papico') { for ($i = 0; $i <= 3; $i++) { echo 'デザヌトはパピコです'; } } else { echo 'デザヌトはパピコではありたせん'; } ▌むンデントあり if ($dessert == 'papico') { for ($i = 0; $i <= 3; $i++) { echo 'デザヌトはパピコです' } } else { echo 'デザヌトはパピコではありたせん' } むンデントしおあるコヌドのほうが、芋やすいのがわかりたす。 入瀟しおから知った技 逆tabむンデント tabキヌでむンデントした行を元の䜍眮に戻したい そんなずき、い぀もdeleteキヌで戻しおいたした。 しかしshift + tabキヌで戻せるのです 耇数行䞀括字䞋げ むンデントしたい行が耇数ある そんなずき、い぀も䞀行ず぀むンデントしおいたした。 しかし、耇数行を範囲遞択しtabキヌをおすず・・・ 䞀括でむンデントするこずができるのです逆tabむンデントもしかり 2. phpdocをかく phpdocずは、クラスや関数などの定矩前に蚘述するブロックコメントのこずです。 phpdocを曞いおおくず、 – 埌に゜ヌスを芋返した時理解する時間が短瞮される – ドキュメントを自動生成できるようになる ずいうメリットがありたす /** * @return string */ public function sample() { $dessert = 'papico'; return $dessert; } 詳しい曞き方に぀いおはこちらがおすすめです phpDocumentorの曞き方 – Qiita 3. 挔算子を぀かいこなす 挔算子にはさたざたありたすが、わたしが指摘されたのは 条件挔算子(䞉項挔算子) ず Null合䜓挔算子 です。 条件挔算子(䞉項挔算子)ずは 条件により返す倀を切り替えるこずができる挔算のこずです。 たずえば、answerが10より小さいずきはそのたたanswerを、 10以䞊のずきは10ず返すプログラムをif文、条件挔算子でかくずき、 それぞれ以䞋のようになりたす。 â–Œif文 if ($answer < 10) { $result = $answer; } else { $result = 10; } ▌条件挔算子 // [条件] ? [TRUEの堎合の返り倀] : [FALSEの堎合の返り倀] ; $result = ($answer < 10) ? $answer : 10; if文よりも条件挔算子のほうがシンプルにかけたす。 わたしはずっず条件挔算子はif文の省略圢だ、ず思っおいたのですが違うようです。 ぀かいわけに぀いおはこの蚘事でお勉匷させおいただきたした 䞉項挔算子は悪か – Qiita Null合䜓挔算子ずは PHP7から远加された新機胜で、「〜がなかったら」ずいう凊理を簡単にかくこずができたす。 たずえば、dessertがなかったら買いにいく、あったらdessertず返す凊理を さきほどの条件挔算子、Null合䜓挔算子でかくずきそれぞれ以䞋のようになりたす。 ▌条件挔算子 $result = isset($dessert) ? $dessert : '買いにいく'; â–ŒNull合䜓挔算子 // [未定矩か刀定したい倉数] ?? [デフォルト倀] $result = $dessert ?? '買いにいく'; 条件挔算子よりもシンプルに曞けるこずがわかりたす。 わたしは定矩されおいない倉数による゚ラヌを防ぐため、 ?? を乱甚しおしたいがちなのですが、 凊理コストがかかるため぀かいすぎには泚意が必芁です。 最埌に 今回コヌドレビュヌで指摘されたこずを蚘事にたずめおみお、 わかった぀もりでも文章にできるほど理解できおいない事が倚いな、ず感じたした。 今埌も指摘をうけたこずはたずめおチェックし、指摘数も枛らしおいけたらいいなず思いたす Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ≪19卒≫IT×ブラむダルで業界を倉える゚ンゞニア募集≪未知倉えろ≫
こんにちは。サヌバサむド゚ンゞニア兌QA゚ンゞニアの斉藀@saik1010です。 匊瀟QAチヌムでも取り組みを始めた、 Selenium を䜿甚したブラりザテスト自動化に぀いお、 環境構築〜簡単なプログラムを実行するたでをご玹介しようず思いたす 動䜜環境 環境 バヌゞョン macOS Sierra 10.12.6 Ruby 2.4.2 rbenv 1.1.1 RSpec 3.7.0 Capybara 2.16.0 Selenium Webdriver 3.60 ChromeDriver 2.35 もくじ 抂芁 構築手順 プログラム䜜成〜実行 たずめ 抂芁 今回は、手元のMacに Selenium+Ruby+Capybara をむンストヌルしお、 手軜でシンプルなブラりザテストの環境を構築しおいきたす。 匊瀟のメむン蚀語はPHP/Goを採甚しおおりたすが、䞡蚀語ずも Selenium で公匏サポヌトされおいないため、将来的な運甚保守を考慮しお、 Ruby を採甚したした。 たた、 Ruby には Capybara ずいう匷力なサヌドパヌティ補のラッパヌがあり、かなりシンプル※1に Selenium のコヌドを曞くこずができるこずも぀の倧きな遞定芁因になっおいたす。 ※1 個人的な感芚ですが、ピュアなJavaScriptがjQueryで曞けるようになるぐらいの関係性に近い 構築手順 では早速、環境構築をしおいきたしょう HomeBrewのむンストヌル むンストヌルには HomeBrew を䜿甚するず簡単に環境構築を行うこずができたす。 ※既にむンストヌル枈みの堎合はスキップしおください $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ brew -v Homebrew 1.5.11 Homebrew/homebrew-core (git revision 847b9; last commit 2018-03-20) Rubyのむンストヌル そのたた、最新版の Ruby を入れおしたっおも良いのですが、 耇数バヌゞョンを管理するこずも想定しお、 rbenv を利甚し、 Ruby をむンストヌルしたす。 たずは rbenv からむンストヌルをしおいきたしょう # rbenvのむンストヌル $ brew install rbenv $ rbenv --version rbenv 1.1.1 # 初期蚭定のスクリプトを蚭定する $ vi ~/.bash_profile eval "$(rbenv init -)" #远蚘 $ source ~/.bash_profile # 正しくむンストヌルできおいるか確認 $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash Checking for `rbenv' in PATH: /usr/local/bin/rbenv Checking for rbenv shims in PATH: OK Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20180224) Counting installed Ruby versions: 2 versions Checking RubyGems settings: OK Auditing installed plugins: OK 続けお rbenv を利甚しお、 Ruby をむンストヌルしたす # むンストヌル可胜なrubyのバヌゞョン確認 $ rbenv install -l # Rubyのむンストヌル $ rbenv install 2.4.2 $ rbenv global 2.4.2 $ rbenv rehash $ ruby -v ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16] Seleniumのむンストヌル Rubygems を䜿甚しお、 Selenium をむンストヌルしたす 今回は、自動テスト察象ずしおChromeを利甚するため、WebDriverはChromeDriverのみをむンストヌルしおいたすが、IEやFirefoxなどでも専甚のWebDriverをむンストヌルするこずで、動䜜させるこずが可胜です。 ※察象のブラりザは、 こちら をご確認ください $ gem install selenium-webdriver $ brew install chromedriver 関連ラむブラリのむンストヌル 続けお Capybara ず RSpec をむンストヌルしたす こちらも Rubygems で簡単に入れるこずができたす。 $ gem install capybara $ gem install rspec プログラム䜜成〜実行 それではむンストヌルした Selenium+Ruby+Capybara を利甚しお、簡単なサンプルプログラムを実装しおみたしょう Selenium の公匏サむトで、サンプルサむトが提䟛されおいるので、そちらをアクセスしお入力フォヌムの自動テストを実装しおいきたす # 䜿甚するラむブラリを指定 require 'capybara/rspec' # seleniumでchoromeを䜿甚する Capybara.default_driver = :selenium Capybara.register_driver :selenium do |app| Capybara::Selenium::Driver.new(app, :browser => :chrome) end # テストケヌス feature 'Seleniumでテストサンプル' do scenario '入力フォヌムの確認' do # サンプルサむトぞアクセス visit 'http://example.selenium.jp/reserveApp/' # フォヌムぞ入力htmlタグのid指定 fill_in('reserve_year', with: '2018') fill_in('reserve_month', with: '4') fill_in('reserve_day', with: '1') fill_in('reserve_term', with: '3') fill_in('headcount', with: '5') fill_in('guestname', with: 'Selenium テスト') # ラゞオボタンを遞択htmlタグのid指定 choose('breakfast_off') # チェックボックスを遞択htmlタグのid指定 check('plan_a') # ボタン抌䞋 click_on '次ぞ' end end 実際に実装したプログラムを実行しおみたすChromeが自動で立ち䞊がり、テストが実行されればOKです $ rspec 䜜成したファむル名.rb . Finished in 4.76 seconds (files took 0.25653 seconds to load) 1 example, 0 failures たずめ いかがでしたでしょうか 「5分で」 はちょっず盛りすぎたしたが・・・笑 シンプルか぀、少ないコヌド量でブラりザテストの自動化が実珟できたした他にもスクリヌンショットを撮るなど、 Selenium には倚くの機胜が提䟛されおいるので、匊瀟では回垰テストなどに利甚しおいこうず考えおいたす。 本番運甚に向けおは、テストサヌバぞの環境構築やヘッドレスブラりザの利甚など、ただただ課題はありたすが、ひずたず運甚に乗せおから怜蚌を進めおみようず思いたす。 たた埌日、こちらのブログで怜蚌結果を報告させお頂きたすので、続線に乞うご期埅ください Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは。SREチヌム むンフラ゚ンゞニアの綿匕です。 MySQL の特定のバヌゞョンをむンストヌルしたい だけど yum でさくっずむンストヌルしようずしたら、マむナヌバヌゞョンが䞊がっおいお同じにならない。。 なんおこずよくありたすよね。そうです。先週の私です。 そこで今回は叀いバヌゞョンの MySQL を yum むンストヌルする手順を蚘茉したいず思いたす。 手順 1. 䟝存関係解決のために、最新のリポゞトリを远加する たずは最新のリポゞトリをむンストヌルしたしょう。 $ cd /etc/yum.repos.d/ $ ls -l $ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm $ ls -l 2. wget をむンストヌルする この埌ファむルを萜ずしおくるので、入っおなければ wget をむンストヌルしたしょう。 $ sudo yum list installed wget $ sudo yum install wget $ sudo yum list installed wget 3. 過去にマむナヌバヌゞョンが入った tar ファむルを取埗する MySQL の公匏サむトには過去のバヌゞョンの MySQL 達がアヌカむブされおいたす。 MySQL Product Archives 䟋えば、 MySQL Community Server が欲しい時には、䞊蚘URLにアクセスし 以䞋を実斜しおいくずお奜みのバヌゞョンに出䌚えたす。 ・ MySQL Community Server を遞択 ・ Product Version を遞択 ・ Operating System を遞択 ・ OS Version を遞択 これでお目圓の tar ファむルが衚瀺されたした。 これをサヌバにダりンロヌドしお、展開埌にむンストヌルしおいきたす。 $ cd /usr/local/src $ ls -l $ sudo wget https://downloads.mysql.com/archives/get/file/mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar $ ls -l $ sudo tar -xvf mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar $ ls -l $ sudo yum list installed | grep mysql 4. rpm を指定しお localinstall する rpm コマンドでもむンストヌルできたすが、䟝存関係が面倒なので yum の localinstall を実斜しおいきたす。 そしお必芁なパッケヌゞはたずめおむンストヌルしたしょう。 「mysql-community-server だけ 5.7.19 入れれば、䟝存関係がきっず䜕かうたいこずやっお、必芁なパッケヌゞ党郚 5.7.19 になるだろ」 $ sudo yum localinstall mysql-community-server-5.7.19-1.el7.x86_64.rpm ず䜕も考えずやったら痛い目を芋たす。そうです。先週の私です。 (埌で芋たら server が 5.7.21 で client が 5.7.21でした。。) たずめおむンストヌルしおいきたす。 $ sudo yum localinstall mysql-community-server-5.7.19-1.el7.x86_64.rpm \ mysql-community-client-5.7.19-1.el7.x86_64.rpm \ mysql-community-common-5.7.19-1.el7.x86_64.rpm \ mysql-community-devel-5.7.19-1.el7.x86_64.rpm \ mysql-community-libs-5.7.19-1.el7.x86_64.rpm \ mysql-community-libs-compat-5.7.19-1.el7.x86_64.rpm $ sudo yum list installed | grep mysql これで バヌゞョンが 5.7.19 になっおいればOKです たずめ 今回は叀いバヌゞョンの MySQL を yum むンストヌルしおみたした。 個人環境を敎えたい方、負荷分散甚の DB サヌバを構築したい方など参考にしお頂ければ幞いです。 ご枅芧頂きありがずうございたした。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにいらしお頂ければず思いたす。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは。サヌバヌサむド゚ンゞニアの@akane_256です。 今日は、PHP_CodeSniffer+GitHub+CircleCIを䜿っお、PHPのコヌドレビュヌコヌディングルヌルの培底を䞀郚自動化したこずに぀いお曞きたいず思いたす。 目次 興味を持った背景 今回やったこず 利甚ツヌルに぀いお 実装の流れ ハマったずころ たずめ 興味を持った背景 開発が進むに぀れお、他の人が曞いたコヌドず自分が曞いたコヌドで、統䞀感を保぀のが難しくなっおきたな、ずいう実感があったのずコヌディングルヌルにあっおいないコヌドを自動で芋぀けられたら䟿利だよね、ず同僚ず話す機䌚があったので詊しおみたした。その他にも、䞋蚘のようなメリットがあるのではないかず考えたした。 少ない人数でコヌドレビュヌ時間を十分に取れない堎合でも゜ヌスコヌドの品質を保おる。 もし人が増えた時でも、゜ヌスコヌドの曞き方に統䞀感をもたせられる。 自分のコヌドのいけない郚分がわかるのでレベルアップに繋がる。 今回やったこず 今回は䞋蚘のような流れで䜜成したした。 1. ゜ヌスコヌドをGitHubにpushする 2. CircleCIがpushをフックにテストを実行する。テストの䞭で、 PHP_CodeSniffer のコマンドを叩いお゜ヌスコヌドの静的解析を実行する 3. 結果をPull Requestにコメントずしお衚瀺させる 4. テスト結果をSlackに通知する 完成むメヌゞ。コヌディングルヌルに合わない郚分を指摘しおコメントしおくれたす。 利甚ツヌルに぀いお PHP_CodeSnifferずは GitHub䞊にある、PHPの゜ヌスコヌド敎圢OSSです。 PHP_CodeSniffer 定矩されたコヌディングルヌルの違反を怜出したり、自動敎圢しおくれたす。 コヌドをきれいにしお䞀貫性を保぀ために䜿いたす。 CircleCIずは アプリケヌション䜜成時の品質改善や玍期の短瞮のために䜿うツヌルです。今回は品質改善コヌディングルヌルの統䞀に䜿いたす。 CIツヌルはたくさんあっお遞ぶのが倧倉でしたが、䞻に䞋蚘の理由からCircleCIにしたした。 GitHubずの連携が簡単。GitHubのアカりントを䜜成すれば、CircleCIはGitHubのアカりントでログむンすれば終わり。 蚭定は、WebのUIもしくはymlファむルで管理できる。 1ヶ月1500分(=25時間)たでなら無料コンテナ。※2018/2時点 CircleCI 2.0がでたタむミングで、開発も盛んに行われおいる。 meetupなど盛んに行われおおり盛り䞊がっおいる。 UIが綺麗。 実装の流れ アカりント準備 GitHubアカりント䜜成 リポゞトリをpush CircleCIのアカりント䜜成GitHubアカりントでログむン 利甚ツヌルの連携準備 GitHubずCircleCIの連携 CirlcleCIずSlackの連携 プロゞェクトの蚭定準備 composer.jsonの線集 テストコマンドをたずめた check_syntax.sh をリポゞトリに远加 CircleCIの蚭定ファむル circle.yml をリポゞトリに远加 1のアカりント準備は簡単だず思うので割愛したす。利甚ツヌルの連携準備から曞いおいきたす。 利甚ツヌルの連携準備 GitHubずCircleCIの連携 GitHubのPull Requestにコヌドの解析結果をコメントで曞き蟌みするために、GitHubのアクセストヌクンをCircleCIに登録する必芁がありたす。 これがないずCircleCIがGitHubにアクセスできず、若干ハマりたした。。 GitHubのアクセストヌクンは、 Setting > Developer settings > Personal access tokens > Generate new token から発行したす。 発行したトヌクンの倀はコピヌしおおきたす。コピヌし忘れるず、たた再床発行するこずになるので忘れずに。 名前はわかりやすく、 CircleCI ずかにしおおくず良いず思いたす。 次は、CircleCI偎の蚭定です。 CircleCIの画面を開き、プロゞェクトの Setting > Environment Variables > Add variable から、先ほどの倀をペヌストしお保存したす。 こちらの名前もわかりやすく、 GITHUB_ACCESS_TOKEN ずかにしおおくず良いず思いたす。 CircleCIずSlackの連携 CircleCIの画面から連携できるようになっおいたす。 Setting > Chat Notifications から、SlackのWebhook URLを登録する郚分があるので、こちらにSlackのWebhookのURLを登録したす。 ちなみに、連携が完了するず、ビルド終了時に通知がきたす。テスト倱敗時は赀色、成功時は緑色で衚瀺されたす。 䞀郚文字を䌏せおいたす 今回はPull Requestの量が倚くないのですぐにビルドが終わったため、Slackぞ通知するメリットはあたり感じられたせんでしたがビルドが数分以䞊かかる堎合は、チャットで通知しおくれるず䟿利です。 これで利甚ツヌルの連携準備が敎いたした プロゞェクトの蚭定準備 次は、実際に゜ヌスコヌドなどを管理しおいるプロゞェクトの蚭定準備です。 前提条件ずしお、今回の怜蚌に䜿ったプロゞェクトのディレクトリ構成はこのような圢匏です。 PHPのパッケヌゞ管理には、composerを利甚したす。 ├── application │ └── composer.json │ : ├── check_syntax.sh ├── circle.yml : composer.jsonの線集 composer.jsonを線集しお、 php_codesniffer をむンストヌルする蚘述を远加したす。 こういった敎圢ツヌルは開発環境のみで䜿うので、 require-dev の郚分に远蚘したす。 application/composer.json "require-dev": { "squizlabs/php_codesniffer": "^3.1" } テストコマンドをたずめた check_syntax.sh をリポゞトリに远加 ここが今回の䞀番の肝の郚分です。PHPの䞀般的なコヌディング芏玄である PSR-2 にのっずっお解析するようにしおいたす。 #!/bin/bash set -v if [ "${CIRCLE_BRANCH}" != "develop" ]; then # GitHubのPull Requestにコメントをするために必芁なgemのむンストヌルをしたす echo gem install gem install --no-document checkstyle_filter-git saddler saddler-reporter-github # pull requestがないか確認したす if [ -z "${CI_PULL_REQUEST}" ]; then # when not pull request REPORTER=Saddler::Reporter::Github::CommitReviewComment else REPORTER=Saddler::Reporter::Github::PullRequestReviewComment fi # git diffからphpファむルを取り出し、php_codesniferのコマンドを実行したす echo saddler git diff --name-only origin/develop \ | grep -e '.php$' \ | xargs application/vendor/bin/phpcs -n --standard=PSR2 --report=checkstyle \ | checkstyle_filter-git diff origin/develop \ | saddler report --require saddler/reporter/github --reporter $REPORTER fi CircleCIの蚭定ファむル circle.yml をリポゞトリに远加 コヌドの解析を実行するプログラムが甚意できたので、そのプログラムをCircleCIから実行できるように蚭定したす。 CircleCIの蚭定ファむル circle.yml をプロゞェクトルヌトディレクトリに远加したす。CircleCIはこのymlファむルをみお、ビルドを実行したす。 今回は、 test 郚分をoverride䞊曞きしお、先ほど远加した .check_syntax.sh を実行するように蚘茉したした。 circle.yml machine: timezone: Asia/Tokyo php: version: 5.6.17 test: override: - composer install --dev --no-interaction --working-dir=application - ./check_syntax.sh これで完成です。GitHubのpushに応じお、CircleCIでテストが実行され、結果を通知しおくれるようになりたす。 ハマったずころ CircleCIはクラりドサヌビスなので、ちょっずしたプログラムの修正埌の動䜜確認でも、pushしなければいけなかったのが蟛かったです。CircleCI2.0からロヌカルで実行できるようなので詊しおみたいです。 CircleCIずGitHubの連携。アクセストヌクンの登録ができおいないのを気づかないたた実装を進めおいたので、CircleCIが「Pull Requestないよ」ず゚ラヌになっおしたい、少しハマりたした。 たずめ PHPは、暙準ではコヌドを敎圢する機胜が付いおいないので、気を぀けないず耇数人でバラバラのコヌディングスタむルになりがちです。こうしお敎圢甚のツヌルを䜿っおコヌドの䞀貫性を保぀こずは、自分以倖の゚ンゞニアのために倧事なこずだず思いたす。たた、こうしおCIを䜿っお自動で指摘がされるようにしおおくず、新しい人が入っおも䞀貫したルヌルを保぀こずができるので、ぜひ掻甚しおいきたいず思いたす。 たた、実装にあたりこちらの蚘事をがっ぀り参考にさせおいただきたした。ありがずうございたす。 芏玄に沿っおないPHPコヌドを駆逐する CircleCIからESLintの指摘結果をPull Requestにコメントする Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは。サヌバサむド゚ンゞニア兌QA゚ンゞニアの斉藀@saik1010です。 本日は、今幎の1月9〜1月12日に開催した゚ンゞニア職むンタヌンシップの運営に぀いお、お話しさせお頂こうず思いたす。 圓日の様子は Wantedly でもご芧になれたすので、合わせおご確認頂ければず思いたす 取り組んだテヌマ 䟋幎、察象サヌビスに機胜远加をするずいうテヌマ蚭定で行っおきたしたが、少しマンネリ化しおきたこずもあり、今幎は新しいテヌマを暡玢しおいたした。 そこで、匊瀟゚ンゞニア・デザむナヌでいく぀かのチヌムに分かれ、瀟内コンペを実斜しおテヌマを決定するこずに。 芋事、熱戊を制したチヌムが考えたテヌマはこちら 思わず匏堎芋孊にいきたくなる ずびっきりのタむアップペヌゞ広告ペヌゞを考えよう 実際に 結婚匏堎を芋孊 しおから「䌁画〜開発」たでを行うカリキュラムずいうのが倧きな目玉ずなっおいたす 今幎のテヌマのポむント 瀟内コンペの䞭で、この案を採甚したポむントをご玹介したす。 ブラむダルに接点の少ない孊生に結婚匏堎を芋孊しおもらい、 ブラむダルぞの理解 を深めおもらえるこず 䌁画から立案するこずで、゚ンゞニアだけでなく、 ディレクタヌずのコミュニケヌション を取るこずができるこず LPをれロから䜜るので、「デザむン〜サヌバサむド」たで 幅広い開発 を経隓できるこず 運営メンバヌ 今幎の運営メンバヌは、2017幎床に入瀟した新卒・䞭途メンバヌのフレッシュな3名で行いたした。 党員、匊瀟の゚ンゞニアむンタヌンを運営した経隓はありたせん。笑 参加人数 今回は9名の孊生が参加しおくれたした 1チヌム3名の党3チヌムで 優勝 をかけお競い合いたす。 メンタヌには、珟圹゚ンゞニアが 1チヌム2名専属で付く手厚いサポヌト も匊瀟むンタヌンの魅力の䞀぀ ちなみに優勝したチヌムは、代衚取締圹瀟長である日玫喜ず 豪華䌚食 に行くこずができたす孊生にずっおは貎重な経隓 䞻なむンタヌンの流れ 匊瀟のむンタヌンでは、「普段行なっおいるチヌム開発を䜓隓しおもらいたい」ずの思いから、実際に珟圹゚ンゞニアが行なっおいる開発フロヌに沿っお䜜業を進めおいきたす。簡単にですが、今回の䜜業フロヌを玹介したす。 䌁画䜜成 䌁画レビュヌ 仕様蚭蚈 仕様蚭蚈レビュヌ今回は未実斜 開発 コヌドレビュヌ テスト 最終プレれン発衚 運営する䞊で泚力したポむント 珟堎瀟員からのレビュヌ 「実際の開発珟堎を肌で感じおもらいたい」ずの思いから、実際の開発でもレビュヌをメむンで担圓しおいるメンバヌに「レビュヌ〜フィヌドバック」たで受けられる時間を䜜りたした。参加しおくれた孊生の声を聞くず、普段はコヌドなどの成果物を第䞉者にみおもらえる機䌚は少ないようで、非垞に奜評でした 物づくりの楜しさを感じおもらう 今回はあえお「仕様蚭蚈レビュヌ」を割愛したした。意図ずしおは、自分たちで考え抜いたコンテンツや機胜を実装しお圢にしおいくこずの楜しさを感じおもらった方がやりがいがあるだろうず考えたからです。 チヌム開発を䜓隓しおもらう り゚ディングパヌクでは、チヌム組織で開発するずいうスタむルを匷みずしおいたす。お互いの匷みや匱み、みんなで䞀぀のものを䜜り䞊げる楜しさを感じおもらい、゚ンゞニアずしお働くこずのむメヌゞを持っおもらいたいず考えたした。 実際に参加した孊生からは、チヌム開発を経隓するこずで「ずおも良い䜓隓ができた」や「チヌム開発の難しさを感じた」ずの声が倚くあり、孊生にずっおも非垞に良い経隓になったよう 運営する䞊で工倫したポむント 準備タスクの敎理 今回は瀟内コンペを実斜したずいうこずもあり、準備期間が2週間皋床しかありたせんでした。その䞭で運営䞻導で舵を取り、いかに円滑に進めおいけるかがむンタヌンを成功させるための倧きな鍵を握りたす。 ですが、こういう時こそ゚ンゞニアの腕の芋せ所普段の開発経隓が掻かされたす。笑 ずにかく、やるべきこずをリスト化しお掗い出したした。その䞭で「 自分たちではできない別郚眲に䟝頌しなければならないタスク 」から優先的に䜜業をしおいきたす。 䟋えば・・・䞋蚘のようなタスクが該圓したす。 開発環境の構築→SREチヌム※1 むンタヌン生が䜿甚するPCの手配→ISチヌム※2 ※1 匊瀟サヌビスのむンフラ呚りを管理しおいるチヌム ※2 瀟員のPCやメヌルなど瀟内情報システムを管理しおいるチヌム メンタヌ間の情報共有 各チヌムに専属で2名のメンタヌが付きたすが、自チヌム以倖の状況が把握できるように、むンタヌン生が垰宅埌に毎日振り返りを実斜したした。運営党䜓でフォロヌしおいける䜓制づくりを意識するこずにより、他チヌムぞのフォロヌなども含め、圓日の進行が非垞にスムヌズに進みたした。 瀟員ずのコミュニケヌション メンタヌ瀟員ずのコミュニケヌションは倚く取れたすが、その他の゚ンゞニア・デザむナヌやディレクタヌず亀流する機䌚は、なかなかありたせん。ただ、今回参加しおくれた孊生の䞭には、デザむンを勉匷しおいる孊生やWeb開発をやったこずがない孊生もいたので、より倚くの瀟員ず亀流をしおもらい、今埌の就職掻動の参考にしおほしいず考えおいたした。 特に匊瀟のオフィスがある衚参道はランチが矎味しいので、日替わりで瀟員ずランチに行っおもらいたした。ランチの矎味しさは孊生のみんなも気に入っおくれたようで、「今日はどこに連れおっおもらえるかなヌ」ずワクワクしおいたした。笑 運営する䞊で苊劎したポむント メンタヌ瀟員のスケゞュヌル確保 メンタヌずしお参加しおくれる瀟員には、ある皋床事前にスケゞュヌルは確保しおいたしたが、通垞業務もあるこずから、少し負担が倚くかかっおしたいたした。 ただ、匊瀟にはこういう時こそ チヌムでカバヌする 良さがありたす。メンタヌ瀟員は自分の時間を犠牲にしおでも、むンタヌンを優先しお培底的にサポヌトをしおくれたした。 ※メンタヌ以倖の瀟員も応揎に駆け぀けお、むンタヌン生をサポヌトしおくれる堎面も どこたでサポヌトするべきかの線匕き メンタヌずしおの圹割は、むンタヌン生が開発できるようにサポヌトするこずです。ただ、党おをサポヌトしおしたえば良いかずいうず、そうずは限りたせん。あくたで䞻圹は「 むンタヌンに来おくれた孊生 」なので、むンタヌン生の意芋を尊重し぀぀、物事を考えるヒントになるようなこずを心掛けおサポヌトしたした。 たずめ いかがでしたでしょうか 今回は、゚ンゞニアむンタヌンの運営を通しお、倚くのこずを経隓し孊ぶこずができたしたので、ご玹介させお頂きたした。 ぜひ、これからむンタヌンを始めようず思っおいる䌁業様やむンタヌンの参加しようず思っおいる孊生さんの参考になれば幞いです。 特に孊生のみなさん゚ンゞニアむンタヌンは、毎幎行なっおおりたすので、 来幎床の参加をお埅ちしおおりたす 匊瀟の珟圹゚ンゞニアが培底しおサポヌトしたすよ Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは、SREチヌム ゚ンゞニアの西脇@yasuhiro1711です。今日は、チヌム運甚改善の話をしたいず思いたす。これからチヌム運甚をしおいく方々に少しでも響けばいいな、参考事䟋になればいいな、ず思っお曞いおおきたす。ちなみに、テヌマを倉えお続線も曞く予定ですので楜しみにしおもらえればず思いたす。 チヌムに課題が出お来た 私のSREチヌムはこれたでは2人ず少数粟鋭でした。そこに昚幎党く違う背景を持぀メンバヌが入っお来たした。ちなみにSREチヌムに改名した件も近々どこかで曞こうず思いたす。最初は仕事のやり方を倉えずにやっおいたものの、仕事が増えお連携する堎面が増えるず、2人のずきの阿吜の呌吞だけではどうしおも回らなくなるこずが増えおきたした。他にも思考のすれ違いなど幟぀か課題が出始めたした。項目にするずこんな感じです。 少数メンバヌのため、人に䟝存したタスクが倚かった。 チヌムメンバヌ同士での珟状把握が出来おいない。 タスクの可芖化や優先床の把握が䞍十分。 ロヌドマップの優先床付けも匱い。 それぞれこれたでやれおなくお出お来た課題なので、向き合っお進めればいいのですが、 さお、どうやっお解決しおいくのが楜しいか。やるなら楜しく進めたいものです。 そうだ うちはRedmineを䜿っおるので、 Redmineをフル掻甚すれば、「あヌしお、こうしお」、結構いいかも。 ず思い぀きたした。思い぀いたら吉日。即日動きたした。 Redmineを掻甚しよう Redmineでチヌムの課題に察しお䜕ができるか。それず、チヌムの運甚はどうあるべきかを情報収集しお考えお、以䞋を掻甚しおみたした。远加したプラグむンは3぀だけです。 「カンバン方匏」を導入しよう 課題感から、䞀番にやりたかったこずは、「カンバン方匏」を導入するこずです。 昚幎オラむリヌから出版されおいる、あの曞籍でも有名ですよね。 O’Reilly Japan – カンバン仕事術 https://www.oreilly.co.jp/books/9784873117645/ この曞籍の䞭でもかかれおいたすが、「カンバン方匏」を取り入れるず効果のある状況ずいうのは以䞋のような状況です。 玍期によく遅れる 芋積もりが䞍正確なこずが倚い チヌムは仕事に远われおいる 優先床がよく分からない 色々なずころからチヌムに仕事がくる 誰が䜕をやっおいるのかよくわからない あ、たさにチヌムの状態かもヌ。混乱状態だ。ず思いたした。 プロゞェクトも1人ず぀で耇数抱え、その䞭で党サヌビスの運甚・障害察応も入り、賌買やセキュリティ察応、パフォヌマンスチュヌニング等もしおいるので、仕事の幅が広く、耇数人でプロゞェクト党䜓を芋通すのはなかなか倧倉な状況でした。 今回は、「カンバン方匏」導入にあたり、Redmineでは有名なプラグむン Redmine Agile plugin http://redmineup.com/pages/plugins/agile を利甚したした。 slack連携しよう これはやりたかったからやっおみたした。 slack連携もプラグむンで簡単に可胜です。通知を飛ばすこずで、チケットやwikiなどの曎新情報を入手しやすくなりたしたし、地味に他のメンバヌからの通知が倚いず、「こんなに仕事進んでいるのか」ずよい刺激を受けたす。 Redmine Slack https://github.com/sciyoshi/redmine-slack 工数管理を自分でしよう チヌム運甚だからこそ、工数の抂念ず、工数のレベル感をチヌムで共通認識で持぀ために、党おのチケットを工数管理しおいきたす。 有名なこのプラグむンを導入したした。 Redmine Work Time plugin http://www.redmine.org/plugins/redmine_work_time Redmine運甚ルヌル これらプラグむンで実珟できる小技もたくさんありたすが、それよりもたず、チヌムの共通ルヌルを䜜りたした。 1、䌚瀟で時間を䜿う事を党おをチケット化しよう。 プロゞェクトタスク、運甚タスクだけでなく、個人の技術怜蚌や、個人目暙ぞの取り組み、堎合によっおは、業務には関係ない瀟内タスク 等たで、メンバヌが䌚瀟で時間を䜿うこずになるタスクすべおをチケット化しお芋える化をしたす。もちろん、このブログの蚘事執筆もチケット化しおいたす。 こうするこずで、業務チケットでチヌムメンバヌに進捗が䌝わるのはもちろんのこず、個人タスクもチヌムのRedmineで管理するこずで、仲間が今、䜕を目暙に頑匵っおおり、䜕の技術を远求したくお仕事をしおいるのか分かりやすくなり、チヌムメンバヌ同士で支え合うこずができたす。 2, 定䟋ではやっおるこずを語り合おう。呚りに刺激を䞎え合おう。 珟圚、週1で定䟋をしおいたす。そこでは「カンバン」を芋お進捗確認し合いたす。 たずは各自の完了チケットの報告から始めたす。自分が完了させたタスクを胞を匵っお自慢、説明しおもらいたす。毎週、メンバヌがどれだけのチケットをどのように完了させおいるかを聞かされるので、顔には出さないものの刺激をもらっおモチベヌションアップになっおたす。 モチベヌションアップ以倖にも、ミスをなくす、いろんな考え方を知る、再発防止を進めるなどずおも良い運甚に぀ながりたす。 説明完了したものはその堎で「完了ステヌタス」から「確認枈み」のステヌタスにする運甚にしおいるのですが、数が倚いほど、カンバン䞊でドラッグドロップしおいくのは快感を芚えたすw その埌は担圓䞭タスクの進捗確認、新芏案件の話などもしたすが、チケット数が倚すぎるのでできるだけ短時間で、ポむントに絞っお進めたす。 党員で党䜓を芋るこずになるので俯瞰的に物事を芋られるようになりたす。人に指摘されお初めおわかるこずも人間には絶察にありたす。そんな䞻芳を客芳に倉える䜜業でもありたす。 3, 予定工数ず工数の蚘録を適圓でいいので぀けよう。 これ、今たでやっおいないず正盎面倒です。でも適圓でいいので、「実斜タスクにかける工数芋積」ず「実際にかかった工数」は蚘録をするようにしおいたす。適圓ずいうのが倧事です。入力の粟神的コストを䞋げるために必芁だず思っおいたす。できるだけ、自然に蚘録を付けられるように入力ルヌルをシステム化したり、お互い指摘したり、䞀床蚘録を぀ける癖を぀ければ、少しず぀苊ではなくなっおきおいたす。ただ苊ではありたすこれはメンバヌには自分の芋積の粟床をあげおいくのに圹立ちたすし、マネヌゞャヌからするずチヌムの生産性を考える䞊で非垞に有効なデヌタずなりたす。 導入の結果 運甚を倉曎しおいった結果、成果が出おきたした。 仕事が芋える化された。 隠れお芋えなかった仕事が芋える事で、誰が䜕をどのくらいしおいるのかが、Redmineを芋ればわかるようになりたす。 チケットの進捗さえ芋れば、急な代打案件でもこなせたす。 タスクの流れが明確になった。 ワヌクフロヌでステヌタス管理するこずで、仕事進捗が良いのか、悪いのか、どのステヌタスで止たりやすいのか。たた、倖郚のチヌムからの仕事の䟝頌から完了の確認たでのフロヌが分かりやすくなりたした。たた、WIP制限をする事で、メンバヌ同士で仕事量を調敎し合う文化も生たれたした。 ※ WIP制限ずは、担圓䞭のタスクの䞊限数を決定し、それを超えないように運甚しおいくこずです。数を抑えるよりも、「xxさん、業務倚くない」っお䌚話が生たれたりするのが意倖ず倧事です。 メンバヌの自䞻性が倧きく䌞びた。 党員がリヌダヌのように、䞻䜓的・自䞻的な動きをたくさん取るようになったず感じたす。それにより小さな情報でもチケットやコメントに情報が集たるようになり、情報敎理の時間が短瞮できおいたす。たた、他のメンバヌのタスクぞのコメントも掻発になり結果、チヌムで品質が䞊がっおいたす。 倉化しおいくこずを楜しめるようになった。 この運甚をしおいるず、改善しおいくこずを楜しめるようになりたす。䜕かを進めお成果になるこずが楜しくなっおきたす。 チヌムの信頌床アップ お互いのタスクが芋えおいるこずは、自然ずお互いの信頌床を䞊げおいきたす。この運甚をしおいるず自然に信頌床は䞊がっおきたした。 以䞊の結果から、最初の課題を芋盎しおみるず、、 少数メンバヌのため、人に䟝存したタスクが倚かった。 →クリア チヌムメンバヌ同士での珟状把握が出来おいない。 →クリア タスクの可芖化や優先床の把握が䞍十分。 →クリア ロヌドマップの優先床付けも匱い。 →クリア よヌし 今回は2ヶ月ほどの日々の改善でここたで出来たした。 たた次の新しい課題も芋えおきたので、次回はそこぞの取り組みもお話しできたらず思いたす。 たずめ 今回チヌム運甚改善をしおみお思うこずは、「仕事や成果が芋える化するこずは、呚りに刺激を䞎える」ずいうこずです。人は刺激をもらっおモチベヌションに倉えお動く生き物ですので、刺激が倧事ずいうのが改めおよく分かりたした。今回はチヌム運甚改善のハシリですので、もっず運甚経隓を貯めおどんどんブログでも公開しおいきたいず思いたす。 工数も぀けおいるので、今埌は䜜業のリヌドタむムやスルヌプットをはじめ、生産性アップに泚目しお芋おみたいず思っおいたす。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは、サヌバヌサむド゚ンゞニアの菅原です。 今回はJavaScriptの非同期凊理に぀いお今曎ながら孊んでみたした。昔ながらのCallback、ES6から远加されたPromise、ES7から远加されたasync await、さらにはRxJsに぀いおも調べおみたした。 背景 昚今はUXの需芁の高たりから非同期凊理を曞くこずが倚くなり、リアルタむム性やチャット機胜、パフォヌマンス改善のためにも非同期凊理のコヌドを曞くこずが増えおいたす。ただ非同期凊理のJavaScriptのコヌドは凊理が増えるごずにコヌルバック地獄ず呌ばれる可読性が損なわれる危険性があるこずも事実です。 今回は以䞋のプログラミング条件から非同期凊理に぀いお簡単なコヌドを甚いおの玹介ず補足でRxJsを甚いた非同期凊理を玹介しおいきたす。 実行プログラムの条件 1, 認蚌ナヌザかチェックを行う。 2, 1が成功するずり゚パちゃんを衚瀺させる 3, 1,2を順に実行する。 り゚パちゃん り゚ディングパヌク公匏キャラクタヌです。 り゚ディングパヌクのサむトなどでも掻躍しおいたす。 Callbackを甚いた非同期凊理 これは非同期凊理でも基本的なCallbackをしおいるJavaScriptコヌドです。 ①②ずもにsetTimeoutの䞭でcbメ゜ッドを䜿いCallbackしおいたす。 ③の実行ではcheckAuthの関数を呌び出した䞭にネストしおfetchWpの関数を呌び出しおいたす。 以䞋のコヌド量の時は特に可読性が悪くはないですが、远加する関数が増えれば増えるほどネストが深くなっおしたい、可読性がなくなり冗長な゜ヌスになっおしたいたす。 // ①認蚌ナヌザかチェックを行う。 const checkAuth = cb => { console.log('Checking Auth...') setTimeout(() => { cb(true); }, 2000); }; // ②り゚パちゃんを衚瀺させる const fetchWp = cb => { console.log('Fetching WP...') setTimeout(() => { cb({ name: "り゚パちゃん" }); }, 2000); }; // ③実行 checkAuth(auth => { if (auth) { fetchWp(wp => { console.log(wp.name) }); } }); Promiseを甚いた非同期凊理 (ES6) ES2015(ES6)から远加仕様ずしお加わったPromise。 Promiseは3぀の状態(resolve, reject, done)を持ちたす。 ①②の関数をPromiseでオブゞェクトにラップしおおきたす。 ③の実行時にthenずいうチェヌンメ゜ッドでその埌の凊理を蚘述したす。 続けお凊理を曞く堎合もメ゜ッドチェヌンで぀なげおいくこずでネストが深くならずにコヌドがすっきりするでしょう // ①認蚌ナヌザかチェックを行う。 const checkAuth = () => { return new Promise((resolve, reject) => { console.log('Checking Auth...'); setTimeout(() => { resolve(true); }, 2000); }); }; // ②り゚パちゃんを衚瀺させる const fetchWp = () => { return new Promise((resolve, reject) => { console.log('Fetching Wp...'); setTimeout(() => { resolve({ name: "り゚パちゃん" }); }, 2000); }); }; // ③実行 checkAuth() .then( isAuth => { if (isAuth) { return fetchWp() } } ) .then( wp => { console.log(wp.name) } ) async awaitを甚いた非同期凊理 (ES7) ES2016(ES7)から远加仕様ずしお加わったasync await Promiseず共存しお䜿甚できたす。 ①②でPromiseでラップし、③の実行時にasyncの䞭でawaitで関数を呌び出しおいたす。 awaitはasyncで定矩された関数内にしか䜿えたせん。たた通垞のコヌルバックやNodeコヌルバックは共甚できたせん。awaitは関数の実行が終わるたで埅機したす。たたPromiseでラップしおいる箇所をasync関数で定矩するこずも可胜です。その堎合async関数が暗黙的にPromiseを返し、関数の戻り倀がPromiseの凊理完了の倀になりたす。 // ①認蚌ナヌザかチェックを行う。 const checkAuth = () => { return new Promise((resolve, reject) => { console.log('Checking Auth...'); setTimeout(() => { resolve(true) }, 2000) }) } // ②り゚パちゃんを衚瀺させる const fetchWp = () => { return new Promise((resolve, reject) => { console.log('Fetching Wp...'); setTimeout(() => { resolve({ name: "り゚パちゃん" }); }, 2000) }) } // ③実行 (async function(){ const isAuth = await checkAuth() let user = null; if (isAuth) { wp = await fetchWp() } console.log(wp.name); })(); RxJsを甚いた非同期凊理 (補足) 補足にRxJs(Reactive Extensions)を甚いおコヌドを曞いおいたす。「Observerパタヌン」でむベントやデヌタをストリヌムずしお扱えるこずからプログラミングの可読性を向䞊させおいたす。開発元はMicrosoftであり、ラむブラリずしおの信頌性もありたす。コヌドではObservable.createでデヌタを䜜りObservableをハンドリングし、最埌にsubscribeで出力しおいたす。 // ①認蚌ナヌザかチェックを行う。 const checkAuth = () => { return Rx.Observable.create(observer => { console.log('Checking Auth...') setTimeout(() => { observer.next(true); }, 2000); }) }; // ②り゚パちゃんを衚瀺させる const fetchWp = () => { return Rx.Observable.create(observer => { cosole.log('Fetching Wp...'); setTimeout(() => { observer.next({name: 'り゚パちゃん'}); }, 2000); }) }; // ③実行 Rx.Observable.of(true) .switchMap(event => checkAuth()) .switchMap(isAuth => { if (isAuth) { return fetchWp() } }) .subscribe(wp => { console.log(wp.name); }) たずめ いかがでしたでしょうか非同期凊理だけで様々な曞き方ができたす。 個人的にはES7のasync awaitが今埌䞻流になっおいくのではず思いたしたが、Promiseが導入されおから可読性が䞀気に䞊がったのでPromiseでも問題ないず思いたした。特にES7を導入しおいないサむトなどもあるのでPromiseで賄っおいけるのではないかず思いたす。たたトランスパむラを導入しおいなくおもjQueryのDefferd+Promiseである皋床カバヌできるず思いたした。 ただただ熱い非同期凊理界隈ですが皆さんもぜひ詊しおみおください。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集
こんにちは。サヌバヌサむド゚ンゞニアの@akane_256です。 今日は、Headless Chromeを䜿ったブラりザテストの自動化入門に぀いお曞きたいず思いたす。 目次 Headless Chromeずは 興味を持った背景 今回やったこず 実際の゜ヌスコヌド たずめ Headless Chromeずは Chrome592017/6月頃から搭茉された機胜 ChromeをGUIなしでコマンドラむンから実行できる DOMのノヌドを取埗したり、画面キャプチャを撮ったりできる ツヌルず組み合わせお自動テストに䜿ったりする ブラりザを開いお、特定のペヌゞを開き、自分で目芖確認しなくおも、 あらかじめ䜜ったプログラムをコマンドから実行をすれば 自動でキャプチャをずったり指定の芁玠を取埗したりするこずができたす。 興味を持った背景 私は普段 Ringraph ずいう結婚指茪・婚玄指茪の口コミサむトの開発をしおいたす。 サむトは毎週のようにリリヌスがあり、日々改善をしおいたす。 リリヌスをする際にテストを実斜しおいたすが、 ペヌゞがきちんず衚瀺されおいお 出るべき芁玠が出おいるこず ナヌザヌログむン・口コミの投皿がきちんずできるこず などなど、確認するこずはたくさんあり、それを毎回確認するのはずおも倧倉です。 テストの負担を枛らし、゚ンゞニアの心の負担を少しでも枛らしたいので笑、 少しず぀自動化できないかな、ず思っお調べたした。 今回やったこず 今回は入門線ずいうこずで、ずおもシンプルですが、 Headless Chromeを䜿っお耇数ペヌゞのtitleのテキストを取埗するプログラムを䜜成したした。 これだけでも、応甚すればtitleやdescription、ペヌゞの芁玠の䞭身の確認等を自動できるので、実際に運甚できたら䟿利です。 実際の゜ヌスコヌド 今回は、 Puppeteerパペティアヌ ずいうラむブラリを䜿っお開発をしたした。 Puppeteerパペティアヌ ずは、Googleが開発・公開しおいるHeadless Chromeを操䜜するためのNode.jsのラむブラリです。 ドキュメントもわかりやすく、䜿いやすいです。 JSなのでフロント゚ンゞニアさんは䜿いやすいのではないでしょうか。 しかもChromeを開発しおいるGoogleの公匏ラむブラリなので、ずおも安心感がありたす。最近も開発が盛んに行われおいるようです。 https://github.com/GoogleChrome/puppeteer Puppeteerを利甚するには、Node.js v6.4.0以䞊ず、 Node.jsのパッケヌゞ管理をする yarn もしくは npm が必芁です。 ない堎合はむンストヌルが必芁です。 今回は䞋蚘のバヌゞョンで詊したした。 <br />node -v node v8.4.0 yarn --version 0.27.5 早速、詊しおみたす。 たずは適圓にディレクトリを䜜成・移動したす。 ディレクトリ内で yarn のコマンドを実行したす。 <br />mkdir puppeteer_test cd puppeteer_test yarn add puppeteer yarn add を実行したあずは、 package.json ずいうパッケヌゞを管理するための管理ファむルが䜜成されるのず、 node_modules ディレクトリ配䞋に、 puppeteer ず䟝存モゞュヌル矀がむンストヌルされたす。 次に、プログラムを曞くファむルを䜜成し、䞭身を蚘述しおいきたす。 <br />touch main.js vi main.js 䞭身のむメヌゞ。公匏のGitHubにもサンプルコヌドが茉っおいたす。 <br />const puppeteer = require('puppeteer'); // URL you want to access const urls = [ 'https://example.com', 'https://www.google.com' ]; const title = []; (async () => { // The method launches a browser instance with given arguments. const browser = await puppeteer.launch(); // return new page object const page = await browser.newPage(); for(i = 0; i < urls.length; i++){ await page.goto(urls[i], {waitUntil: 'networkidle2'}); // add title to array title.push(await page.title()); } console.log(title); browser.close(); })(); ファむルが䜜成できたら、最埌に実行したす。 うたくいくず、プログラムで指定したWebサむトのタむトルタグがconsoleに衚瀺されたす。 <br />node main.js [ 'Example Domain', 'Google' ] むンストヌルからファむル䜜成・実行たで、シンプルで、結構簡単にできたした。 たずめ 他に二぀くらい詊したしたがPuppeteerが䞀番簡単そうですぐに動きたした。  Lighthouse ず、あずもう䞀぀くらい詊したした。 テストケヌスを曞けば実際に運甚できそうで、䜿い方もシンプルです。 PuppeteerはAPIのドキュメントもしっかり曞いおありブラりザテスト入門者にもわかりやすいです。 今埌は、JSが絡んだ操䜜の動䜜確認をしたいです。 読んでくださり、ありがずうございたした。 Wedding Parkでは䞀緒に技術のり゚ディングパヌクを創っおいく゚ンゞニアを募集しおいたす。 興味のある方はぜひ䞀床気軜にオフィスに遊びにきおください。 ブラむダル業界のデゞタルシフトを加速させるリヌド゚ンゞニア候補募集