Shibuya.go#2を開催します!
Shibuya.goの2回目を開催します!
前回 Shibuya.go#1を開催しました。 - すずけんメモ に引き続き、弊社オフィスにて開催します!前回も盛りだくさんで、懇親会もだいぶ色々な話ができて楽しかったので今回もまた色々なお話ができれば嬉しいです。
Shibuya.go#1を開催しました。
今週の火曜日に Shibuya.go#1 - connpassを開催しました。ご来場していただいた皆様、発表者の皆様、どうもありがとうございました。
渋谷近辺、都内近郊でGoを書いている人ともっと会いたいなぁと思い、今回開催するにいたりました。私は普段から仕事でも仕事以外でもGoを使っているのですが、どうもあまりGoを書いている知り合いがあまりいないのでせっかくだし開催してみようと思ったのでした。人が集まるかなぁと思いつつ募集してみたら嬉しいことに多数の参加申し込みをいただき、抽選となってしまいました。参加できなかった方々申し訳ありません・・。
発表資料をまとめておきます。発表者のみなさま、どうもありがとうございました。
資料です https://t.co/8A2uJxbuUS #shibuyago
— suzuken (@suzu_v) 2016, 2月 16
資料です https://t.co/XjnhXvEH2g #shibuyago
— aihara (@shunsukeaihara) 2016, 2月 16
本日の発表資料です #shibuyago / “horenso ~ 報・連・相” https://t.co/PQGEYD94Ru
— songmu (@songmu) 2016, 2月 16
本日の発表資料です!Revelサイコー!! #shibuyago Go+Web App - Shibuya.go#1 https://t.co/HuY7Ippqal
— kaneshin@かねしん (@kaneshinth) 2016, 2月 16
https://t.co/f96RavAaD8 わたくしの先ほどのスライドを上げました #shibuyago
— トーカナイザの守護霊 (@mackee_w) 2016, 2月 16
#shibuyago で発表した資料です / “revealgo - Shibuya.go#1” https://t.co/yvhcv4PhMr
— Yusuke Wada (@yusukebe) 2016, 2月 16
発表した資料です https://t.co/H4uz3Lg0eZ #shibuyago
— Gosuke Miyashita (@gosukenator) 2016, 2月 16
また発表後も飲みつつ、色々なお話をすることができました。Goの集まりでしたがPerl感があったとの噂です。また来月も開催予定ですので、是非また参加していただけると幸いです!
その翌日(おとといですね)は Go 1.6 Release Party - connpass に行ってきました。主催者のみなさん、会場を用意してくださったはてなさん、どうもありがとうございました。こちらも楽しい会で、残念ながらGo 1.6はパーティー前にはリリースされなかったのですが、Gopherのみなさんとお話できて楽しかったです。 Go 1.6 is released - The Go Blog にもあるとおり、Go 1.6はリリースされました。私もさっそく今日一部のサーバにGo 1.6でビルドしたものをデプロイしました。
Travis CIを利用した継続的な成果物の配置
こんにちは。 @suzu_v です。 Advent Calendar 2015 18日目 休載のお知らせ - VOYAGE GROUP techlog とのことだったので代打で書いてみます。*1
いま私が所属している fluct ではCIの一部にTravis CIを利用しています。用途としては、
- 継続的なテスト
- 継続的なビルド
というところを担当しています。今日は簡単に、
の紹介をします。
Travis Artifacts
travis-ci/artifacts はTravis CIのアドオンとして利用されているもので、ビルド済みのartifactsを扱うことができます。私たちは一部のバッチやAPIサーバの実装について、Travis CIを利用したビルド及びs3への転送を行っています。
プロジェクト構成は概ね以下のようになっています。この場合Goのアプリです。
github.com/your-username/your-reponame .travis.yml Gomfile Gomfile.lock Makefile ci.mk cmd/myapp.go kuke.go kuke_test.go
.travis.yml
には以下のように設定しています。
sudo: false language: go go: - 1.5.2 before_script: - export PATH=$HOME/gopath/bin:$PATH install: make -f ci.mk deps script: - make -f ci.mk test - make -f ci.mk build addons: artifacts: paths: - $(git ls-files -o --exclude-standard | tr "\n" ":") debug: true bucket: your-bucket target-paths: artifacts/$TRAVIS_REPO_SLUG/$TRAVIS_BRANCH s3_region: "ap-northeast-1"
このようにすると s3://your-bucket/artifacts/your_user_name/your_repo_name/branch_name
以下にビルド物が展開されます。例えば github.com/suzuken/gs
のmasterブランチのビルドに対しては s3://your-bucket/artifacts/suzuken/gs/master
以下に成果物(artifacts)が配置されます。Pull Requestを出した場合にも同様で、トピックブランチごとのartifactがs3に配置されます。テストをするサーバ側ではこのartifactを aws s3 cp
などで取得し、利用することができます。ちなみにブランチ以外にもcommit hashやtagごとに出す、ということもできます。詳しくは travis-ci/artifacts をみてください。
git ls-files -o --exclude-standard | tr "\n" ":"
というのはざっくりいうと「git管理下では無いファイル」をリストする、ということをしています。こうすることでビルドされたものだけs3へのアップロード対象にすることができます。
ci.mk
というのはCI用のMakefileです。Makefile
は開発用に、 ci.mk
はCIで使うように、と分けています。実際にそれぞれやっていることはあまり変わりませんが、こうすることでプロジェクトごとのCI用のマクロを揃えておくということがやりやすくなります。例えばJavaのプロジェクトでもこの仕組をつかおうとしたときにでも、 make -f ci.mk install test build
すれば成果物ができる、という取り決めにしておけばよいのです。
実際に ci.mk
の中身は以下のようになっています。(プロジェクトによって若干異なりますが、Goのプロジェクトだと概ね以下のようになります。)
.PHONY: install build test deps BRANCH := master GOOS := linux GOARCH := amd64 deps: go get github.com/mattn/gom gom install test: gom test -v ./... build: myapp.$(GOOS).$(GOARCH).gz -rm myapp.$(GOOS).$(GOARCH) myapp.$(GOOS).$(GOARCH): GOOS=$(GOOS) GOARCH=$(GOARCH) gom build -ldflags "-X=main.version=$(shell git rev-parse HEAD)" cmd/myapp.go mv myapp $@ myapp.$(GOOS).$(GOARCH).gz: myapp.$(GOOS).$(GOARCH) gzip -f $< clean: -rm -rf myapp.$(GOOS).$(GOARCH) -rm -rf myapp.$(GOOS).$(GOARCH).gz
依存の管理には mattn/gom を利用しています。Go版のBundlerのようなものです。s3への転送は myapp.linux.arm64.gz
だけを配置する、ということにしたいので適当に整理しています。
Travis CIからS3への転送についてはcredentialが必要になります。これはTravis CIのプロジェクト設定で、環境変数から読み込ませることができます。 Uploading Artifacts on Travis CI - Travis CI に書いてあるとおり、リポジトリの設定から以下を設定します。
ARTIFACTS_KEY=(AWS access key id) ARTIFACTS_SECRET=(AWS secret access key) ARTIFACTS_BUCKET=(S3 bucket name)
Bucketについては .travis.yml
に設定してもよいでしょう。Travis CI側ではtestが通らないとbuildが実行されないようにしているので、これでビルドが通ったもののみs3に配置される、ということになります。
以上、簡単ですが代打でした。明日は @qooh0 さんです。
小ネタ
*1:決してTravis CIのビルドが詰まっているので息抜きに書いているわけではありません。 Travis CI Status - Start delays on legacy precise infrastructure for travis-ci.com (private) builds
#ajiting Advent Calendar 1日目
#ajiting Advent Calendar 2015 - Adventar 1日目
明日は @brtriver です。
aws-cliのs3api put-objectでContent-MD5ヘッダをつける
put-object — AWS CLI 1.9.2 Command Reference をみると --content-md5
オプションがある。 PUT Object - Amazon Simple Storage Service にあるとおり、
To ensure that data is not corrupted traversing the network, use the Content-MD5 header. When you use this header, Amazon S3 checks the object against the provided MD5 value and, if they do not match, returns an error.
ということでオブジェクトの完全性をチェックするには Content-MD5
ヘッダをPutObjectリクエストにつけるとよい。
AWS Developer Forums: awscli put-object --content-md5 trouble ... でもハマっている人がいた。最初 md5
とか md5sum
コマンドでやっていたのだが、これだとhexになったのが出てくる。 https://www.ietf.org/rfc/rfc1864.txt にもあるとおり、Content-MD5ヘッダに設定すべきは base64(md5)
であり base64(hex(md5))
ではない。ということでこれをまとめて aws s3api put-object
をつかって書くと以下の様にして実現できる。
# s3://your-bucket/your-key-prefix/obj に カレントディレクトリのobjをPutObjectする。
aws s3api put-object --bucket your-bucket --key your-key-prefix --content-md5 `openssl dgst -md5 -binary obj | openssl enc -base64` --body obj
APIを適当な言語で使っている場合にはmd5 sumのbinaryをPipeして組み立てればよいのだが、cliだとうっかりハマってしまった。ちなみにresponseのETagはPutしたObjectのmd5 checksumのhexが返ってくるので、これも合わせてチェックするとさらによいだろう。 レスポンスの例は以下のとおり。
{ "ETag": "\"a41422711fcbb0982991580e0d4799f6\"" }
これは md5sum -q obj
の結果と等しくなる。ただしMultipart Uploadの場合には必ずしもそうはならないので、留意すること。
vim-go-extraからvim-go に移った
ずっと vim-jp/vim-go-extra をつかっていたのだけど、oracleとかvetとかもろもろ扱いやすくしたいなと考えていたらもう fatih/vim-go でいいか、と考えてvim-goに移った。
前から dgryski/vim-godef を重宝していて、Godocをみるよりもソースに飛んでドキュメントとコード両方みる、みたいなことをしている。vim-goだとデフォルトの gd
の挙動がカレントバッファにジャンプ先を表示してしまって使いづらかったのでaliasを足しておいた。
nmap gs <Plug>(go-def-split)
ということで gs
で godef
をつかうようにした(sleepさんごめんなさい・・)。ちなみにsplitでみるのは私の癖で、実装元のコードと実装しているコードを並べて見ながら書く癖があるためである。並んで表示されていないと、すぐ忘れて行ったり来たり・・というのを繰り返してしまうのである。
vim-goにして3週間ほど経つけど問題ないので、ひとまず使い続ける予定。
re:Invent 2015のスライドをみたメモ その2
re:Invent 2015のスライドをみたメモ - すずけんメモ のつづき。
(BDT320) New! Streaming Data Flows with Amazon Kinesis Firehose
- KinesisのGMとPMの方の発表
- Kinesis Streamの最近のupdate
- Kinesis Firehose
- Redshiftへの適用
- COPYコマンドを発行できる
- Amazon Kinesis Agent
- Firehoseのためのagent
- ファイルをモニタリングしてDelivery Streamにおくったり、ファイルのローテーションおいかけたり、リトライしたりする
- Fluentdみたいなやつっぽいさがある
- Agentの状況はCloudWatchでみることができる
- AgentはFirehoseだけじゃなくてKinesis Streamにもつかえる
- Writing to a Delivery Stream with Amazon Kinesis Agents - Amazon Kinesis Firehose
- Firehoseは1GBあたり0.035ドル
- FirehoseはKinesis Streamとちがって、設定して突っ込めばs3とかRedshiftまで送ってくれるツール。Kinesis Streamはカスタムしたいユーザ向け。
- Firehoseの場合、特に管理しなくて良い。かつストリームに対して60秒以内にもろもろ仕事してくれるらしい
- consumer側を書かなくて良いのは楽だなぁ
- FirehoseをつかったS3への転送
- Amazon Kinesis Analytics
- まだリリースはされてない
- Kinesis StreamだけじゃなくてFirehoseのdelivery streamもつかえるらしい
(BDT303) Running Spark and Presto on the Netflix Big Data Platform
- Netflixの中の人のプレゼン
- 視聴時間、Quarterで100億時間とな・・会員も6500万人以上
- s3に25PB, 1日5500億イベント
- 相変わらずEMRつかってるらしい
- ParquetサポートのPredicate pushdownってなんだろ
- ああ、読むひつようのないrow groupをskipするってことかな
- Sparkもつかってる。 on YARN
- YARNのDynamic Allocationがだいぶ重宝されてる感じだ
- Sparkでのs3のlistが遅い問題
- s3のlistはそもそも遅いんだけども、Netflixだと1テーブルのpartitionが100万とかになったりするらしい
- AmazonS3Clientを並列に実行してバルクでパーティションをリストするようにしたとのこと
(SPOT302) Availability: The New Kind of Innovator’s Dilemma
- NetflixのPerformanceとReliabilityのDirectorの方
- 3 regionでactive-activeはすごいな・・・
- microservices構成、それぞれのserviceごとにASGがわかれている
- 500以上のマイクロサービスがある
- AsgardじゃなくてSpinnakerというのに移行しているらしい
- ビデオでみたいセッションだ
(CMP407) Lambda as Cron: Scheduling Invocations in AWS Lambda
- Sophosの人のセッション
- あれ、これLambdaのscheduled events使うのじゃだめなのか?
- ああ、Lambda functionでsignalの波形になるようなのつくって、CloudWatchにおくり、alartをSNSにhookして定期実行させてるのか・・
- g-a-d/lambda-cron
** NOTE ** Amazon have now announced native scheduled functions for Lambda. You are very much advised to use those as opposed to this!
切ない
(BDT207) Real-Time Analytics In Service Of Self-Healing Ecosystems
- Anomaly Detectionの話題が
(ARC348) Seagull: How Yelp Built A System For Task Execution
- Yelpの方。CIにおけるテスト高速化の話。
- Seagull: 並列なタスク実行のための分散システム
- テスト実行とかをしてるらしい
- 1日に350 seagullが走ってる
- 1 seagullごとに7万テストはしってる
- 2日間終わらないこととかあった
- 3000のテストを200台のクラスたで実行してる
- 2日間かかってたのが14分で終わるようになった
- artifactのダウンロードだけで1日に36TB...
- というかなぜそんなにartifactをダウンロードする必要があるのだろう
- 1日に150万Dockerコンテナつくってるらしい
- 構成はJenkinsクラスタ、ジョブ実行のためにcontainerなどなど
- Homepage - SignalFx を監視につかってるらしい
- Jenkinsではartifactをs3にあげてる
- artifactは数百MBになるらしい
- Jenkinsでテストがあるか否かを見つけている
- テストの優先順位付けをしている
- それぞれのテストにかかった時間をDynamoDBにいれてる
- Prioritizerでそれをみるだけで2500万レコード/日してるらしい・・・
- とはいえ月に200ドルくらい
- ピークタイムにテストが集中する
- Mesosのスケジューラを使って、600ワーカ立ててる
- r3.8xlarge 200台
- Mesosのスケジューラを使って、600ワーカ立ててる
- s3からのartifactダウンロードに時間がかかるのでnginxでserveするようにしたらしい
- originはs3でfrontにnginxってことかな?
- autoscaleの計算も、必要なメモリの総量を見積もってから行っている
(ARC308) The Serverless Company: Using AWS Lambda
- Lambdaの人
- ビデオのtranscodeからaudioの抽出、サムネイル作成まで全部Lambdaでやってる事例面白いな
- 普通にexecでffmpegを実行していた。
- Lambdaのtips
(STG401) Amazon S3 Deep Dive & Best Practices
- デモが面白そうな感じ
- というかほとんどデモだこれ
(STG306) EFS: How to store 8 Exabytes & look good doing it
- amazon.comの人
df -H
で9.3Eとかでててやばい- EFSのパフォーマンスモデル
(BDT318) How Netflix Handles Up To 8 Million Events Per Second
- Netflixの人、Event and Data Pipelines担当らしい
- Chukwa - Welcome to Apache Chukwa
- ああ、Kafkaの多段構成にかわったのかな
- frontのKafkaにd2.xlargeとな・・・
- routingにSamzaをつかっている
(DVO313) Building Next-Generation Applications with Amazon ECS
- METEORの中の人
- Meteor
- JavaScriptでwebとモバイルアプリのビルドするプラットフォーム
- ああ、それで実行環境を分離できるECSはうれしいってことなのかな
- Mobileだとconnected clientなアーキテクチャになると
- connection貼りっぱなしの状態だとデプロイとかtrackingとかも大変
- requirements
- 10000オーダーの同時接続がある
- clientが接続してくる層と裏のserviceレイヤをわけているらしい
- WebSocketの場合、もし違うECS内のappに接続した場合にはcookieでIDを取得して、裏側のサービスへの問い合わせにつかっているっぽい
- 裏側のサービスはユーザごとになるべく同じものを利用するようにする方針ぽさ
- もし裏側のサービスが落ちていたらproxyが別のappを選択するようにしている
- サービスをデプロイする場合には、まずcontainerを配置してから古いcontainerを落とす
- するとproxyが新しいcontainerを選んでくれる
- WebSocketの場合、もし違うECS内のappに接続した場合にはcookieでIDを取得して、裏側のサービスへの問い合わせにつかっているっぽい
- サービスメトリクスはcontainerごとに取得している
- Docker Remote APIでとれる
(ARC403) From One To Many: Evolving VPC Design
- AWSのPrincipal Solutions Architectの人
- 家で試しましょう!とな
- Scalable, Available NAT
- NATを使わずにpublic subnetsでやるという選択肢もあるけどね
- HA NATをEC2 Auto RecoveryとAuto Rebootを使って実現しよう
- Auto Recovery
- c3, c4, m3, r3, t2ならつかえる
- Status Checkがこけたときにhookできる
- rebootしたりとかもできる
- VPC Endpointについて
aws ec2 create-vpc-endpoint --vpc-id vpc-40f18d25 --service-name com.amazonaws.us-west-2.s3 --route-table-ids rtb-2ae6a24f rtb-61c78704
- route tableについて
VPCE
なtargetを追加できる- Prefix list: ロジカルなdestination target
- s3のip rangeが変わってもこれで勝手に対応される
(SPOT301) AWS Innovation at Scale
- 見れなくなってる?
(NET307) Pinterest: The road from EC2-Classic To EC2-VPC
- PinterestのVPCへの移行事例
- 1億のpinする人、ピークで15万リクエスト/秒
- 移行理由はNetworkパフォーマンス、あとはセキュリティか。
- 先にDBから移行したのか
(GAM402) Turbine: A Microservice Approach to 3 Billion Game Requests
- Turbineというゲーム会社の発表
- Scaling MongoDB?
- Mobile game platformの構成、ごりごりのCoreOSインフラだ
- Go, Docker, CoreOS.
- microservice構成になっててConsulつかってdiscovery
- containerつかってるけど全部1MB以下らしい
- OS入ってないcontainer
- MongoDB構成
- r3.2xlarge, 1shardあたり3台, 2TBのGP2
- 100GB/hでoplogがでる。
- backupも日に数TB
- r3.8xlargeとかにしてshard数減らしたりもしたけど、結局r3.2xlargeでシャード増やしたほうが安定したらしい
- write lockが5%分だけ起きてた
- シャードを増やしたら安定
- あと新しいLinux Kernelつかうとよくなったらしい(コンテキストスイッチの回数が減ったとのこと
- failoverするとき、メモリが大きすぎると逆にcompactionに時間がかかって失敗していたらしい
- failoverのためにmongodが詰まる
(STG403) Amazon EBS: Designing for Performance
- 200万volume/日でつくられているらしい。
- Kernel 3.8以上でIndirect grantsがつかえるらしい
- queueごとに4096KBつかえる
- Pre-warmingいらなくなった件について
- もうpre-warmingはおすすめじゃなくなったらしい
(DVO209) JAWS: A Scalable Serverless Framework
(DVO202) DevOps at Amazon: A Look At Our Tools & Processes
- AmazonでのDevOps話
- 年間5000万回デプロイ
(CMP402) Amazon EC2 Instances Deep Dive
- EC2のPrincipal PMの方
- Partition周りについてもがっつり説明されている
- paritionの計算方法変わるかも、って書いてるな
- Burst capacityについても数字でてるな
- provisioned capacityが1200なら300秒間で3600CUが余力らしい
- それでも足りなかったらthrottled requestになる
- hot keyとかhot partitionが多くてもthrottledになるとのこと
- provisioned capacityが1200なら300秒間で3600CUが余力らしい
- AdRollのテーブルはうちでやったモデリングとほぼ一緒だ
- Messaging appのmodeling例面白い
(ARC346) Scaling To 25 Billion Daily Requests Within 3 Months On AWS
- 250億リクエスト/day
- Data Processing Engine
- Riakだ。messagingはRabbit MQでやってるらしい。
(BDT209) Launch: Amazon Elasticsearch For Real-Time Data Analytics
- Elasticsearchのたちあげをやるよ、というサービス
Action
をIAMで制限できるのはよさそうes:ESHttpGet
のみ許可、とか
- awslabs/logstash-output-amazon_es
- ESのメトリクスもCloudWatchでみることができる
- JVM Memory Pressureとか
- restoreとsnapshotの設定もできる