Transcript
Page 1: Rubyで操るAWS 第67回Ruby関西 勉強会

Rubyで操るAWS

NRIネットコム株式会社  佐々木拓郎

2015/6/13Ruby関西 勉強会

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

佐々木拓郎

AWSの事業推進の他に モバイルチームとデータ解析チームのマネジメントをしています

blog: http://blog.takuros.net twitter: @dkfj

自己紹介

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

ちょっと宣伝

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

http://amzn.to/1lsJ5id

ジュンク堂書店 コンピュータ書年間 総合ランキング14位

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

もう1つ宣伝

Amazon Web Services パターン別構築・運用ガイド 一番大切な知識と技術が身につく

http://amzn.to/1BLiYcO

2015年3月25日より絶賛発売中!!

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

NRIネットコム

Web周りのビジネスを専門としている会社

• Webシステムの企画・設計・開発・運用 • 24時間365日の運用体制 • デザインを重視し、ディレクター/デザイナーが多数在籍 • スマホ/タブレットも得意 • AWSをはじめとするクラウドにも力を入れている • Rubyも結構使ってる

会社の紹介

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

Rubyで操るAWS

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

アンケート

アプリケーションエンジニアとしての経験ある人? インフラエンジニアとしての経験ある人? AWSを使ったことがある人? EC2,S3以外のサービスを使ったことがある人?

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

今日の主題

クラウドは インフラエンジニアの

為のもの?

⇒違います!!

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

AWSのサービス(の一部) 今注目は、アプリケーションサービスを利用したアーキテクチャ

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

クラウドファーストから クラウドネイティブへ

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

クラウドファースト

 クラウドファーストとは、企業が情報システムの設計や移行に際してクラウドサービスの採用を第一に検討する方針のこと。特に、システムの運用基盤として外部企業が運営する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

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

クラウドネイティブ

 クラウドネイティブとは、クラウドのサービスを前提に構築されたシステムおよびアプリケーション。仮想サーバ上で自前でシステムを構築していくのではなく、SaaSを最大限活用し拡張性・可用性のあるシステムを低コストで構築する。

世間一般の話を佐々木が勝手にまとめたもの

2-Tierアーキテクチャな設計が クラウドネイティブになりやすい

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

3-Tierアーキテクチャ

リクエスト 操作

Web/APサーバ (ec2)

ストレージ (S3)

NoSQL (DynamoDB)

データベース (RDS)

レスポンスモバイル

負荷が 集中する

処理結果を、Web側で変換する必要がある

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

2-Tierアーキテクチャ

直接操作 ストレージ (S3)

NoSQL (DynamoDB)

モバイル

認証管理 (Cognito)

Credential 取得

キューサービス (SQS)

計算処理 (Lambda)

リソース状況や、障害対応は全てAWS側で実施

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

とあるサービス

http://www.nri-net.com/mobileconf/ https://www.youtube.com/watch?v=7Rk2pL3PAXc

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

データ・処理の流れ

Webサーバ データベース

会議システム

参照ページの通知初回ダウンロード 参照ページの同期

処理を簡略化すると、次のような流れになっている

サーバ側のお守りは、それなりに手間が掛かる

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

AWSのサービスだけ利用して構築

IAM Role

DynamoDB (NoSQL DBサービス)

Cognito (認証・権限管理サービス)

S3 (ストレージサービス)

JavaScript SDK

DynamoDBのスループットの設定で、 システムのキャパシティを向上できる

サーバレスで楽ちん

資料のダウンロード

参照ページの通知・同期

AWS利用権限の付与

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

RubyでAWS

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

Rubyで始めるAWS

この2点だけ抑えておけば、とりあえず使えます

SDKの種類 SDKからAWSの認証の仕組み

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

SDKiOS

Android iOS

JavanodeJS

.Net

PHP

PythonRuby

Ruby

PowerShell CLI

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

RubyのSDKV1(レガシーバージョン) レガシーバージョンになったので、非推奨 混在環境で利用する場合は、 require ‘aws-sdk-v1’ 名前空間は、”AWS” V2(現行バージョン) 2015年2月に安定版としてリリース aws-sdk-coreとaws-sdk-resoucesで構成される 通常の呼び出しは、require ‘aws-sdk’ 名前空間は、”Aws”

意識せずに検索するとV1の情報が上位に出てくるので注意 AWS::EC2などAWS部分が大文字・小文字でサクッと判別

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

認証まわり

AWSのリソース利用には、認証と認可が必要 主な利用方法としては、次の3種類 今回は認証の方法を紹介。認可については、IAMを調べて

AccessKeyとSecretAccessKey IAM Role Cognito

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

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'), })

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

IAMロール

IAM Role

IAM (権限管理サービス)

サーバに権限付与

EC2 (仮想サーバ)サーバ内のプログラムは、

アクセスキー不要で 付与された権限を利用できる

AWSの仮想サーバ内で利用する場合は、 IAM Roleの利用推奨

アクセスキー不要で、AWSのリソースが利用可能に

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

CognitoモバイルやJavaScriptで利用される事が多い 権限付与とデータ同期のサービス(Rubyでも使えます)

モバイル

Cognito

トークン 付与

Identity Providers (Facebook,Google,Amazon,etc)

認証

認証結果

IAM Role

認証時の権限未認証時の権限 (ゲスト権限)

リソースの利用AWSのリソース

Cognitoの役割

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

おまけ Lambda

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

Lambda

サーバレスでプログラムを実行できるエンジン 現在は、Node.JSのみ利用可能 フルマネージドサービス 実体は恐らくAamzon LinuxベースのDocker とにかく手軽で楽しい

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

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を呼び出せる

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

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); }); };

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

Lambda内でRubyを使うなければアップロード Rubyのバイナリを用意 EC2インスタンスを用意(AmazonLinuxAMI) Rubyを静的ビルド

Zipで固めてアップロード

実行

./configure --disable-shared --enable-static

zip -r exec-ruby.zip index.js ruby test.rb

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

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>'

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

ご静聴、ありがとうございました。


Recommended