Codable Tech Blog

iPhoneアプリケーション開発と AWS(Amazon Web Service)活用に関する記事を配信

S3とGlacierの連携

ユースケース

重要度が低くほとんど参照されることのないファイル(ex.1年前のログファイルとか)をS3に保存していてはコストがもったいないのでGlacierに移動することでコスト削減を図る。また、手動での移動は管理工数を増やすのでS3のライフサイクルを利用して運用を自動化する。

事前準備

  1. S3上にバケットを作成する
  2. 適当なオブジェクトをバケットにアップロードする

ライフサイクルの設定

バケットを選択し管理タブを開き、ライフサイクル > ライフサイクルルールの追加を選択
ルール名とフィルターを入力する

ルール名:任意
フィルター:空白
フィルターはライフサイクルを適用する範囲。なにも入力しなければバケット全体にライフサイクルが適用される。フィルターに「test/」と指定するとtest/a.txtやtest/b.txtのようにtest/以降オブジェクトだけにライフサイクルが適用される。

次に移行の設定を行う
まず、現行バージョンにチェックをつける(※)

(※)
バージョニング機能を有効にしていれば現行バージョンと以前のバージョンでそれぞれライフサイクルを設定することが可能。
バージョニング機能を利用することで以前のバージョンだけGlacierに保管するように設定できる。

次に移行を追加するをクリックし、「Amazon Glacierへの移行期限」を選択し、オブジェクトの作成からの日数に「1」を指定。(これでオブジェクト作成から1日後にAmazon Glacierへ移行する)
設定の失効はオブジェクトの削除に対する設定を行う。今回はなにも指定せずに次に進む。
設定が完了したらライフサイクルルールを保存する。

***動作確認

1日後にライフサイクルを指定したバケットにアクセスする。
ストレージクラスが「Glacier」変更されていたらOK!

コンソールアプリケーション(C#)からSES(Simple Email Service)を利用してメールを送信

SESを利用してコンソールアプリケーションでメール送信を行う方法を記載します。実際に試すにはSESをセットアップする必要があります。まだSESのセットアップができていないかたは以下を参考にSESのセットアップを行ってください。(テストメール送信まで出来ればひとまずOK)
AWSコンソールからSES(Simple Email Service)を利用したメール送信 - Codable Tech Blog

Amazon SES SMTP 認証情報の取得

コンソールアプリケーションからSESを使用してメール送信するにあたり、Amazon SES SMTP のユーザー名とパスワードが必要です。以下ではAmazon SES コンソールを使用してAmazon SES SMTP のユーザー名とパスワードを取得します。この情報をあとでプログラム中で利用します。

  1. Amazon SES コンソールへアクセス
  2. SMTP Settings > Create My SMTP Credentials をクリック
  3. 任意のIAM ユーザー名を設定して作成をクリック
  4. 認証情報のダウンロードをクリックして認証情報を保存する

コンソールアプリケーションの作成

MailKitライブラリの追加

まずはVisual Studioを起動し、MailKitライブラリを追加。このライブラリをメール送信を行うために必要となる。

  • ツール > NuGetパッケージマネージャー > ソリューションのNuGetパッケージの管理
  • MailKitを選択 > プロジェクトを選択 > インストールを選択
メール送信コードの記述

以下のコードを記述します。なお「xxxx」の箇所は書き換えが必要です。

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //非同期処理の実行
            Task task = Task.Factory.StartNew(async () =>
            {
                await SendEmailAsync("xxxx(送信元メールアドレスを指定する)","xxxx(受信メールアドレスを指定する)", "xxxx(タイトルを指定する)", "xxxx(メッセージを指定する)");
                Console.WriteLine();

            }).Unwrap();

            task.Wait();

            Console.WriteLine("読み込み完了!");
        }

        static public async Task SendEmailAsync(string from, string to,string subject, string message)
        {
            // Amazon SES SMTPユーザー名を指定
            const String SMTP_USERNAME = "xxxx";
            // Amazon SES SMTPユーザーのパスワードを指定
            const String SMTP_PASSWORD = "xxxx";

            // メールのオブジェクトを作成する
            var emailMessage = new MimeMessage();
            // メール送信元の名前とメールアドレスを指定する
            emailMessage.From.Add(new MailboxAddress("xxxx(送信者名)", from));
            // メール送信先を指定する
            emailMessage.To.Add(new MailboxAddress("xxxx(受信者名)", to));
            // メールの件名を設定する
            emailMessage.Subject = subject;
            // メールの本文を指定する(テキストメッセージ)
            emailMessage.Body = new TextPart("plain") { Text = message };
            using (var client = new SmtpClient())
            {
                //SMTPサーバに接続する。SMTPサーバーの指定はリージョンごとに異なるのでSESのリージョンに合わせたエンドポイント名を指定
                //リージョン名 | エンドポイント名
                //米国東部(バージニア北部) | email-smtp.us-east-1.amazonaws.com
                //米国西部 (オレゴン) | email-smtp.us-west-2.amazonaws.com
                //欧州 (アイルランド) | email-smtp.eu-west-1.amazonaws.com
                await client.ConnectAsync("xxxx(SESのエンドポイントを指定)", 587, SecureSocketOptions.StartTls);
                // SMTPサーバで認証する(IDとパスワード)
                await client.AuthenticateAsync(SMTP_USERNAME, SMTP_PASSWORD);
                // メールを送信する
                await client.SendAsync(emailMessage);
                // SMTPサーバとの接続を切る
                await client.DisconnectAsync(true);
            }
        }
    }
}
|cs|<

**動作確認