AWS Security Hub(1)Security Hubの概要

Security Hub

Security Hubは、Amazon GuardDuty、Amazon Inspector、Amazon Macie などのAWSが提供するセキュリティ関連サービスや、AWSパートナーが提供するセキュリティ製品からの セキュリティ検出結果等を統合的に閲覧可能なサービス で、本サービスを利用することで、情報の収集や優先度の決定などのコストを低減できる。発見事項は、Security Hub内に90日保管 される。Security Hubは、リージョンサービスであり、使用するリージョン毎にサービスを有効化する必要 がある。一方で、 複数アカウントをサポート しており、全てのアカウントを統合して発見事項を表示することもできる。

また、Center for Internet Security (CIS) AWS Foundations Benchmark のスコア表示にも対応しており、業界標準のベストプラクティスをどの程度満たしているかについても確認することが可能となっている。なお、この機能を正常に実行するためには、AWS Configを有効化することが必要。ベストプラクティスを満たしていない場合は、Security Hubから修復方法を確認することができる。

Amazon CloudWatch Eventsとの統合がサポートされているため、検出結果を受信した際に実行するカスタムアクションを規定することもできる。

また、インサイトと呼ばれるグループ化された検出結果のコレクションが存在し、コレクションを用いることで、修復が必要な問題の特定ができる。カスタムインサイトを作成することも可能。

AWS Security Hub のセットアップ

一部機能のみではあるがCloudFormationに対応しているため、CloudFormation経由でSecurity Hubをセットアップすることができる。

サービスロールの有効化

以下のサービスロールを有効化することで、Amazon GuardDuty、Amazon Inspector、および Amazon Macie から結果を検出し集計することが可能となる。また、AWS Configをセットアップし、CIS AWS Foundationsコンプライアンスチェックを実行する。

Resources:
  ServiceLinkedRoleForSecurityHub:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: securityhub.amazonaws.com
      Description: A service-linked role required for AWS Security Hub to access your resources.

Security Hubの有効化

Resources:
  SecurityHub:
    DependsOn:
      - ServiceLinkedRoleForSecurityHub
    Type: AWS::SecurityHub::Hub

AWS Security Hubのセットアップテンプレート

AWS Security Hubを含むAWSのセキュリティサービスをまとめて有効化できるCloudFormationテンプレートを公開している。

cloudformation-launch-stack

CIS AWS Foundationsコンプライアンスチェック

Security Hubは、AWS Configと連携して、Center for Internet Security (CIS) AWS Foundations Benchmarkに適合しているかのチェックを行う。Security Hubは、Security Finding と呼ばれるテンプレートに沿って検出結果を表示するために、結果毎にデータ変換等を行う必要がない。Security Findingの構成については、下記を参照のこと。

なお、CIS AWS Foundationsは、同一リージョン内のリソースに対しての結果のみ有効であり、他のリージョンのリソースに対しての結果はfailedが返却される。したがって、例えば複数のリージョンでCloudTrailが有効化されており、各リージョンで証跡用およびアクセスログ用のバケットが作成されている場合は、チェック 2.3 および 2.6は非準拠として表示される

チェックは、前回から12時間以内に再度実行 される。また、変更によってトリガーされるチェックに関しては、リソースに変更が変更された際に実行される。

AWSサービスとの統合

Security Hubは、Amazon GuardDuty、Amazon Inspector、Amazon Macie などのAWSが提供するセキュリティ関連サービスなどで生成されたセキュリティ検索結果を統合することができる。統合を行うためには、各AWSサービスを有効化する必要がある。

CloudWatchイベントによる自動化

CloudWatchイベントを使用して、Security Hubで検知した問題やリソースの変更に自動的に対応することが可能である。以下の通知を行うことが可能である。

  • 全ての結果を自動的にCloudWatchイベントに送信
  • カスタムアクションに関連づけられた結果をCloudWatchイベントに送信
  • カスタムアクションを使用してインサイトの結果をCloudWatchイベントに送信

これらのイベントを受信するためには、CloudWatchイベントの設定画面でイベントパターンの登録を行う必要がある。

cloudformation-launch-stack

AWS Amplify Framework(2)Authenticationモジュール

Authenticationモジュール

Authenticationモジュールは、AWS Cognito ユーザプール もしくは AWS Cognito Federated Identities を用いてユーザ認証機能を提供する。AWS Cognito Federated Identitiesを用いることで、FacebookやGoogleなど、OpenIDプロバイダーを認証基盤として使用することができる。

セットアップ

Amplifyプロジェクトのルートディレクトリでamplify add authコマンドを実行することで、ウィザードに従って自動セットアップを行うことができる。

設定項目 内容
リソース名 myproject
User Pool名 myproject
Sign-Inに使用する属性 Email
MFA 無効
ユーザ登録等にEメールを使用 有効
認証メールのタイトル MyProject から 認証コード をお送りします
認証メールの本文 あなたの認証コードは {####} です。
Sign-Up時に必須の属性 Email, Name
Tokenの有効期間 30日
アクセスできるユーザ属性の限定 なし
その他の機能 ホワイトリストによるEmailドメインのフィルタ
OAuthの使用 なし
Lambda Triggers Pre Sign-up
ホワイトリストに指定するドメイン surbiton.jp
$ amplify add auth

 Do you want to use the default authentication and security configuration? Manual configuration
 Select the authentication/authorization services that you want to use: User Sign-Up & Sign-In only (Best used with a cloud API only)
 Please provide a friendly name for your resource that will be used to label this category in the project: myproject
 Please provide a name for your user pool: myproject
 Warning: you will not be able to edit these selections. 
 How do you want users to be able to sign in? Email
 Multifactor authentication (MFA) user login options: OFF
 Email based user registration/forgot password: Enabled (Requires per-user email entry at registration)
 Please specify an email verification subject: MyProject から 認証コード をお送りします
 Please specify an email verification message: あなたの認証コードは {####} です。
 Do you want to override the default password policy for this User Pool? No
 Warning: you will not be able to edit these selections. 
 What attributes are required for signing up? Email, Name
 Specify the app's refresh token expiration period (in days): 30
 Do you want to specify the user attributes this app can read and write? No
 Do you want to enable any of the following capabilities? Email Domain Filtering (whitelist)
 Do you want to use an OAuth flow? No
 Do you want to configure Lambda Triggers for Cognito? Yes
 Which triggers do you want to enable for Cognito (Press <space> to select, <a> to toggle all, <i> to invert selection)Pre Sign-up
 What functionality do you want to use for Pre Sign-up (Press <space> to select, <a> to toggle all, <i> to invert selection)Sign-Up email filtering (whitelist)
 Enter a comma-delimited list of allowed email domains (example: 'mydomain.com, myotherdomain.com'). surbiton.jp
Succesfully added the Lambda function locally
 Press enter to continue 
Successfully added resource myproject locally

Vue Components

認証モジュールに関連して使用できるVue Componentsは以下の通り。

Components 内容
<amplify-authenticator></amplify-authenticator> 認証全般
<amplify-sign-in></amplify-sign-in> Sign-In
<amplify-confirm-sign-in></amplify-confirm-sign-in> Sign-Inの確認
<amplify-sign-up></amplify-sign-up> Sign-Up
<amplify-forgot-password></amplify-forgot-password> パスワード忘れ時
<amplify-sign-out></amplify-sign-out> Sign-Out
<amplify-set-mfa></amplify-set-mfa> MFAの設定

Example

認証モジュールを組み込んだVue Componentの実装例は以下の通り。

<template>
  <div id="auth">
    <div v-if="signInStatus === 'signedIn'">
      <!-- サインアウト -->
      <amplify-sign-out></amplify-sign-out>
    </div>
    <div v-else>
      <!-- サインイン -->
      <amplify-authenticator v-bind:authConfig="authConfig"></amplify-authenticator>
    </div>
  </div>
</template>

<script>
import { AmplifyEventBus } from 'aws-amplify-vue'
import { Auth } from 'aws-amplify'
export default {
  name: 'Auth',
  components: {},
  data: function() {
    return {
      signInStatus: 'signedOut',
      authConfig: {
        // サインインにEmailを使用
        usernameAttributes: 'Email',
        signUpConfig: {
          hideAllDefaults: true,
          // サインアップに使用する項目
          signUpFields: [
            {
              label: 'Email',
              key: 'email',
              required: true,
              displayOrder: 1,
              type: 'string',
              signUpWith: true
            },
            {
              label: 'Name',
              key: 'name',
              required: true,
              displayOrder: 2,
              type: 'string'
            },
            {
              label: 'Password',
              key: 'password',
              required: true,
              displayOrder: 3,
              type: 'password'
            },
          ]
        }
      }
    }
  },
  async beforeCreate() {
    try {
      // 現在のユーザ
      await Auth.currentAuthenticatedUser()
      this.signInStatus = 'signedIn'
    } catch (err) {
      this.signInStatus = 'signedOut'
    }
    AmplifyEventBus.$on('authState', info => {
      switch (info) {
        case 'signedIn':
          this.signInStatus = 'signedIn'
          break
        default:
          this.signInStatus = 'signedOut'
          break
      }
    });
  }
}
</script>

<style>
</style>

AWS Connect(1)AWS Connectの概要

AWS Connectとは

AWS Connectとはクラウド型コンタクトセンターで、Amazonのコンタクトセンターと同じ技術が使われている。グラフィカルインタフェースを用いることでコーディングすることなく、対応フローの設計、スタッフの管理などが簡単に実現できる。

インフラの管理が不要で手軽に規模を拡大縮小できる。また、Amazon Lexとの連携によって自動応答を実現したり、CRMソリューションと連携して顧客情報の管理を行うこともできる。また、アウトバンドコンタクトAPIを用いて、スケジュールした時刻にプログラムから電話を発信することも可能である。

サポートされているブラウザは、最新3バージョンChrome最新Firefox。東京リージョンに対応し日本語にも対応している。

AWS DynamoDB(4)項目の読み取りと書き込み

項目の読み取り

単一項目の読み取り

単一項目の読み取りには、GetItemアクションを使用する。一部の属性のみを取得する場合には、ProjectionExpressionを使用する。

{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    },
    "ProjectionExpression": "AlbumTitle, Year, Price"
}

複数項目の読み取り

複数項目の読み取りには、Queryアクションを使用する。Queryアクションは、複合プライマリキー (PartitionKeyとSortKey) のあるテーブルで使用できる。KeyConditionExpressionFilterExpressionの中で、ExpressionAttributeValuesの値をプレースホルダーとして使用する必要がある。

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a and SongTitle = :t",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":t": "Call Me Today"
    }
}

全ての項目の読み取り

全ての項目の読み取りには、Scanアクションを使用する。FilterExpressionを用いて不要な項目を除外することもできるが、Scan後に実行されることに留意が必要である。

// Return all of the values for Artist and Title
{
    TableName:  "Music",
    ProjectionExpression: "Artist, Title"
}

項目の書き込み

新たな項目の書き込み

新たな項目の書き込みには、PutItemアクションを使用する。

{
    TableName: "Music",
    Item: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today",
        "AlbumTitle":"Somewhat Famous",
        "Year": 2015,
        "Price": 2.14,
        "Genre": "Country",
        "Tags": {
            "Composers": [
                  "Smith",
                  "Jones",
                  "Davis"
            ],
            "LengthInSeconds": 214
        }
    }
}

既存の項目の変更

既存の項目の変更には、UpdateItemアクションを使用する。既存の項目が存在する場合には更新され、存在しない場合には項目が追加される。条件付き書き込みをサポートしており、ConditionExpressionがtrueと評価されたときのみ実行される。

{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ConditionExpression: "Price >= :p",
    ExpressionAttributeValues: { 
        ":label": "Global Records",
        ":p": 2.00
    }
}

項目の削除

項目の削除には、DeleteItemアクションを使用する。条件付き削除をサポートしており、ConditionExpressionがtrueと評価されたときのみ実行される。

{
    TableName: "Music",
    Key: {
        Artist: "The Acme Band", 
        SongTitle: "Look Out, World"
    },
   ConditionExpression: "attribute_exists(RecordLabel)"
}

AWS Amplify Framework(1)Amplifyの概要

AWS Amplify Frameworkとは

AWS Amplifyは、モバイルアプリやウェブアプリの実装を容易にするフレームワークで、AWS上のバックエンドをプロビジョニングし、iOSAndroidWeb、React Native上などのフロントエンドと簡単に統合することができる。バックエンドのサービスを設定可能なAmplify CLIや、Web上に展開するAmplify JSなどのリソースがGitHub上で提供されており、認証解析プッシュ通知ボットなどの機能を実装することが可能である。

提供される機能の例 AWSサービス 内容
Analytics Congito/Pinpoint ユーザのセッションや属性などを計測
API Lambda + API Gateway REST/GraphQL APIの利用
Aythentication 認証APIとpre-build UI component
Storage S3 + Cloudfront 静的コンテンツの管理
Interactions Botの構築
PubSub リアルタイムデータのやりとり
Notification プッシュ通知
XR AR/VR

Amplify CLI

Amplify CLIを用いることでバックエンドを簡単に設定することができる。バックエンドのカテゴリごとにカテゴリプラグインや、プロバイダープラグインフロンドエンドプラグインなど様々なプラグインが用意されている。これらのリソースの状況は、amplify statusコマンドで確認することができる。

実行順序 コマンド 内容
1 amplify configure AWSユーザや認証情報の設定
2 amplify init プロジェクトの作成
3 amplify add カテゴリの追加
4 amplify push バックエンドのデプロイ

初期設定

amplify initコマンドを実行することで、フロントエンドの設定確認と初期化、AWS上のバックエンドをセットアップすることができる。1つのプロジェクトは設定の異なる複数のバックエンド(=Env)を持つことが可能で、amplify envコマンドを用いてこれらのバックエンドを切り替えることが可能。Gitのブランチと組み合わせることも可能で、masterブランチ上のプロジェクトはprod環境のバックエンド上にデプロイ、developブランチ上のプロジェクトはdevelop環境のバックエンド上にデプロイするなどの設定を行うことができる。万が一、AWS上のCloudFormationを削除してしまった状態のままデプロイした場合はエラーとなるので、この場合はamplify initコマンドでバックエンドの再生成が必要となる。

コマンド 実行内容
amplify env add ENV_NAME バックエンドを追加
amplify env remove ENV_NAME バックエンドを削除
amplify env pull ENV_NAME –restore AWS上のバックエンド設定を参照して上書き
amplify env list バックエンドの一覧を表示

AWS Amplify Console等の外部サービスでAmplifyをデプロイしたあとに、amplify pushコマンドを用いて開発環境上でデプロイを実行すると、バックエンドのデプロイ状態に差異が生じているためにデプロイに失敗する。上記のamplify env pullコマンドによって、AWS上の最新のバックエンド情報を取得することで、この問題は解決する。

カテゴリの追加と削除

上述のようにAmplify Frameworkは、認証解析などの様々な機能を有している。これらの機能(=カテゴリ)を自身のプロジェクトに追加したり削除したりするのが、amplify add/update/remove CATEGORY_NAMEコマンドである。

その他のコマンド

その他よく使うコマンドは以下の通り。

コマンド 実行内容
amplify codegen AWSからGraphQL Schemaを取得しJSファイルを生成
amplify delete Amplify プロジェクトをすべて削除
amplify status Amplify プロジェクトのステータスを表示
amplify push Amplify プロジェクトをAWS上でデプロイ

Amplifyプロジェクト

Amplifyプロジェクトは、以下のようなディレクトリ構成となっている。

.
├── amplify/
|├── backend/
||     ├─── api
||     |  └── schema.graphql   (編集可)    GraphQLのスキーマ
||     ├── amplify-meta.json   (自動生成)   AWSリソースの設定情報を格納 
||     └── awscloudformation   (自動生成)   CloudFormationのルートスタック
|├── .config/                   (自動生成)   クラウドの構成とユーザー設定/設定を保存
|└── #current-cloud-backend     (自動生成)  直近に取得したクラウド構成
└── src/
    ├── App.vue                  (編集可)     Vueの単一コンポーネントファイル     
    ├── graph/                   (自動生成)    GraphQL statement
    ├── main.js                  (編集可)      Vueのエントリーポイント      
    └── aws-exports.js           (自動生成)    AWSリソースのエンドポイント等の情報を格納

AWS認定(3)SysOps アドミニストレーター(アソシエイト)に合格するまで

AWS認定SysOpsアドミニストレーター試験合格に向けての資料集。以下の資料を何度も読み込んで、手を動かしながら実践を繰り返すことが合格の近道となる。

出題範囲と学習法

AWS認定SysOpsアドミニストレーター試験の問題は、AWS上でデプロイ運用管理を行う際に、可用性や拡張性を考慮してどのようなサービスや機能を選択すべきかについて問われることが多い。AWSが提供するサービスは100を超えるが、本試験を受講する上では以下のサービスを理解しておくことが望ましい。

カテゴリ サービス名
コスト管理 Cost Explorer
コンピューティング Auto Scaling, ELB
データベース RDS
マネジメントとガバナンス CloudWatch, Personal Health Dashboard, Config, System Manager, CloudFormation, Trusted Advisor
移行と転送 Snowball
ネットワーキングとコンテンツ配信 VPC, Route 53, DirectConnect
セキュリティとコンプライアンス IAM, Organizations
ストレージ S3, Glacier, EBS

勉強法は、

  1. サンプル問題集に目を通してレベルを確認する
  2. 以下の資料を読みながら実際に各サービスに触れる
  3. 模擬試験を受講する

で十分合格ラインに行くかと。ちなみに学習時間はソリューションアーキテクトとデベロッパーを取得済みだったので3日ほど。なお、各サービスのドキュメントにベストプラクティスの項目が存在する場合は、該当部分を理解しておく

対策本

対策本はほとんど発売されていない。以下の本が唯一の試験対策本。この本には、各サービスの概要や特徴が簡潔に書かれており、AWSの各サービスの概要を学ぶためには非常に有効。一方で、章末問題と実際の試験問題は異なるので、実際の問題に慣れるためには、模擬試験の受講が必要である。

AWSの概要とセキュリティ

AWS(1)AWSの概要とメリット
AWS(4)Well-Architectedフレームワーク
AWS(5)セキュリティのベストプラクティス

AWS Identity and Access Management

AWS(2)セキュリティの概要
AWS Identity and Access Management(1)IAMの概要
AWS Identity and Access Management(4)STS

AWSの基本サービスの概要

Amazon EC2 と Elastic Load Balancing

AWS EC2(1)EC2の概要
AWS EC2(3)AMIとインスタンス
AWS EC2(6)Elastic Load Balancing
EC2(7)Auto Scaling

Amazon VPC

AWS VPC (1)Amazon Virtual Private Cloud とは

Amazon S3

AWS S3(3)S3の概要
AWS S3(4)使用する上で注意すること

Amazon RDS

AWS RDS(1)Relational Database Serviceの概要

Amazon SQS

AWS SQS(1)Amazon Simple Queue Serviceの概要

AWS CloudFormation

AWS CloudFormation(1)CloudFormationの概要

Amazon CloudWatch

AWS CloudWatch(1)CloudWatchの概要

AWS EC2(7)Auto Scaling

EC2 Auto Scalingとは

EC2 Auto Scalingを用いることで、アプリケーションの負荷を処理するための適切な数のEC2インスタンスを利用することができる、。Auto Scalingを利用するためには、Auto Scalingグループと呼ばれるEC2インスタンスの集合を定義し、このグループに含まれる最小と最大のインスタンスの数を定義する。また、希望するインスタンス数(Desired capacity)を定義することも可能。また、Auto Scalingグループ内のEC2インスタンスを複数のAZに分散配置することで、地理的な冗長性や安全性を実現できる。

Auto Scaling グループ

Auto Scalingを用いることで、耐障害性や可用性が向上する。また、必要な数のインスタンスのみ起動されるため安定的なパフォーマンスを低コストで実現することができる。

Auto Scalingグループ内の各EC2インスタンスの負荷に偏りが発生した場合は、古いインスタンスを終了して新しいインスタンスを起動させる。この場合にスムーズに処理が継続されるように、一時的に最大容量に対して10%のマージンが確保される

ライフサイクル

Auto Scalingのライフサイクルは以下の通り。

ライフサイクル

Auto Scalingグループはグループ内のインスタンスに対して定期的にヘルスチェックを行なっている。スケールイン/アウトは、手動もしくはスケーリングポリシースケジュールに基づき実行される。スケールイン、ヘルスチェックの失敗、Auto Scalingグループからの離脱等が発生した場合には、Auto Scalingグループ内のEC2インスタンスは終了処理が実施される。

Auto Scalingグループ

起動設定

Auto Scalingグループ内のEC2インスタンスは、起動テンプレートもしくは起動設定の設定内容に基づいて起動される。これらには、AMIのIDやインスタンスタイプ、ネットワーク設定、ストレージの設定、オンデマンドインスタンスとスポットインスタンスの配分等が含まれる。また、起動設定は、既に起動済みのインスタンスの属性を使用して作成することも可能である。Auto Scalingグループに関連付けられる起動設定は1つだけであり、グループ作成後に変更することはできない。Auto Scalingグループに関連づける起動設定を変更する場合は、現在の起動設定をコピーした上で新たな起動設定を作成し、これを当該のAuto Scalingグループに紐づける。

ロードバランサとの連携

Auto Scalingで増減したインスタンスに対して適切にトラフィックが分散されるようにするためには、Elastic Load Balancingの受信トラフィックの通信先にAuto Scalingグループを指定する。Auto Scalingのヘルスチェックは、通常EC2のステータスチェックのみであるが、オプションでELBのヘルスチェックを用いてAuto Scalingグループのヘルスチェックを行う設定にすることも可能である。この場合、ELBから送られる定期的なPINGに応答しないなど、ELBのヘルスチェック合格しなかった場合、このインスタンスは異常ありと判定されて他のインスタンスに置き換えられる。

スケーリング

Auto Scalingでは、以下のスケーリング方法を実施可能である。

  • 現在のインスタンスレベルの維持
  • 手動スケーリング
  • スケジュールに基づくスケーリング
  • 要求に基づくスケーリング(動的スケーリング

CloudWatchのメトリクスを利用して複数のスケーリングポリシーを適用することも可能である。例えば、EC2のCPU使用率を指標としたポリシーと、SQSのメッセージ処理に関するメトリクスを指標としたポリシーを同時に適用する、といったような場合である。複数のポリシーが適用となった場合は、より影響を与えるポリシーの実行命令が優先される

スケジュールされたスケーリング

あらかじめ指定したスケジュールに沿って、スケーリングアクションが実行されるように指定することが可能である。スケーリングアクションが有効になる時間と、最小/最大サイズ希望するサイズを指定する。このスケジュールは、1回のみ実行することも定期的に実行することもできる。

スケジュールされたスケーリングを作成する場合、ほとんどの場合指定した時刻から数秒以内に実行されるが、最大2分ほど遅れる可能性もあるので留意が必要である。また、複数のスケジュールを同時刻に設定することはできない。

動的スケーリング

動的スケーリングは、以下の方法をサポートしている。

ポリシー名 トリガおよび動作
Target tracking scaling 特定のメトリクスのターゲット値を維持するようにスケーリング
Step scaling 複数のスケーリング調整値をトリガにスケーリング
Simple scaling 1つのスケーリング調整値をトリガにスケーリング

Simple scaling および Step scaling

トリガに基づいてスケーリングが実行される際には、以下の調整タイプに基づいてスケーリングが実行される。

調整タイプ 動作
ChangeInCapacity 指定した数だけ増減する
ExactCapacity 指定した数になるように増減する
PercentChangeInCapacity 割合指定する

また、Step scalingの場合は、新しく起動されたインスタンスがAuto Scalingグループに追加されるまでの待ち時間(ウォームアップ)を指定できる。

SQSに基づくスケーリング

SQSにキューが積み上がり、処理が遅延することがないようにするには、 SQSのデータを読み取り処理を行うEC2をAuto Scalingさせる必要がある。このAuto Scalingを適切にスケーリングさせるためには、 Amazon SQS メトリックスApproximateNumberOfMessagesを用いてキューの長さを測定した上で、1インスタンスあたりの処理能力を計算しどの程度スケーリングさせる必要があるか指定する。

SQSに基づくスケーリング

クールダウン

メトリクス値が短期間で増減し、その度にスケーリングが実行されることを防ぐために、クールダウン期間が設けられている。デフォルトのクールダウン値は300秒。クールダウン期間は新たなスケーリングは実行できない。なお、このクールダウンが有効なのは、Simple scalingのみ。

インスタンスの停止

スケールイン時に停止されるインスタンスは以下の条件で決定される。

  1. インスタンスが最も多いAZ
  2. 最も古い起動設定またはテンプレートを使用している
  3. 次の課金開始時間に近いインスタンス

終了時ポリシーはカスタマイズが可能である。また、終了から保護するインスタンスを指定することもできる。

ポリシー名 実行内容
OldestInstance 最も古いインスタンス
NewestInstance 最も新しいインスタンス
OldestLaunchConfiguration 最も古い起動設定のインスタンス
ClosestToNextInstanceHour 次の課金開始時間に近いインスタンス
Default デフォルト(上記)
OldestLaunchTemplate 最も古い起動テンプレート
AllocationStrategy オンデマンド/スポットの割り当て戦略に合わせて決定

ライフサイクルフック

インスタンスの起動時もしくは削除時に一時停止して、カスタムアクションを実行できる機能。ソフトウェア等をインストールできる。

ライフサイクルフック

スケーリングプロセスの中断と再開

スケーリングプロセスの1つ以上を停止し、あとで再開できる。

スケーリングプロセス 内容
Launch インスタンスを追加
Terminate インスタンスを削除
HealthCheck ヘルスチェック
ReplaceUnhealthy 異常なインスタンスを削除し代替インスタンスを作成
AZRebalance AZ間のバランスを調整
AlarmNotification CloudWatchからアラーム通知を受け取る
ScheduledActions スケジュールされたアクションを実施
AddToLoadBalancer ELBに追加

注意事項

Auto Scalingは、バーストトラフィックには対応できない

AWS CloudFormation(1)CloudFormationの概要

CloudFormationについて

使用するAWSの全てのリソースをテンプレートに記述することで、これらのリソースのデプロイや設定を自動で行なってくれるのが、AWS CloudFormationである。テンプレートは、JSONもしくはYAML形式で記述できる。CloudFormationは、既存のテンプレートを作成または変更、削除することが可能であることから、作成済みのリソースの変更や複製も容易である。変更時には履歴が残るため、過去に遡って変更点を確認することもできる。

テンプレートとスタック

テンプレートには、リソースのデプロイ時に値を手動入力できる入力パラメータを設定することができる。このテンプレートを適用したリソースの集合体をスタックと呼ぶ。スタックおよびリソースに変更を加える際に、既存のリソースにどのような影響があるかを事前に調べるために、 変更セット(Edit Template) を記述することもできる。

変更セットのデプロイ

AWS(5)セキュリティのベストプラクティス

概要

偶発的もしくは意図的な盗難漏洩不整合削除からミッションクリティカルな情報を保護するために、Information Security Management System (ISMS)を作成するためのガイドライン。

責任共有モデル

AWSでは、AWS が安全なインフラストラクチャとサービスを提供する一方で、ユーザは安全なオペレーティングシステム、プラットフォーム、データを用意する責任を持つ責任分担モデルを採用している。例えばEC2の場合は、設備やハードウェアの物理的セキュリティ、ネットワークインフラ、仮装化インフラはAWSが管理する一方で、AMI、OS、アプリケーション、データ、認証情報等は、ユーザ自らが管理しなければならない。

インフラストラクチャサービスの責任共有モデル

Trusted Advisorの利用

Trusted Advisorを利用してサービスの状況を確認し、セキュリティの設定ミスシステムパフォーマンスの向上に関する提案使用率の低いリソースの確認などを行うことができる。例えば、管理ポートへのアクセスが限定的なものであるかや、IAMが設定されているか、MFAが有効化されているかなどが確認できる。

アセット

ISMSを設計する前に情報アセットを特定し、これらを保護するために必要なソリューションを技術面とコスト面から検討する必要がある。アセットは、業務の情報やプロセスなどを含む本質的な要素と、ハードウェアやソフトウェア、人員などを含む本質的な要素をサポートする要素の2つに大別される。

アセットの例

アセット名 アセットの所有者 アセットカテゴリ 依存関係 コスト
顧客向けアプリケーション eコマースチーム 必須 EC2, RDS…
AWS Direct Connect 最高情報責任者(CIO) ネットワーク ネットワーク運用, Direct Connect

これらのアセットを保護するために、情報セキュリティマネージメントシステム(ISMS) の実装、運用、モニタリング、確認、保守、改良に関する基準を定める必要がある。このとき、ビジネスニーズや目標、プロセス、組織の規模や構造などを考慮して基準を定める。ISMSの設計には、ISO27001 などの標準的なフレームワークを参考にすると良い。

段階 内容 詳細
1 スコープと境界の定義 スコープに含めるリージョン、AZ、リソース等を定義する。除外するリソースがある場合はその除外理由を明記する。
2 ISMSポリシーの定義 情報セキュリティの方向性と指針、法律や契約の要件、リスクの評価方法や承認方法
3 リスクの評価方法の選択 ビジネスニーズ、セキュリティ要件、IT機能と要件、法規制
4 リスクの特定 アセットとアセットに対する脅威を記した登録簿の作成、脆弱性とその結果
5 リスクの分析と評価
6 リスクへの対処 リスクを受け入れる、回避する、リスクレベルの査定
7 セキュリティコントロールフレームワークの選択 ISO 27002、NIST SP 800など
8 マネジメントによる承認の取得 残留リスクの報告と承認
9 適用宣言書の作成 選択したフレームワーク、導入済/予定のフレームワーク、除外したフレームワークとその理由

AWSアカウント

AWSアカウントは非常に強力な権限を有するので日常的な使用はせず、極力IAMユーザを使用する。またIAMユーザは、(特定のグループに所属するIAMユーザが1名だけであった場合でも)IAMグループを利用し、またきめ細やかに権限を付与し、タスクに必要な最小限のアクセス権限を付与する。また、AWSのアカウントは、セキュリティの観点から単一アカウントで処理する、開発ステージごとにアカウントを分割する、などビジネスやガバナンスの要件を満たすように設計することが必要である。AWSアカウントを複数有する場合は、一括請求アカウントを利用することで、管理の複雑さを低減し、スケールメリットを享受することができる。

アクセスキーを利用する場合は、定期的に更新を行う。また、IAMユーザの認証にはMFAの併用が望ましい。複数のAWSアカウントを横断的に利用する場合には、クロスアカウントアクセスの利用も検討する。社内に既にディレクトリサービスを有する場合には、IDフェデレーションの利用も可能である。EC2から他のAWSリソースを利用する場合はIAMロールを使用する。

データの保護

リソースへのアクセス保護

リソースへのアクセスは、各リソースを作成したユーザが他のユーザに対してアクセスを許可するリソースポリシーと、IAMユーザやIAMグループを使用して付与される機能ポリシーのいずれかを単独でもしくは組み合わせて使用する。

保管時のデータ保護

以下の課題を考慮して、データの保護を行う手法を検討する

  • 偶発的な情報開示や漏洩
  • データの不整合や不正な書き換え
  • 過失による削除
  • システム障害や災害に備えたシステムの可用性

S3におけるデータ保護

  • アクセス権限の付与
  • バージョニング
  • レプリケーション
  • バックアップ
  • サーバサイド暗号化
  • クライアントサイド暗号化

EBSにおけるデータ保護

  • レプリケーション
  • バックアップ(スナップショット)
  • 暗号化

RDSにおけるデータ保護

  • 暗号化関数の使用
  • アプリケーションレベルの暗号化

Glacierにおけるデータ保護

  • サーバサイド暗号化
  • クライアントサイド暗号化

DynamoDBにおけるデータ保護

  • Base64エンコード

EMRにおけるデータ保護

  • S3のサーバサイド暗号化
  • S3のクライアントサイド暗号化
  • アプリケーションレベルの暗号化

伝送中のデータ保護

以下の課題を考慮して、データの保護を行う手法を検討する

  • 偶発的な情報開示や漏洩
  • データの不整合や不正な書き換え
  • なりすましや中間者攻撃

伝送中のデータを保護するために、AWSではIPSecSSL/TSLをサポートしている。また、Remote Desktop Protocol(RDP)の使用やSSHの使用も有効である。

S3へ伝送中のデータ保護

  • SSL/TSLを用いた通信

RDSへ伝送中のデータ保護

  • SSL/TSLを用いた通信
  • X.509証明書

DynamoDBへ伝送中のデータ保護

  • HTTPSの利用

OSとアプリケーションのセキュリティ保護

OSとアプリケーションのセキュリティを保護するためには以下が奨励される。

  • ルートアクセスキーとシークレットキーの無効化
  • IPアドレスを限定したインスタンスへのアクセス
  • pemファイルのパスワード保護
  • ユーザの管理
  • 認証情報の更新
  • IAMユーザのアクセス権を定期的に管理

AMIを公開する場合は、認証情報をOS上から消去しておくなど、セキュリティ面には十分注意する。

万が一、OS等への侵入が確認された場合に、根本的な原因追求を行うためにフォレンジックを行う。

ブートストラッピング

PuppetやChefなどを利用してセキュリティプログラムの更新や、パッチの適用、ステージに合わせた環境設定の実行、リモートモニタリング等を実施する。

マルウェアからの保護

信頼できないAMIやコードは実行しない。また、信頼できないソフトウェアリポジトリも使用しない。ユーザに付与する権限は必要最小限とし、ウイルスおよびスパム対策ソリューションを必ず利用する。

その他の対策

  • ベンダー指定のデフォルト値を削除する
  • 不要なユーザを無効化する
  • EC2に複数の機能を持たせない
  • 必要なサービスやデーモンのみ有効化する
  • 不要な機能やWebサーバは無効化する

インフラの保護

インフラを保護するためには以下を行う。

VPCの利用

VPCを利用することで、AWSのパブリッククラウド内にプライベートクラウドを作成できる。他のAWSユーザからリソースを隔離できるということだけでなく、インターネットから隔離することもできる。また、IPSecやDirect Connectを利用することでオンプレミス拠点とAWS間をセキュアに接続することも可能である。

セキュリティグループやNACLを使用することで、セキュリティゾーニングを実現することができる。この際に、セキュリティゾーン間の通信を制御するかゾーン間の通信をモニタリングするかゾーンごとにアクセス権限を付与するか、などを検討する必要がある。

セキュリティのテスト

セキュリティコントロールとポリシーの有効性を定期的にレビューする。新しい脅威や脆弱性に対処するためには、外部脆弱性評価外部侵入テストアプリケーションとプラットフォームの内部グレー/ホワイトボックスレビューを行う。なお、侵入テストを行う場合には、AWSにリクエストが必要な場合がある。

メトリクスの管理と向上

有効性の測定を行う上では、メトリクスの利用が有効的である。

  • 手順のモニタリング
    • 処理結果からエラーを迅速に検出する
    • セキュリティ侵害やインシデントに迅速に対応する
    • セキュリティアクティビティが想定通りに実行されているか判断する
    • セキュリティイベントを検知してインシデントを防止する
    • 対処が効果的であったか判断する
  • ISMSの有効性のレビュー
    • セキュリティ監査、インシデント、有効性測定
    • 関係者からの提案およびフィードバック
    • ポリシーが目的に合っているかの確認
  • 有効性の測定
    • セキュリティ要件を満たしているかどうか
  • 定期的なリスク評価レビュー
    • 残留リスクの許容可能なリスクのレビュー
    • 法改定など外部イベントに適しているか
  • 内部監査
  • 定期的な管理レビュー
    • スコープが適切か
  • セキュリティ計画の更新

DoSおよびDDoS攻撃の緩和と保護

DoSおよびDDoSについて懸念がある場合には、AWSのサポートの契約が望ましい。サポートに契約することで、AWSがDoSおよびDDoS攻撃の事前および事後にサポートを提供できる。AWSは、トラフィックが攻撃によるものかは判断できないために、アクティブに対処することはしない。これらの攻撃に対処するためには、以下の手法を検討する。

  • セキュリティグループやNACLの使用
  • WAFの使用
  • レート制限
  • ハーフオープンセッションの制限

モニタリングと監査、インシデント対応

ログファイルを蓄積することで、適切なモニタリングとて監査、インシデント対応を行うことができる。

エリア 考慮事項
ログ収集 収集方法に注意する
ログ転送 ログファイルを安全、確実、タイムリーに転送する
ログストレージ 一元管理し分析を行う
ログ分類 分析に適した形式
ログ分析 ログファイル内のイベントを相互に関連付ける
ログの保護 改ざん等を防ぐ

AWS ElastiCache(1)ElastiCacheの概要

Elasticacheとは

完全マネージドなRedis および Memcached。インメモリデータストアのため非常に高速で、大量のデータを処理したり既存のシステムを効率化することができる。

インメモリデータストアの目的は、データのコピーに超高速で低コストなアクセスを提供することである。キャッシュするデータを決定するためには、データ自体とそのアクセスパターンを把握する必要がある。また、これらのキャッシュされたデータは最新データではないという認識が必要で、使用するアプリケーションの特性上、古いデータでも許容されるのかどうかについて考察が必要である。

Elasticacheは、RedisとMemcachedをサポートしているが、できるだけシンプルな構成が必要であったり、大きなノードを実行する場合は、Memcachedを選択すべきである。

キャッシュできるデータは、S3RDS, DynamoDB streamsなど。

クラスタとレプリケーション

ElastiCacheは、メモリの断片であるノードという単位から構成され、これらを1〜6台まとめたグループをシャードと呼ぶ。クラスタモードを有効化したRedisでは、1〜15のシャードで構成される。無効化されている場合は常に1シャードのみである。

Redisクラスタ

クラスタ構成を有効化する場合には、ノード数を2以上とし、マルチAZ構成とすることが望ましい。クラスタ構成とするとデータは、シャードごとに分散されて保存され、クラスタの一部に異常が発生した場合には、正常なノード(サービス)にマスターが自動で移動する。また、異常が発生したノード(サービス)は再構成される。

Redisレプリケーション

リードレプリカを使用することで、耐障害性が向上するとともに読み込み能力がスケールアウトする。Redisに異常が発生した場合は、DNSが切り替わり、新しいノードにマスターが移動する。

キャッシング戦略

Redisにおけるキャッシュ方法は以下が用意されている。

方法 内容 利点 欠点
遅延書き込み データがキャッシュにない、もしくは古い場合に追加 容量, 障害の影響 遅延, データの古さ
書き込みスルー データがデータベースに書き込まれると常にデータを追加 データが新しい ノード拡張時にデータが存在しない, 不要なキャッシュ
TTLの追加 有効期限を指定し、期限切れはデータがないものとして扱う