Ruby(Rails)からメールを送信する必要のある仕事があったので、本採用するかは決めていませんが、Amazon SESをaws-sdk-rubyから使う方法について調査してみました。

■ 準備

1. マネジメントコンソールでEmailアドレスとドメインを登録してください
(ドメインの登録の際は、DKIMの設定も出力すると便利です。Easy DKIMという機能なのですが、ドメインの認証が完了した後、マネジメントコンソールで有効化すると、送信メールにDKIM署名を追加してくれます。迷惑メール扱いになる確率がいくらか減るでしょう。)

※ Request Production Accessするまでは、送信元、送信先ともに登録が必要です。

2. aws-sdk-rubyをインストールする

gem install aws-sdk


■ 手順

単純なので一気に書きます。

# encoding: utf-8
require 'rubygems'
require 'aws-sdk'
require 'nkf'

ses = AWS::SimpleEmailService.new(
  :access_key_id => 'YOUR_ACCESS_KEY_ID',
  :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')

body_text = NKF.nkf '-jw', <<-EOS
こんにちは。
このメールはテストメールです。

おしまい
EOS

subject = NKF.nkf('-Mw', 'サブジェクトです')

from_email = "FROM_EMAIL_ADDRESS"
to_email = "TO_EMAIL_ADDRESS"

p "Verified?(FROM Email): " + ses.identities[from_email].verified?.to_s
p "Verified?(TO Email): " + ses.identities[to_email].verified?.to_s
p "Verified?(Domain): " + ses.identities['YOUR_DOMAIN'].verified?.to_s

ses.send_email(
  :subject => subject,
  :to => to_email,
  :from => from_email,
  :body_text => body_text,
  :body_text_charset => 'ISO-2022-JP'
)


■ 参考情報

RubyからAmazon SESでメールを送る - プログラマになりたい

詳しいです。ただし、Easy DKIMに関する記載が無い(この記事時点ではEasy DKIMがなかったのかも)ので、DKIM関係は独自署名の方法になっています。これはこれで押さえておいた方がいい情報ですが、Easy DKIMを使う方が楽ではあると思います。

AWS SDK for RubyのAPIリファレンス
AmazonSES-Easy DKIM設定サポート資料

Posted by あかさた
仕事でRubyでAmazon S3にアクセスする必要があったので、公式のgemであるaws-sdkを使ってみました。このgemはS3だけではなく、一通りのサービスにアクセスできるようなので、使いこなせばかなり有用かと思われます。

この記事では、S3へのファイルのアップロードを中心に以下の内容を扱っています。

・インストール
・基本設定
・ファイルのアップロード
・ファイルの暗号化
・アクセスコントロールの設定

■ インストール

gem install aws-sdk


■ 基本設定

アクセスキーを指定して、S3のインスタンスを生成します。

require 'aws-sdk'

AWS.config(
  :access_key_id => 'YOUR_ACCESS_KEY_ID',
  :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')

s3 = AWS::S3.new

# 以下も可
# s3 = AWS::S3.new(
#   :access_key_id => 'YOUR_ACCESS_KEY_ID',
#   :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')


■ ファイルのアップロード

ファイルをS3に格納します。

bucket = s3.buckets['yourbucketname']

filename = "fullpath/filename.ext"
basename = File.basename(filename)
o = bucket.objects[basename]
o.write(:file => filename)


■ ファイルの暗号化(クライアントサイド)

サーバーサイド(S3)でもできますが、とりあえずクライアントサイトでも簡単なので紹介します。

# キーの生成
my_key = OpenSSL::Cipher.new("AES-256-ECB").random_key

# オブジェクトの取得
o = bucket.objects[name]

# 暗号化して書込
o.write("MY TEXT", :encryption_key => my_key)

# 復号化して読込
puts o.read(:encryption_key => my_key)


公開鍵暗号を使いたいなら以下の通り。公開鍵で暗号化して、秘密鍵で復号化します。

# キーの生成
my_key = OpenSSL::PKey::RSA.new(1024)

# オブジェクトの取得
o = bucket.objects[name]

# 暗号化して書込
o.write("MY TEXT", :encryption_key => my_key)

# 復号化して読込
puts o.read(:encryption_key => my_key)


■ アクセスコントロールの設定

S3Objectクラスのacl=メソッドを使うと、アクセスコントロールを設定してS3上のオブジェクトに反映することができます。

o = bucket.objects[name]

# Canned ACL
o.acl = :public_read

# writeメソッドに渡すことも可能
o.write(:file => filename, :acl => :public_read)


以下、渡せるアクセスコントロールポリシーです。

  • :private
  • :public_read
  • :public_read_write
  • :authenticated_read
  • :bucket_owner_read
  • :bucket_owner_full_control

acl=には、AccessControlListを代入することもできます。changeメソッドを使ったやり方もあります。

o.acl.change do |acl|
  acl.grant(:full_control).to(:canonical_user_id => "...")
end


S3ObjectのchangeメソッドはS3Objectが返すAccessControlListのインスタンスが持つ特異メソッドなので、注意してください。ブロックの処理が完了すると、S3上のオブジェクトに反映します。(具体的にはS3Objectのacl=メソッドを呼び出します。)

ACLに関しては以下を参照してください。

acl=メソッド(AWS::S3::S3Object)
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#acl%3D-instance_method

AWS::S3::AccessControlList
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/AccessControlList.html

■ 参考情報

Getting Started with the AWS SDK for Ruby(AWS)
AWS SDK for RubyのAPIリファレンス
aws/aws-sdk-ruby(GitHub)
aws-sdkのファイルアップロードのサンプル
AWS SDK for RubyでS3の操作をする - プログラマになりたい(ファイルの取得関係が詳しい)

Posted by あかさた