Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rubyで操るAWS 第67回Ruby関西 勉強会

11,551 views

Published on

第67回Ruby関西の勉強会です。
RubyからAWSを使おうということでSDKの紹介や、2Tier-Architectureなどの紹介をしています。

Published in: Technology
  • Be the first to comment

Rubyで操るAWS 第67回Ruby関西 勉強会

  1. 1. Rubyで操るAWS NRIネットコム株式会社  佐々木拓郎 2015/6/13Ruby関西 勉強会 ✕
  2. 2. 佐々木拓郎 AWSの事業推進の他に モバイルチームとデータ解析チー ムのマネジメントをしています blog: http://blog.takuros.net twitter: @dkfj 自己紹介
  3. 3. ちょっと宣伝 Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例 http://amzn.to/1lsJ5id ジュンク堂書店 コンピュータ書年間 総合ランキング14位
  4. 4. もう1つ宣伝 Amazon Web Services パターン別構築・運用ガイド 一番大切な知識と技術が身につく http://amzn.to/1BLiYcO 2015年3月25日より絶賛発売中!!
  5. 5. NRIネットコム Web周りのビジネスを専門としている会社 • Webシステムの企画・設計・開発・運用 • 24時間365日の運用体制 • デザインを重視し、ディレクター/デザイナーが多数在籍 • スマホ/タブレットも得意 • AWSをはじめとするクラウドにも力を入れている • Rubyも結構使ってる 会社の紹介
  6. 6. Rubyで操るAWS ✕
  7. 7. アンケート アプリケーションエンジニアとしての経験ある人? インフラエンジニアとしての経験ある人? AWSを使ったことがある人? EC2,S3以外のサービスを使ったことがある人?
  8. 8. 今日の主題 クラウドは インフラエンジニアの 為のもの? 違います!!
  9. 9. AWSのサービス(の一部) 今注目は、アプリケーションサー ビスを利用したアーキテクチャ
  10. 10. クラウドファーストから クラウドネイティブへ
  11. 11. クラウドファースト  クラウドファーストとは、企業が情報システムの設計や移行に 際してクラウドサービスの採用を第一に検討する方針のこと。特 に、システムの運用基盤として外部企業が運営するIaaS/PaaS サービスを採用し、その上に独自のアプリケーションを構築し運 用するシステム形態を優先的に検討すること。 IT用語辞典 e-Wordsより http://e-words.jp/w/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88.html
  12. 12. クラウドネイティブ  クラウドネイティブとは、クラウドのサービスを前提に構築さ れたシステムおよびアプリケーション。仮想サーバ上で自前でシ ステムを構築していくのではなく、SaaSを最大限活用し拡張性・ 可用性のあるシステムを低コストで構築する。 世間一般の話を佐々木が勝手にまとめたもの 2-Tierアーキテクチャな設計が クラウドネイティブになりやすい
  13. 13. 3-Tierアーキテクチャ リクエスト 操作 Web/APサーバ (ec2) ストレージ (S3) NoSQL (DynamoDB) データベース (RDS) レスポンス モバイル 負荷が 集中する 処理結果を、 Web側で変換する必要がある
  14. 14. 2-Tierアーキテクチャ 直接操作 ストレージ (S3) NoSQL (DynamoDB) モバイル 認証管理 (Cognito) Credential 取得 キューサービス (SQS) 計算処理 (Lambda) リソース状況や、 障害対応は全てAWS側で実施
  15. 15. とあるサービス http://www.nri-net.com/mobileconf/ https://www.youtube.com/watch?v=7Rk2pL3PAXc
  16. 16. データ・処理の流れ Webサーバ データベース 会議システム 参照ページの通知 初回ダウンロード 参照ページの同期 処理を簡略化すると、次のような流れになっている サーバ側のお守りは、それなりに手間が掛かる
  17. 17. AWSのサービスだけ利用して構築 IAM Role DynamoDB (NoSQL DBサービス) Cognito (認証・権限管理サービス) S3 (ストレージサービス) JavaScript SDK DynamoDBのスループットの設定で、 システムのキャパシティを向上できる サーバレスで楽ちん 資料のダウンロード 参照ページの通知・同期 AWS利用権限の付与
  18. 18. RubyでAWS
  19. 19. Rubyで始めるAWS この2点だけ抑えておけば、とりあえず使えます SDKの種類 SDKからAWSの認証の仕組み
  20. 20. SDK iOS Android iOS JavanodeJS .Net PHP Python Ruby Ruby PowerShell CLI
  21. 21. RubyのSDK V1(レガシーバージョン) レガシーバージョンになったので、非推奨 混在環境で利用する場合は、 require aws-sdk-v1 名前空間は、 AWS V2(現行バージョン) 2015年2月に安定版としてリリース aws-sdk-coreとaws-sdk-resoucesで構成される 通常の呼び出しは、require aws-sdk 名前空間は、 Aws 意識せずに検索するとV1の情報が上位に出てくるので注意 AWS::EC2などAWS部分が大文字・小文字でサクッと判別
  22. 22. 認証まわり AWSのリソース利用には、認証と認可が必要 主な利用方法としては、次の3種類 今回は認証の方法を紹介。認可については、IAMを調べて AccessKeyとSecretAccessKey IAM Role Cognito
  23. 23. AccessKeyとSecretAccessKeyによる認証 参照される認証情報の優先順位 プログラムで指定した認証情報 環境変数 ENV['AWS_ACCESS_KEY_ID'] ENV['AWS_SECRET_ACCESS_KEY'] 環境設定ファイル /.aws/credentials インスタンスプロファイ [default] aws_access_key_id = ABCDEFGHIJKLMNOPQRST aws_secret_access_key = abcdefghijklmnopqrstuvwxyz1234567890abcd 優先順位は、上から順番 Aws.config.update({ region: 'us-west-2', credentials: Aws::Credentials.new('akid', 'secret'), })
  24. 24. IAMロール IAM Role IAM (権限管理サービス) サーバに権限付与 EC2 (仮想サーバ) サーバ内のプログラムは、 アクセスキー不要で 付与された権限を利用できる AWSの仮想サーバ内で利用する場合は、 IAM Roleの利用推奨 アクセスキー不要で、AWSのリソースが利用可能に
  25. 25. Cognito モバイルやJavaScriptで利用される事が多い 権限付与とデータ同期のサービス(Rubyでも使えます) モバイル Cognito トークン 付与 Identity Providers (Facebook,Google,Amazon,etc) 認証 認証結果 IAM Role 認証時の権限 未認証時の権限 (ゲスト権限) リソースの利用 AWSのリソース Cognitoの役割
  26. 26. おまけ Lambda
  27. 27. Lambda サーバレスでプログラムを実行できるエンジン 現在は、Node.JSのみ利用可能 フルマネージドサービス 実体は恐らくAamzon LinuxベースのDocker とにかく手軽で楽しい
  28. 28. RubyからLambdaを使う AWS LambdaをRubyから使ってみる http://qiita.com/Keisuke69/items/40bab85fa2a6ba5b257f Aws.config[:region] = "us-east-1" lambda = Aws::Lambda::Client.new begin param = { key1: "from ruby"}.to_json #=>functionに渡すパラメータをJSON形式で作成 resp = lambda.invoke_async(function_name: "HttpTest", invoke_args: param) if resp[:status] == 202 puts "success" end rescue Aws::Lambda::Errors::ServiceError => e p e.message end あまり実用性はないが、RubyからLambdaを呼び出せる
  29. 29. Lambda内でRubyを使う Node.jsからOSコマンド叩けば何でも出来るはず OSコマンドを叩く require( child_process ).exec 残念ながら、Rubyのバイナリはない console.log('Loading function'); var exec = require('child_process').exec, child; exports.handler = function(event, context) { exec(‘which ruby', function (error, stdout, stderr) { console.log('stderr:', stderr); console.log('stdout: ' + stdout); context.done(null, stdout); }); };
  30. 30. Lambda内でRubyを使う なければアップロード Rubyのバイナリを用意 EC2インスタンスを用意(AmazonLinuxAMI) Rubyを静的ビルド Zipで固めてアップロード 実行 ./configure --disable-shared --enable-static zip -r exec-ruby.zip index.js ruby test.rb
  31. 31. Lambda内でRubyを使う 道半ばです。 依存関係含めたバイナリモジュール用意すれば たぶん大丈夫。 ※Lambdaのアップロードサイズ上限に注意 START RequestId: be73209f-112b-11e5-9756-91ae3fff4733 2015-06-12T17:52:09.862Z be73209f-112b-11e5-9756-91ae3fff4733 stderr: <internal:gem_prelude>:1:in `require': cannot load such file -- rubygems.rb (LoadError) from <internal:gem_prelude>:1:in `<compiled>'
  32. 32. ご静聴、ありがとうございました。

×