Rubyで操るAWS
NRIネットコム株式会社 佐々木拓郎
2015/6/13Ruby関西 勉強会
✕
佐々木拓郎
AWSの事業推進の他に モバイルチームとデータ解析チームのマネジメントをしています
blog: http://blog.takuros.net twitter: @dkfj
自己紹介
ちょっと宣伝
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
http://amzn.to/1lsJ5id
ジュンク堂書店 コンピュータ書年間 総合ランキング14位
もう1つ宣伝
Amazon Web Services パターン別構築・運用ガイド 一番大切な知識と技術が身につく
http://amzn.to/1BLiYcO
2015年3月25日より絶賛発売中!!
NRIネットコム
Web周りのビジネスを専門としている会社
• Webシステムの企画・設計・開発・運用 • 24時間365日の運用体制 • デザインを重視し、ディレクター/デザイナーが多数在籍 • スマホ/タブレットも得意 • AWSをはじめとするクラウドにも力を入れている • Rubyも結構使ってる
会社の紹介
Rubyで操るAWS
✕
アンケート
アプリケーションエンジニアとしての経験ある人? インフラエンジニアとしての経験ある人? AWSを使ったことがある人? EC2,S3以外のサービスを使ったことがある人?
今日の主題
クラウドは インフラエンジニアの
為のもの?
⇒違います!!
AWSのサービス(の一部) 今注目は、アプリケーションサービスを利用したアーキテクチャ
クラウドファーストから クラウドネイティブへ
クラウドファースト
クラウドファーストとは、企業が情報システムの設計や移行に際してクラウドサービスの採用を第一に検討する方針のこと。特に、システムの運用基盤として外部企業が運営する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
クラウドネイティブ
クラウドネイティブとは、クラウドのサービスを前提に構築されたシステムおよびアプリケーション。仮想サーバ上で自前でシステムを構築していくのではなく、SaaSを最大限活用し拡張性・可用性のあるシステムを低コストで構築する。
世間一般の話を佐々木が勝手にまとめたもの
2-Tierアーキテクチャな設計が クラウドネイティブになりやすい
3-Tierアーキテクチャ
リクエスト 操作
Web/APサーバ (ec2)
ストレージ (S3)
NoSQL (DynamoDB)
データベース (RDS)
レスポンスモバイル
負荷が 集中する
処理結果を、Web側で変換する必要がある
2-Tierアーキテクチャ
直接操作 ストレージ (S3)
NoSQL (DynamoDB)
モバイル
認証管理 (Cognito)
Credential 取得
キューサービス (SQS)
計算処理 (Lambda)
リソース状況や、障害対応は全てAWS側で実施
とあるサービス
http://www.nri-net.com/mobileconf/ https://www.youtube.com/watch?v=7Rk2pL3PAXc
データ・処理の流れ
Webサーバ データベース
会議システム
参照ページの通知初回ダウンロード 参照ページの同期
処理を簡略化すると、次のような流れになっている
サーバ側のお守りは、それなりに手間が掛かる
AWSのサービスだけ利用して構築
IAM Role
DynamoDB (NoSQL DBサービス)
Cognito (認証・権限管理サービス)
S3 (ストレージサービス)
JavaScript SDK
DynamoDBのスループットの設定で、 システムのキャパシティを向上できる
サーバレスで楽ちん
資料のダウンロード
参照ページの通知・同期
AWS利用権限の付与
RubyでAWS
Rubyで始めるAWS
この2点だけ抑えておけば、とりあえず使えます
SDKの種類 SDKからAWSの認証の仕組み
SDKiOS
Android iOS
JavanodeJS
.Net
PHP
PythonRuby
Ruby
PowerShell CLI
RubyのSDKV1(レガシーバージョン) レガシーバージョンになったので、非推奨 混在環境で利用する場合は、 require ‘aws-sdk-v1’ 名前空間は、”AWS” V2(現行バージョン) 2015年2月に安定版としてリリース aws-sdk-coreとaws-sdk-resoucesで構成される 通常の呼び出しは、require ‘aws-sdk’ 名前空間は、”Aws”
意識せずに検索するとV1の情報が上位に出てくるので注意 AWS::EC2などAWS部分が大文字・小文字でサクッと判別
認証まわり
AWSのリソース利用には、認証と認可が必要 主な利用方法としては、次の3種類 今回は認証の方法を紹介。認可については、IAMを調べて
AccessKeyとSecretAccessKey IAM Role Cognito
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'), })
IAMロール
IAM Role
IAM (権限管理サービス)
サーバに権限付与
EC2 (仮想サーバ)サーバ内のプログラムは、
アクセスキー不要で 付与された権限を利用できる
AWSの仮想サーバ内で利用する場合は、 IAM Roleの利用推奨
アクセスキー不要で、AWSのリソースが利用可能に
CognitoモバイルやJavaScriptで利用される事が多い 権限付与とデータ同期のサービス(Rubyでも使えます)
モバイル
Cognito
トークン 付与
Identity Providers (Facebook,Google,Amazon,etc)
認証
認証結果
IAM Role
認証時の権限未認証時の権限 (ゲスト権限)
リソースの利用AWSのリソース
Cognitoの役割
おまけ Lambda
Lambda
サーバレスでプログラムを実行できるエンジン 現在は、Node.JSのみ利用可能 フルマネージドサービス 実体は恐らくAamzon LinuxベースのDocker とにかく手軽で楽しい
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を呼び出せる
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); }); };
Lambda内でRubyを使うなければアップロード Rubyのバイナリを用意 EC2インスタンスを用意(AmazonLinuxAMI) Rubyを静的ビルド
Zipで固めてアップロード
実行
./configure --disable-shared --enable-static
zip -r exec-ruby.zip index.js ruby test.rb
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>'
ご静聴、ありがとうございました。