Upload
-
View
6.149
Download
1
Embed Size (px)
Citation preview
AWS re:Invent 2015に初参戦 →気づいたらOSS二つ作ってた@mumoshu
Yusuke KUOKA at CrowdWorks, Inc.
We’re hiring!https://www.wantedly.com/projects/34041
TL;DR;
• クラウドソーシングサービスを運営している
• 株式会社クラウドワークスのエンジニアが、
• AWS最大級のイベントre:Invent 2015@ラスベガスに会社のお金で参加させていただいて感動、
• 気づいたら2つのOSSを作ってた
• サーバレスSlackボット「lambda_bot」
• サーバレス分散ロックサービス「Joumae」
Fin.
------ここから------ 延長戦
アジェンダ
1. AWS re:Invent 2015のはなし
2. サーバレスSlackボットlambda_botのはなし
3. サーバレス分散ロックJoumaeのはなし
AWS re:Invent 2015のはなし1 / 3
re:Invent 2015こわくないよ
• 初参戦&クラウドワークスからぼっち参加
• 色々心配
• 旅行会社HISさんのre:Inventツアー利用
• 事前手続き・出国・滞在・帰国まで全てサポートしていただけるので初心者でも安心!
• まじおすすめ
re:Invent 2015すごいよ
• 開発者向けカンファレンス(印象)
• 数百人参加してそうなよくばりセッション
• AWS中の人のDeep Dive(技術的な深い話)、ユーザによる事例紹介、AWS
利用するサービス・フレームワーク紹介、etc. なんでもある
• 10000人くらい参加してそうなキーノート
• 新サービス・新機能を大々的に発表→エンジニア盛り上がる
• ライブ会場ですか?
re:Invent 2015体験記• 食料確保
• 広大な会場、人の波をかき分けながら右往左往
• セッション、ブースめぐり
• ネットワーキング
• 受講料無料のハンズオンラボでAWSコンソールいじりながら試験勉強
→現地で試験受けてSolution Architect Asociate認定取得→認定者限定パーティで交流
• 知り合いいなくてコミュ力なくても安心
• レポート「初めてのAWS re:Invent 2015参戦を写真で振り返る」
アウトプット
• ブログ記事数本
• OSS
• lambda_bot
• Joumae
lambda_bot のはなし2 / 3
lambda_botとは
• AWS Lambdaを利用したサーバレスのSlackボット
• re:Invent 2015期間中にLambdaのScheduled
Eventという機能が発表されて「キタ━━━━(゚∀゚)━━━━!!」となってつくった
• …を簡単に実装するためのnpmモジュール
LambdaのScheduled Event
• 分散cron的なものという認識
• 指定日時または周期でLambda FunctionをInvoke
• 他の選択肢
• EC2インスタンスにcrond立てる or Mesos上にChronos立てる or Unreliable
Town ClockというAWS SNSトピックにsubscribeさせる or etc.
→最終的にLambda Function実行
• あせ?せっかくLambdaでサーバレスにしようと持ったのにサーバいるやん
• →運用めんどい
サーバレスがいい
• インフラ運用めんどい
• ベンチャーなう
• コア業務はサービス開発・運営
• →ベンチャーにインフラの運用してる時間ない
• 理想
• 運用は限りなくゼロにしてサービス開発したい!
• Slack Outgoing WebHook↓API Gateway Scheduled Event↓ ↓Lambda Function↓Slack Incoming WebHook
設計
• Slackボットとして振る舞うLambda Function
Handler(Lambdaが呼び出すNode.jsの関数)
• …を簡単に実装するためのライブラリ
実装
コード例var LambdaBot = require('lambda_bot'), env = require('node-env-file');
env(__dirname + ‘/.env'); // .envファイルから環境変数読むよ
var bot = new LambdaBot({ iconEmoji: process.env['SLACK_ICON_EMOJI'], userName: process.env['SLACK_USER_NAME'], channelName: process.env['SLACK_CHANNEL_NAME'], slackIncomingWebhookURL: process.env['SLACK_INCOMING_WEBHOOK_URL']});
bot.hear(/foo/, function(res) { return res.send(‘bar'); // 誰かがfooと言ったらbarと言うよ});
bot.respond(/hi/, function(res) { return res.reply(‘hi'); // 誰かがfooと話しかけてきたら、hiと返すよ});
bot.on('10am', function(res) { return res.send("It's 10am.”); // 毎日午前10時に「It’s 10am.」と言うよ});
exports.handler = bot.createHandler();
詳しくはQiitaで!http://qiita.com/mumoshu/items/8752047a0d0265dada47
Joumae のはなし3 / 3
Joumaeとは
• AWS Lambdaを利用したサーバレスの分散ロックサービス
• アプリとインフラそれぞれのBlue-Greenデプロイのクラスタワイドなロックが欲しかった
• re:InventでもセッションがあったJAWSフレームワークつかえそう
• …を簡単に実装するためのJAWSの”AWSモジュール”(npmモジュール)
クラウドワークスのデプロイ
• アプリの更新はHubot、Rake、Capistrano、AWS SDK for Rubyなどを利用して
• インフラの更新はChefやaws-cliやCapistrano、CodeDeployなどを利用して
• それぞれBlue-Greenデプロイ
課題
• アプリのデプロイ中に、Chef CookbookをChef
Serverに上げて、各サーバでChef Clientを実行してインフラの更新を初めてしまったり、
• アプリのデプロイ中に、EC2インスタンスの停止・起動してしまったり
• >突然の死<
Before Joumae
• Slack等で人間が「アプリのデプロイしますので、インフラのデプロイ(の引き金になるChef CookbookのGitHubレポジトリへぷるりマージ)はしばらくしないでください」のように調整をする…
• めんどくさ
Afer Joumae
• hubotが実行するアプリのデプロイスクリプトで$ joumae run --resource-name $APP-$ENV -- bundle exec cap $ENV deploy
• Werckerで動いているインフラのデプロイスクリプトで$ joumae run --resource-name $APP-$ENV -- scripts/mumo.sh deploy $APP-$ENV
• クラスタを排他的ロック
• 一方が終わる前に一方を実行→エラー→Happy!(^ω^)
そろそろ時間がなくなるはずhttp://qiita.com/mumoshu/items/3cbe31b315be31f510d0
謝辞
• いつもワクワクするサービスを提供してくれるAWSさん
• re:Inventの参戦費用を快く出していただいた株式会社クラウドワークスの皆さま
• 留守の間プロジェクトを進めてくれたチームの皆さまありがとうございましたm(_ _)m
ありがとう!