AWSのセキュリティ対策関連サービス

AWS Configとは

AWS Configは、リソースごとの設定項目を生成し、履歴としてこれを保持するため、全ての変更を追跡することが可能で、AWSリソース間の関係と設定の履歴などを確認することができる。また、設定が最適であるかの評価設定のスナップショットの取得設定変更時の通知IAMポリシーの確認などを行うことが可能である。

設定項目は、S3バケットに蓄積することが可能で、データはJSON形式でS3に6時間ごとに送信される。また、リソースが変更されたタイミング等で、Amazon SNSを用いてEメール等で通知することも可能である。

AWS Configルール

AWS Configルールは、各リソースの望ましい設定を確認することが可能で、事前に定義済みのルールが用意されている。また、各ユーザがカスタムルールを作成することも可能となっている。AWS Configは、このルールを参照して、現在の設定を評価する。

マネージドインスタンスの記録

AWS Configを用いて、EC2やオンプレミスサーバのソフトウェアインベントリの変更を記録可能である。

課金

記録される設定項目ごとに 0.003 USDの課金が発生し、これに加えてS3やSNSを使用する場合には、これらのサービスの使用料金が課金される。

AWS Cloudtrailとは

AWSサービスによって実行されたアクションを記録するサービス。この記録を基にAWS アカウントのアクティビティの分析を行い、これらに対応することが可能である。デフォルトで有効にされており、90日間のログが履歴として保持される。また、それ以上保持したい場合には、トレイル機能を用いて、S3やCloudWatch Logs等にイベント配信することも可能である。トレイルは、全リージョンに対して、もしくは特定のリージョンの情報のみを保持することが可能で、作成後に設定内容を変更することもできる。デフォルトではS3の暗号化機能を用いて暗号化され、アクションの15分以内にデータが送信される。

Cloudtrailイベントとトレイル

Cloudtrailイベントには、管理イベントとデータイベントの2種類が存在するが、トレイルにはデフォルトでは管理イベントのみが記録される

課金

デフォルトでは無料で90日間のログを保持しており、これに加えて1つのトレイル作成までは無料となっている。S3やSNSを使用する場合には、これらのサービスの使用料金が課金される。

AWS Identity and Access Management(2)ルートアカウントとIAMユーザ

アカウント設定と請求情報

ルートアカウントは極力使用しないことが望ましいため、AWSのリソースにアクセスする際には、AWS Identity and Access Managementで作成したIAMユーザを使用する。各IAMユーザには、ポリシーと呼ばれる各リソースへのアクセス権限が付与可能で、アカウント管理者向けには、ルートアカウント並みの権限を持つAdministratorAccessと呼ばれるポリシーが用意されている。

権限 ルートアカウント IAMユーザ (AdministratorAccess) IAMユーザ (BillingFullAccess) IAMユーザ (Billing)
ルートアカウントの設定情報の変更 × × ×
サポートプランの変更 × × ×
アカウントの解約 × × ×
CloudFront のキーペアの作成 × × ×
リソースベースポリシーの見直し × × ×
AWSサービス全般へのアクセス許可 × ×
AWSアカウント設定(支払い方法等)の参照 △ (※) △ (※) ×
AWSアカウント設定(支払い方法等)の変更 △ (※) △ (※) ×
請求情報の参照 △ (※) △ (※) △ (※)
  • (※) ルートアカウントから明示的に、[AWS 請求およびコスト管理コンソールへのIAMユーザーアクセスをアクティベート]](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_billing.html)した場合のみアクセスすることが可能。

BillingFullAccessというポリシーは事前に用意されていないため、各IAMユーザごとに以下のようなカスタムポリシーを付与する必要がある。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StmtXXXXXXXXXXXXXXXX",
            "Effect": "Allow",
            "Action": [
                "aws-portal:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

参考情報

AWS EC2(6)Elastic Load Balancing

ELBとは

ELBとは複数のアベイラビリティゾーンのEC2インスタンスに負荷を分散させるロードバランサである。ELBには、Classic Load BalancerApplication Load Balancerの2種類が存在し、Clasic Load Balancerは、HTTPとHTTPSの他に、TCPSSLにも対応している。一方でApplication Load Balancerは、HTTP/2やWebSocketに対応している。

ロードバランサは、登録されているEC2のうち正常なものだけを選んで負荷を分散する。Clasic Load Balancerは、EC2のインスタンスを直接登録するが、Application Load Balancerは、ターゲットグループをまず生成し、その中にインスタンスを登録する形となる。クロスゾーン負荷分散を無効にしていると、インスタンスがどのようなバランスで配置されていたとしても、アベイラビリティゾーンの数で均等に配分されてしまうので注意が必要である。なお、Application Load Balancerでは、クロスゾーン負荷分散はデフォルトで有効になっている。

ロードバランサに紐付けられているドメイン名に紐づけられたIPアドレスは、負荷に合わせて動的に変化する。DNSエントリは、TTLが60秒に設定されている。また、Application Load Balancerはリクエストタイムアウト値が60秒に設定されている。内側のインスタンスとの通信では、EC2にKeep Aliveを設定しておくことが望ましい。

Application Load Balancer とは

Application Load Balancerは、OSI参照モデルのレイヤー7で動作するロードバランサで、負荷に合わせて自動的にスケールする。ロードバランサには複数のリスナーを紐づけることができ、この下にターゲットグループがぶら下がる。EC2でクライアントの送信先アドレスを取得するためには、x-forwarded-forヘッダフィールドを参照する。またALBが負荷に追従できずスケーリングが間に合わなかった場合は、503を返す。

ELB基本コンポーネント

AWS EC2(5)ユーザデータによる起動時のコマンドの実行

cloud-init

EC2が起動する際に、cloud-initを使って任意のスクリプトを実行させることが可能である。実行する際に渡すことのできるデータ(ユーザデータ)は、プレーンテキスト・ファイル・Base64エンコードされたテキストで、通常は初回起動時のみ実行されるため、再起動時などは実行されない。スクリプトは、シェルスクリプト形式もしくはcloud-initディレクティブ形式で記述することが可能である。なお、スクリプトは、インタラクティブに動作させることはできないことに注意が必要である。また、このスクリプトは、rootユーザとして実行される。

シェルスクリプトによる実行

シェルスクリプトを実行させるためには、通常のシェルスクリプト同様にインタプリタのパスを最初に記述する必要がある。

#!/bin/bash

その他の処理も、通常のシェルスクリプトと同様に記述することができる。

ユーザデータの登録

ユーザデータの登録は、AWSマネージメントコンソール上、もしくはAWS CLIから行うことが可能である。

AWSマネージメントコンソールから登録

AWSマネージドコンソールで行う場合は、インスタンス作成画面の中で、ユーザデータを登録できる。

ユーザデータの登録

また、登録したユーザデータは、「インスタンスの設定」より確認することが可能である。

ユーザデータの確認

実行中のインスタンスから値を取得することも可能である。

curl http://169.254.169.254/latest/user-data

AWS CLIから登録

AWS CLIからEC2を起動する際に、user-dataオプションを付与することで、ユーザデータを指定することができる。指定するファイルは、シェルスクリプトが記述された通常のテキストファイルでよい。

aws ec2 run-instances --cli-input-json file:///tmp/ec2_settings.json --user-data file:///tmp/cloud-init_userdata.txt

AWS EC2(4)AWS CLIからEC2インスタンスを起動する

JSONファイルから起動する

EC2をAWS CLIから起動する際、JSONファイルに設定情報を記述しておくと、複雑なオプションコマンドを書き連ねる必要がなく、設定の管理もラクである。JSON形式の設定ファイルの雛形は、

aws ec2 run-instances --generate-cli-skeleton > /tmp/ec2_settings.json

で取得することが可能であるが、不要な設定も多く含まれているので、どの設定を有効とするかは精査が必要である。AWSマネージメントコンソールで設定可能な項目と同程度の設定であれば、以下の設定で起動することが可能である。

{
    "DryRun": false,
    "ImageId": "ami-XXXXXXXX",
    "KeyName": "XXXXXXXX",
    "SecurityGroups": [
        "XXXXXXXX"
    ],
    "InstanceType": "t2.micro", 
    "BlockDeviceMappings": [
        {
            "DeviceName": "/dev/xvda", 
            "Ebs": {
                "VolumeSize": 8,
                "DeleteOnTermination": true,
                "VolumeType": "gp2"
            }
        }
    ],
    "Monitoring": {
        "Enabled": true
    },
    "DisableApiTermination": true,
    "InstanceInitiatedShutdownBehavior": "stop",
    "IamInstanceProfile": {
        "Name": "XXXXXXXX"
    }
}

それぞれの設定項目と、AWSマネージメントコンソール上の表示との対応は、以下の通り。

JSON項目名 AWSマネージメントコンソール上の名称 内容
DryRun 設定ファイル作成時は、DryRunで確認する
ImageId Amazon マシンイメージ AMIのID
KeyName キーペアの選択 キーペア
SecurityGroups セキュリティグループの設定 セキュリティグループ名
InstanceType インスタンスタイプの選択 インスタンスタイプ
BlockDeviceMappings/DeviceName デバイス AWSマネージメントコンソールは、通常/dev/xvdaが指定される
BlockDeviceMappings/EBS/VolumeSize サイズ(GiB) ボリュームサイズ
BlockDeviceMappings/EBS/DeleteOnTermination 合わせて削除 インスタンス削除時にボリュームも削除するか否か
BlockDeviceMappings/EBS/VolumeType ボリュームタイプ
Monitoring モニタリング CloudWatch 詳細モニタリングを有効化
DisableApiTermination 削除保護の有効化 誤った削除からの保護
InstanceInitiatedShutdownBehavior シャットダウン動作 シャットダウン時にインスタンスを削除するか停止するか
IamInstanceProfile IAM ロール IAM インスタンスプロファイル

なお、Tagはインスタンスを起動しないと指定できない
この設定ファイルを用いてEC2インスタンスを起動する場合は、以下のコマンドを実行する。

aws ec2 run-instances --cli-input-json file:///tmp/ec2_settings.json

この際、設定ファイルに誤りがある場合には、

Parameter validation failed:
Invalid type for parameter SecurityGroups, value: XXXXXXXX, type: <type 'unicode'>, valid types: <type 'list'>, <type 'tuple'>

などのように、エラーメッセージが返される。

AWS Identity and Access Management(1)IAMとは

AWS Identity and Access Management (IAM)とは

AWS IAMは、AWSをセキュアに使用するための認証認可の仕組み。UserやGroupを作成してパーミッションを付与することができる。AccessKey, SecretKeyの取り扱いは注意が必要で定期的な更新が望ましい。また、Rootアカウント(アカウントを作成したときのID)はIAMの設定するポリシーが適用されない強力なアカウントになるので極力使用しない。

IAMで作成したユーザでマネージメントコンソールにログインすることが可能で、ログインURLはIAM Dashboardより確認編集することが可能である。

安全なアカウント管理のために

安全にアカウントを管理するためには以下の手法を講じることが望ましい。

  • ルートアカウントのアクセスキーを消去する
  • ルートアカウントをMFA認証にする
  • AWSが定期着したポリシーを利用する
  • ユーザにグループを割り当て、グループごとにポリシーを定義する
  • 最小限の権限のみを与える
  • EC2で動作するアプリケーションへは、アクセスキーではなくロールで権限を与える

セキュリティ監査

セキュリティ監査を実施することで高いセキュリティレベルを維持することができる。セキュリティ監査は、定期的もしくはユーザの増減があった際や、サービスの開始/停止時、不正アクセスが疑われる際などに推測を交えずに徹底的に行うと良い。

管理ポリシー

AWSアクセスへの管理権限をJSON形式で指定することが可能である。条件(Condition)は、項目を連ねた場合はAND、項目内で条件を連ねた場合はORとして扱われる。全てのアクセスはデフォルトで拒否、Allowが指定されれば許可、Denyが指定されれば明示的な拒否として扱われる。

分類 項目例 内容
Effect Allow or Deny 許可設定であればAllow, 拒否設定であればDeny
Action s3:createBucket 操作の指定、ワイルドカードも使用可能
Resource arn:aws:s3:::mybucket service:region:account:resouceの順で記述する
Condition “IPAddress”: {“AWS:SourceIP”: “192.168.0.1”} 条件を指定する

IAMロール

AWSサービスに対してAWSアクセスの管理権限を付与する仕組み。UserやGroupには紐付かない。例えばEC2からDynamoDBやS3にアクセスする場合は、EC2上にCredentialを置くのではなくインスタンス作成時に適切なIAMロールを紐付ける。EC2へのIAMロールの紐付けは、インスタンス作成時のみ可能であることに注意が必要である。

AWSCredentialsProvider

AWSの各サービスにアクセスするプログラムをEC2上で動作させる場合に、認証情報をCredentialsから取得するのか、IAMロールから取得するのか選択することができる。Credentialsから取得する場合はProfileCredentialsProviderを、IAMロールから取得する場合はInstanceProfileCredentialsProviderクラスを使用する。

// Credentialsから取得する場合
AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();

// IAMロールから取得する場合
//
// 引数(refreshCredentialsAsync)をtrueにすると認証情報を非同期に更新する新しいスレッドが生成される
// falseにすると認証情報の更新は、インスタンスメタサービスに合わせられる
AWSCredentialsProvider credentialsProvider = new InstanceProfileCredentialsProvider(true);

// 認証情報の取得
credentialsProvider.getCredentials();

Amazon VPC (1)Amazon Virtual Private Cloud とは

VPC

各アベイラビリティゾーンのデフォルトサブネットを持つデフォルトVPCが標準で作成され、インスタンス起動時にサブネットを指定しなかった場合は、このデフォルトVPCが指定される。これに加えて、ユーザ独自にデフォルト外VPCを作成することが可能である。VPCは、ルータを通じて他のVPCと接続(ピアリング接続)したり、S3などの他のAWSサービスのエンドポイントと接続したり、VPN経由で自社のネットワークと接続したりすることが可能である。VPCを利用するAWSサービスの例としては、AWS Data Pipeline, Elastic Beanstalk, Elastic Load Balancing, Amazon ElastiCache, Amazon EMR, AWS OpsWorks, Amazon RDS, Amazon Redshift, Route 53などがある。

VPCは生成する際にサイズを指定することが可能で、/16から/28までを指定できる。生成後にサイズを変更することはできない。指定するCIDR ブロックは、プライベートIPアドレスの範囲から指定することが望ましい。

デフォルトVPC

デフォルトVPCには、ルータインターネットゲートウェイが含まれており、各サブネットは、インスタンスに対してパブリックIPの割り当てが実行される、インターネットに接続可能なパブリックサブネットである。サブネットを指定せずにEC2を起動した場合は、デフォルトVPCで起動される

デフォルトVPC

デフォルト外VPC

デフォルト外VPCには、ルータやインターネットゲートウェイが含まれておらず、自分で設定に加える必要がある。また、サブネットも標準では、パブリックIPの割り当てが行われず、プライベートサブネットに設定されている。

デフォルト外VPCでインターネット接続を可能にするためには、インターネットゲートウェイのアタッチや、ルーティングテーブルの追加、各インスタンスへのElastic IPの割り当てが必要である。プライベートサブネットの場合、サブネット内のインスタンスが直接インターネットに接続することができないため、別のパブリックサブネット内にNAT gatewayを生成し、このNAT gateway経由でインターネットと接続を行う。Elastic IPの数には限りがあるので、静的なIPアドレスを多く使用するようなネットワーク構成の場合にも、NAT gatewayは有効である。

サブネット

サブネットは、アベイラビリティゾーン単位で指定できる。サブネットは生成する際にサイズを指定することが可能で、/16から/28までを指定できる。指定したCIDR ブロックの先頭4アドレスと最後の1アドレスは使用することができない。なお、先頭アドレスは、ルータに接続されるIPアドレスとなっている。インターネットに接続する必要のあるリーソースの場合は、パブリックサブネットを、インターネットに接続しないリソースの場合は、プライベートサブネットに接続する。

ルーティング

各VPCには暗黙的なルータ(implied router)が存在し、標準ではVPC内の各サブネット間の通信のみ許可されている。また、ルートテーブルは、標準で生成されるメインルートテーブルと、各サブネットにそれぞれ割り当てることが可能なカスタムルートテーブルが存在する。明示的にルートテーブルの関連付けを行わない場合は、メインルートテーブルにアタッチされる。インターネットゲートウェイを通じて、インターネットに接続する場合は、ルートテーブルにインターネットゲートウェイへの経路を明示的に追加する必要がある。

ネットワークインタフェース

ネットワークインタフェースは、インスタンスにアタッチ、デタッチしても属性情報は変わらない。1つのインスタンスに複数のネットワークインタフェースをアタッチすることで、管理用ネットワークを別に作成することなどが可能となる。一方で、複数のネットワークインタフェースが存在すると、パブリックIPアドレスの自動割り当ては利用不可となる。

AWS S3(2)S3Sync:S3バックアップツール

S3Sync

以前、S3にバケットを作成してGlacierアーカイブを行う手順を確認したが、この仕組みを利用してMacの任意のディレクトリをS3 Glacierと自動的に同期するアプリケーション「S3Sync」を作ってみた。Macのスリープを検知すると同期を始めるので、寝ている間にラクラク同期できる。

といってもこのアプリ、単にNSTaskを使ってシステムコマンドを実行しているだけのアプリなので、任意のコマンドを自由に実行することができる。ステータスバーに常駐しているアプリなので、作業の邪魔にもならない。

S3Sync

スリープ検知

スリープ検知をするには、NSWorkspace ClassNSWorkspaceWillSleepNotification属性を使う。

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // スリープ検知
        NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: #selector(self.receiveSleepNotification(_:)), name: NSWorkspaceWillSleepNotification, object: nil)
    }

    func receiveSleepNotification(notification: NSNotification){
        // スリープ実行時に行う処理
    }

システムコマンドの実行

システムコマンドは、NSTask Classから実行することが可能である。
NSTaskは、実行したシステムコマンドの出力結果を取り出すことも可能だが、readDataToEndOfFile()を使うとブロッキング処理が発生してしまうので、dispatch_async()を使って非同期に順次出力処理していく必要がある。

let task = NSTask() 
// 実行コマンドをフルパスで指定
task.launchPath = "/usr/local/bin/aws "
// パラメータを配列形式で指定
task.arguments = ["-h", "hogehoge"]
// 標準出力をパイプに渡す
let pipe: NSPipe = NSPipe()
task.standardOutput = pipe
let stdoutHundle = pipe.fileHandleForReading     
// 非同期処理
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), {
var dataRead = stdoutHundle.availableData
while(dataRead.length > 0){
	let stringRead = NSString(data: dataRead, encoding: NSUTF8StringEncoding)
        if let output = stringRead {
		// 出力結果処理
        }
        dataRead = stdoutHundle.availableData
}
// コマンドの実行
task.launch()

NSTaskは、suspend()terminate()を使って、途中で処理を停止したり、完全に終了してしまったりすることができる。suspend()で中断した処理は、resume()で再開することができる。また、タスクが実行中にも関わらず再度launch()を実行してしまうと、下記の実行エラーが発生してしまう。

task already launched

通知の送信

本アプリは、コマンド実行毎にMacの通知センターに実行状況を通知する。

アプリ通知

Macの通知センターに通知を送信するには、NSUserNotificationCenter Classを使う。送信する通知には、「タイトル」「サブタイトル」の他に様々な項目を設定することが可能である。

// NSUserNotificationCenterDelegateが必要
class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {

    func deliverNotification(title : String, subtitle : String, informativeText: String){
        // AppDelegate Classにデリゲードを指定
        NSUserNotificationCenter.defaultUserNotificationCenter().delegate = self
        let notification = NSUserNotification()
        notification.title = title
        notification.subtitle = subtitle
        notification.informativeText = informativeText
        notification.contentImage =  NSImage(named: "MainIcon")
        notification.userInfo = ["title" : "タイトル"]
        NSUserNotificationCenter.defaultUserNotificationCenter().deliverNotification(notification)
    }

}

ログを保存するディレクトリの指定

本アプリは、実行ログをファイルに保存することができる。

NSOpenPanel

Macでディレクトリやファイルを開くする際は、NSOpenPanel Classを利用する。
また、保存の際はNSSavePanel Classというクラスも用意されている。

// MARK: ディレクトリ選択画面
let panel = NSOpenPanel()
// ファイル選択の可否
panel.canChooseFiles = false
// ディレクトリ選択の可否
panel.canChooseDirectories = true
// 複数選択の可否
panel.allowsMultipleSelection = false
panel.beginWithCompletionHandler({(num) -> Void in
      if num == NSModalResponseOK {
           // ディレクトリ・ファイル決定時の処理
      }
})

常駐アプリ

ステータスバーに常駐するアプリを作成するためには、Project > TARGET > Info > Custom OS X Application Target Propertiesから、Application is agent (UIElement)YESに設定する。

Application is agent

StoryBoardのTips

  • 常駐アプリであっても、Main Menu > Edit がないと、TextFieldの Shortcut Keyが使えない

Main Menu : Edit

AWS S3(1)MacのデータをGlacierにバックアップする

iMacに保存されているデータをAmazon Glacierに定期バックアップする。

Amazon Glacierは、長期バックアップに最適なストレージで、非常に低コストであることが特徴である。費用はリージョンごとに異なり、バージニアリージョンであれば0.007USD/GB、東京リージョンであれば0.0114USD/GB、1TBのデータを保存しても月額800円程度と安価である。Glacierは、データをアーカイブとして保存するため、アップロード後にデータを改変することができない。S3ではデータの保存先にGlacierを指定することが可能で、ライフサイクル設定によりデータを定期的にGlacierにアーカイブ可能となっている。

AWS CLI のインストール

MacからAWSにアクセスするためには、コマンドラインツールであるAWS CLIの利用が便利である。AWS CLIは、pip(Pythonパッケージ管理システム)からインストールが可能である。

$ sudo pip install awscli
  Downloading six-1.10.0-py2.py3-none-any.whl
Installing collected packages: pyasn1, rsa, futures, jmespath, six, python-dateutil, docutils, botocore, s3transfer, colorama, awscli
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 317, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 726, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 746, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-oO8sKD-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

上記のようにsixが既にインストールされているという警告が出てインストールできない場合は、以下のコマンドでインストールを行う。

$ sudo pip install awscli --upgrade --ignore-installed six

インストール完了後は、認証情報の設定を行う。AWS Access Key IDAWS Secret Access Keyなどの認証情報は、AWSマネージメントコンソールのAWS Identity and Access Managementから設定が可能である。

$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

S3初期設定

S3の設定を行い、データを格納するバケットの生成および、Glacierへバックアップを行うライフサイクル設定をする。安価にデータをバックアップするという目的でGlacierを使用することから、今回は単価が最も安いバージニアリージョンをする。

バケットの生成

バケットを生成する。
このときAWS CLIに設定したユーザにS3へのアクセス権限がないとエラーが発生する。

$ aws s3 mb s3://backup-hoge --region us-east-1
make_bucket failed: s3://backup-hoge/ A client error (AccessDenied) occurred when calling the CreateBucket operation: Access Denied

そこで、AWSマネージメントコンソールのAWS Identity and Access Managementで、該当ユーザにAmazon S3 Full Access権限を付与する。

ポリシーのアタッチ

また、S3のバケット名はユニークである必要があるので、既に同一名称のバケットが存在する場合は、下記のようなエラーが発生するので注意が必要である。

$ aws s3 mb s3://backup-hoge  --region us-east-1
make_bucket failed: s3://backup-hoge/ A client error (BucketAlreadyExists) occurred when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

ライフサイクル設定

次にライフサイクル設定で、どの程度の頻度でGlacierへアーカイブするかを設定する。
今回は、以下の設定としている。

設定内容 JSON
即日アーカイブする “Days”: 0″
特定のディレクトリに限定することなくバケット全体をアーカイブする “Prefix”: “”
Glacierへアーカイブする “StorageClass”: “GLACIER”

このとき、「”Prefix”: null」とすると、フォーマットエラーとなる。

vi /tmp/lifecycle.json

{
    "Rules": [
        {
            "Status": "Enabled", 
            "Prefix": "", 
            "Transition": {
                "Days": 0, 
                "StorageClass": "GLACIER"
            }, 
            "ID": "backup for xxx"
        }
    ]
}

JSONが作成できたら、ライフサイクル設定の反映を行う。

aws s3api put-bucket-lifecycle --bucket backup-hoge --lifecycle file://lifecycle.json

同期処理

同期処理は以下のコマンドにより実行できる。deleteオプションによりファイル削除も同期される。また、excludeオプションによって同期対象外のファイルやフォルダを指定できるので、.DS_Storeファイルなどを指定しておくと良い。excludeオプションは、条件の数だけいくつでも追記できる。

aws s3 sync /Volumes/hoge/ s3://backup-hoge --delete --exclude '*.DS_Store'