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

Post on 26-Jul-2015

3.236 views 5 download

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

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

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