JavaScript基礎

JavaScriptとは

主にWebブラウザ上の中で動くプログラミング言語
また、Webブラウザだけでなく、Node.jsというサーバ側のアプリケーションを作る仕組みでも利用されている

JavaScriptECMAScriptという仕様によって動作が決められている
ECMAScriptという仕様ではどの実行環境でも共通な動作のみが定義されているため、基本的にどの実行環境でも同じ動作をする

JavaScriptの特徴

元々、Netscape Navigatorというブラウザのために開発されたプログラミング言語
C、Java、Self、Schemeなどのプログラミング言語の影響を受けて作られた

大部分がオブジェクトであり、そのオブジェクト同士のコミュニケーションによって成り立っている
オブジェクトには、ECMAScriptのしようとして定められたオブジェクト、実行環境が定義したオブジェクト、ユーザーの定義したオブジェクトが存在する

●大文字と小文字を区別する
予約語を持つ
●文はセミコロンで区切られる
●strict mode(古く安全でない構文や機能が一部禁止される、use strictという文字列をファイルまたは関数の先頭に書く)

構文

コメント

// 一行コメント

/**
 * 複数行コメント
 */

変数と宣言

const、let、varの3つがある
varはもっとも古くからある変数宣言のキーワードで意図しない動作を作りやすい問題からECMAScript2015で、varの問題を改善するためにconstとletという新しいキーワードが導入された

// constは再代入できない変数を宣言するキーワード
const bookTitle = "JavaScript";
bookTitle = "New";  // => TypeError: invalid assignment to const 'bookTitle'

// constは定数ではない
const object = {
  key: "New"
};
// オブジェクトそのものは変更できる
object.key = "New2";


// letは値の再代入が可能な変数を宣言できる
let bookTitle = "Javascript";

// letはconstと異なり初期値を指定しない変数も定義できる
let bookTitle;  // => undefinedという値になる

データ型

JavaScriptは動的型付け言語に分類される言語であるため、静的型付け言語のような変数の型はない
文字列、数値、真偽値といった値の型は存在する
これらの値の型のことをデータ型と呼ぶ

データ型には2種類存在する
1、プリミティブ型(基本型)
2、オブジェクト(複合型)

●プリミティブ型(基本型)
 プリミティブ型(基本型)は、真偽値や数値などの基本的な値の型のこと
 プリミティブ型の値は、一度作成したらその値自体を変更できないというイミュータブル(immutable)の特性を持つ
  真偽値(Boolean): trueまたはfalseのデータ型
  数値(Number): 42 や 3.14159 などの数値のデータ型
  巨大な整数(BigInt): ES2020から追加された9007199254740992nなどの任意精度の整数のデータ型
  文字列(String): "JavaScript" などの文字列のデータ型
  undefined: 値が未定義であることを意味するデータ型
  null: 値が存在しないことを意味するデータ型
  シンボル(Symbol): ES2015から追加された一意で不変な値のデータ型

●オブジェクト(複合型)
 オブジェクトは複数のプリミティブ型の値またはオブジェクトからなる集合
 オブジェクトは、一度作成した後もその値自体を変更できるためミュータブル(mutable)の特性を持つ
 
 ・プリミティブ型以外のデータ
  オブジェクト、配列、関数、正規表現、Dateなど
// typeof演算子でデータ型を調べることができる
console.log(typeof true);  // => boolean

リテラル

プリミティブ型の値や一部のオブジェクトはリテラルを使うことで簡単に定義できるようになっている
リテラルとはプログラム上で数値や文字列など、データ型の値を直接記述できるように構文として定義されたもの

// " と " で囲んだ範囲が文字列リテラル
const str = "Hello";

リテラル表現がない場合はその値を作る関数に引数を渡して作成する形になる
そのような冗長な表現を避ける方法としてよく利用される主要な値にはリテラルが用意されている

ダブルクォートとシングルクォート

// \' のように \(バックスラッシュ)を使いエスケープしなければならない
"8 o\'clock";  //  => "8 o'clock"

オブジェクトリテラル

// オブジェクトリテラルは{}を書くことで新しいオブジェクトを作成できる
const obj = {};  // 中身がからのオブジェクトを作成

// keyというキー名とvalueという値を持つオブジェクトを作成
const obj = {
  "key": "value"  // オブジェクトが持つキーのことをプロパティと呼ぶ。この場合、objというオブジェクトはkeyというプロパティを持っている
};

// ドット記法
console.log(obj.key); // => value

// ブラケット記法
console.log(obj["key"]); // => value

配列リテラル

// [ と ]で値をカンマ区切りで囲み、その値を持つArrayオブジェクトを作成
const emptyArray = [];  // 空の配列を作成
const array = [1, 2, 3];  // 値を持った配列を作成

正規表現リテラル

// 数値にマッチする特殊文字である\dを使い、1文字以上の数字にマッチする正規表現
const numberRegExp = /\d+/;

// numberRegExpの正規表現が文字列"123"にマッチするかをテスト
console.log(numberRegExp.test("123")); // => true

関数と宣言

// 仮引数に対応する引数が渡されていない場合に、デフォルトで代入される値を指定できる
function echo(x = "デフォルト値") {
    return x;
}

console.log(echo(1)); // => 1
console.log(echo()); // => "デフォルト値"

可変長引数

// Math.maxは可変長引数を受け取る関数で、受け取った引数の中で最大の数値を返す関数
const max = Math.max(1, 5, 10, 20);
console.log(max); // => 20

Rest parameters

Rest parametersは、仮引数名の前に...をつけた仮引数のことで、残余引数とも呼ばれる
Rest parametersには、関数に渡された値が配列として代入される

function fn(...args) {
    // argsは引数の値が順番に入った配列
    console.log(args); // => ["a", "b", "c"]
}
fn("a", "b", "c");

Arrow Function

// Arrow Functionを使った関数定義
const 関数名 = () => {
    // 関数を呼び出したときの処理
    // ...
    return 関数の返す値;
};

// 仮引数の数と定義
const fnA = () => { /* 仮引数がないとき */ };
const fnB = (x) => { /* 仮引数が1つのみのとき */ };
const fnC = x => { /* 仮引数が1つのみのときは()を省略可能 */ };
const fnD = (x, y) => { /* 仮引数が複数のとき */ };
// 値の返し方
// 次の2つの定義は同じ意味となる
const mulA = x => { return x * x; }; // ブロックの中でreturn
const mulB = x => x * x;            // 1行のみの場合はreturnとブロックを省略できる

コールバック関数

関数はファーストクラスであるため、その場で作った匿名関数を関数の引数(値)として渡すことができる 引数として渡される関数のことをコールバック関数と呼ぶ 一方、コールバック関数を引数として使う関数やメソッドのことを高階関数と呼ぶ

function 高階関数(コールバック関数) {
    コールバック関数();
}

const array = [1, 2, 3];
array.forEach((value) => {
    console.log(value);
});
// 1 2 3

メソッド

const obj = {
    method1: function() {
        // `function`キーワードでのメソッド
    },
    method2: () => {
        // Arrow Functionでのメソッド
    }
};

const obj = {
    method: function() {
        return "this is method";
    }
};
console.log(obj.method()); // => "this is method"

// メソッドの短縮記法
const obj = {
    method() {
        return "this is method";
    }
};
console.log(obj.method()); // => "this is method"
/**
 * const, letなどの変数宣言
 */
// var val1 = "var変数";
// console.log(val1);

// // var変数は上書き可能
// val1 = "var変数を上書き";
// console.log(val1);

// // var変数は再宣言可能
// var val1 = "var変数を再宣言";
// console.log(val1);

// let val2 = "let変数";
// console.log(val2);

// // letは上書きが可能
// val2 = "let変数を上書き";
// console.log(val2);

// // letは再宣言不可能
// let val2 = "let変数を再宣言";

// const val3 = "const変数";
// console.log(val3);

// // const変数は上書き不可
// val3 = "const変数を上書き";

// const val3 = "const変数を再宣言";

// constで定義したオブジェクトはプロパティの変更が可能
const val4 = {
  name: "test",
  age: 28,
};
val4.name = "taro";
val4.address = "JAPAN";
console.log(val4);

// constで定義した配列はプロパティの変更が可能
const val5 = ['dog', 'cat'];
val5[0] = "bird";
val5.push("monkey");
console.log(val5);

AWS メモ

インスタンスメタデータ
 実行中のインスタンスを構成または管理するために
 使用できるインスタンスに関するデータ

 インスタンスメタデータは、ホスト名・イベント
 及びセキュリティグループなどのカテゴリに割り当てられる

 これを利用してインスタンスの構成情報などの基本情報を
 取得するなどできるため自動化プロセス設定には利用されない


●T3インスタンス

 ベースラインレベルのCPUパフォーマンスを提供する
 次世代のバースト可能な汎用インスタンスタイプで
 いつでも必要な時間だけCPU利用率をバーストさせることが可能

 T3インスタンスはバランスのとれたコンピューティング、
 メモリ及びネットワークのリソースを提供し、
 使用中に一時的なスパイクが生じる中程度の
 CPU使用率を持つアプリケーション向けに設計されている


●G4インスタンス

 業界内で最も費用対効果の高いGPUインスタンス

 機械学習モデルの本番環境へのデプロイや
 グラフィックスを多用するアプリケーションに適している

 高機能だがT2及びT3インスタンスよりも高価なため
 コスト最適なインスタンスではなく、
 また機械学習やゲーミングで利用するインスタンスタイプである


●A1インスタンス

 包括的なArmエコシステムによりサポートされる
 スケールアウト型のArmベースのワークロードに
 最適で大幅なコスト削減を実現できる

 A1インスタンスAWS Gravitonプロセッサで
 動作する初のEC2インスタンス

 このプロセッサには64ビットのArm Neoverseコアと
 AWSが設計したカスタムシリコンタイプでありコスト最適化ではない


●M5インスタンス

 Intel Xeon_Platinum 8175Mプロセッサを搭載した
 最新世代の汎用インスタンス

 このファミリーはバランスのとれたコンピューティング、
 メモリ、及びネットワークのリソースを提供し多くのアプリケーションに適している

 T2及びT3インスタンスと異なり、バースト性能がないため
 CPU使用率の上昇に対しても一定のパフォーマンスを
 保証できるインスタンスタイプという要件には合致しない


AWS Artifact

 AWSとの契約やコンプライアンスなどに関わる情報を
 一元管理することができるサービス

 ユーザーとの契約にかかる文章のほか、
 AWS独自のコンプライアンス対応に関するレポートが提供される

 AWS Artifactでは、AWSのセキュリティ及び
 コンプライアンスレポートと特定のオンライン契約にオンデマンドでアクセスできる

 Service Organization Control(SOC)、Payment Card Industry(PCI)レポート、
 AWSセキュリティ制御の実装と運用の有効性を検証する
 様々な地域やコンプライアンス垂直市場の認定機関からの認定が含まれる

 事業提携契約(BAA)と機密保持契約(NDA)を管理することができる

 AWSコンプライアンスレポートへの
 オンデマンドアクセス用のセルフサービスポータルである
 AWS Artificatを使用することにより
 PCI DSSコンプライアンス証明(AOC)及び責任概要を利用できる


AWS Config

 AWSリソースの認定を評価・監査・審査できるサービス

 ConfigにはAWSリソースの設定が継続的にモニタリング及び記録され、
 望まれる設定に対する評価を自動的に実行できる

 Payment Card Industry(PCI)レポートに基づいた情報提供はされない


Amazon Macie

 機械学習を使用しAWSの機密データを自動的に検出、
 分類、保護するセキュリティサービス


●SpilloverCount

 ELB上でEC2インスタンスにルーティングされている
 HTTPリスナーとTCPリスナーのリクエスト失敗状況を確認できる


●RequestCount

 指定された間隔(1分または5分)の間に完了した
 リクエスト数、または接続の数を取得する

 完了したリクエストでは失敗状況の判断はできない


●UnHealthyHostCount

 ロードバランサーに登録された異常なインスタンス数を取得する
 インスタンスはヘルスチェックに対して構成された
 異常な閾値を超えると異常な状態とみなしてくれる
 異常なインスタンスはヘルスチェックに設定されている状態の
 閾値を満たせば再び正常な状態とみなされる
 ヘルスチェック結果としての異常なインスタンスを検知することができるが、
 リクエストの失敗状況に関する情報を取得することができない


●SurgeQueueLength

 異常なインスタンスへのルーティングを
 保留中のリクエスト(HTTPリスナー)または接続(TCPリスナー)の合計数


AWS Systems Manager Automation

 EC2インスタンス及び他のAWSリソースの
 一般的なメンテナンスとデプロイに関する運用タスクを自動化することが可能

 その際に自動化ワークフローを構築しインスタンス及びAWSリソースを設定する

 独自のカスタムワークフローを作成するかAWSの定義済みのワークフローを使用することが可能


●IDS / IPS

 不正侵入検知(IDS)、不正侵入制御(IPS)


●Palo Alto Networks

 全てのVPC上にある悪意のあるトラフィック通信を監視、フィルタリングする


AWS Shield Advanced

 アプリケーションを標的とした攻撃に対する高レベルな保護に使用する

 Standard版は高度な保護には不十分


Amazon GuardDuty

 AWSアカウントとワークロードを継続的にモニタリングし、
 悪意のあるアクティビティや不正なアクティビティから保護する


AWS Systems Manager Patch Manager

 セキュリティ関連のアップデート及びその他のタイプのアップデートの両方に関して、
 インスタンスへのパッチ適用プロセスを自動化する

 Patch Managerを使用してオペレーティングシステム
 アプリケーションの両方にパッチを適用することができる

 AWS Systems Manager Patch Managerを使用することで、
 EC2インスタンスのフリート全体のOSのセキュリティパッチの適用を
 スケジューリングして自動実行することが可能となる


AWS Batch

 AWSクラウドでバッチコンピューティングワークロードを実行できる

 OSパッチの管理にはAWS Systems Manager Patch Managerを利用する


●EC2Rescue

 EC2のWindowsインスタンスへの接続に失敗した場合や、
 起動上のトラブルが発生した場合にトラブルの分析に利用するログ収集をなどを実施する


AWS SAM(Serverless Application Model)

 サーバーレスアプリケーション構築用のオープンソースフレームワーク

 Lambda関数などのサーバーレスアプリケーションをデプロイする際に利用される

 その際の実行環境はCloudFormationに依存しており
 CloudFormationテンプレート内にSAMの設定を実施しデプロイを実行する


●AWSTrustedAdvisor

 AWSインフラストラクチャサービスを監視し、既知のベストプラクティスと
 比較し節約やシステムパフォーマンス、セキュリティの観点からチェックをしてくれるプログラム

 これを利用し、ユーザーが利用するAWSリソース構成のセキュリティ対応状況をベストプラクティスと比較してくれる


TCO計算ツール

 AWS移行した際の利用コストを試算することができ、
 オンプレミス環境やその他の費用比較が可能となる

 また、総コスト計算ツールでは、ビジネスニーズを最適に
 満たすように家庭を変更することもできる

 あくまで見積もりツール


AWS Health

 AWSのリソース、サービス、およびアカウントの状態をリアルタイムで可視化する

 このサービスでは、AWSで実行されるアプリケーションに影響を与えている
 リソースのパフォーマンスや可用性の問題の把握と修復のガイダンスを提供する


Amazon CloudSearch

 AWSクラウドで完全に管理された検索サービス

 高速で非常に拡張性の高い検索機能をアプリケーションに容易に統合できる


Amazon Inspector

 EC2インスタンスにおける通信の詳細、安全なチャンネルの使用、
 実行中のプロセスの詳細、実行中のネットワークトラフィックなどのデータを収集して評価レポートを作成することが可能

 自動化されたセキュリティ評価サービスで、AWSにデプロイしたアプリケーションの
 セキュリティとコンプライアンスを向上させることができる

 自動的にアプリケーションを評価し、露出、脆弱性、ベストプラクティスからの逸脱がないかどうかを確認できる

 評価結果は詳細なリストがAmazon Inspectorによって作成される

 この調査結果は直接確認することもできるがAmazon Inspectorコンソール
 またはAPIを介して入手可能な詳細な評価レポートで確認できる


Amazon Cognito

 ウェブアプリケーションおよびモバイルアプリに素早く簡単にユーザーの
 サインアップ/サインインおよびアクセスコントロール機能を追加できる

 Amazon Cognitoは、数百万人のユーザーにスケールし、FacebookGoogle
 AmazonなどのソーシャルIDプロバイダー、およびSAML2.0による
 エンタープライズIDプロバイダーを使用したサインインをサポートする

 フェデレーションIDプロバイダー用の組み込みUIと簡単な設定を使用すれば
 数分でAmazon Cognitoを統合して、アプリケーションにサインイン、
 サインアップ、アクセスコントロール機能を追加できる


AWS Config

 AWSリソースに対してカスタムまたは管理されたルールを評価して通知することができる

 これは、リソースが定義したカスタムルールに準拠していることを確認する場合にも利用できる

 さらに、AWS ConfigにSNSトピックを連携すればSNSを利用した通知設定が可能

 例えば、リソースが更新されるとメール通知が実施され、変更内容が表示できる


●cfn-signalヘルパースクリプト

 AWS CloudFormationに信号を送り、EC2インスタンスが正常に作成魔tは更新されたかどうかを示す

 つまり、cfn-signalヘルパースクリプトの信号を確認し、
 直前のタスクが終了したのを確認した上で、次のリソース設定を始めることが可能となる


AWS::AutoScaling::AutoScalingGroupリソース

 UpdatePolicy属性を使用し、AWS CloudFormationスタックが
 更新されるときのAutoScalingグループリソースの更新方法を定義する

 UpdatePolicy属性が正しく設定されていない場合、ローリング更新によって
 予期しない結果が生成される可能性がある

 AWS CloudFormationがAutoScalingグループのローリング更新を処理する方法は
 AutoScalingRolingUpdateポリシーを使用して制御できる

 この共通的なアプローチでは同じAutoScalingグループを保持し、
 設定したパラメータに基づいて古いインスタンスの置き換えを行う


AWS Systems Managerパラメータストア

 設定データ管理と機密管理のための安全な階層型ストレージを提供する

 パスワード、データベース文字列、ライセンスコードなどの
 データをパラメータ値として保存することができる

 値は、プレーンテキストまたは暗号テキストとして保存できる

 これをCloudFormationテンプレートのパラメーターストアセクションで設定することで
 Systems Managerのパブリックパラメータストアを参照して最新AMIを引っ張ってくることができる

 テンプレートやパラメータなど何も変更せずにCloudFormationスタックを更新するだけで
 リソースの要件に応じてその時点でサイン真のAMIIDに更新される


●set-load-balancer-listener-ssl-certificateコマンド

 証明書を設定する


AWS Server Migration Service(SMS)  数千のオンプレミスワークロードを従来よりも簡単に、かつ短時間でAWSに移行できるエージェントレスサービス  AWS SMSではライブサーバーボリュームの増分レプリケーションの自動化、スケージュール設定、および追跡が可能なため大規模なサーバーの移行作業を簡単に調整できる

●認証情報レポート  IAMユーザーが最後にAWSサービスにアクセスした日付と時刻を表示する機能を提供する  アカウントの全てのユーザーとユーザーの各種認証情報(パスワード、アクセスキー、MFAデバイスなど)のステータスが表示された認証情報レポートを生成する

AWS Picing Calculator  アーキテクチャソリューションのコストを見積もるサービス

●パワーユーザー  管理者権限以外のあらゆるAWSリソースに対する権限を有したユーザーのこと

AWS X-Ray  リクエスト動作の確認、アプリケーションの問題の検出、アプリケーションのパフォーマンスの向上

パーティションプレイスメントグループ  HDFS、HBase、Cassandraなどの大規模な分散および複製ワークロードを行うラック間ででプライスるために使用できる

Oracle RAC(Real Application Clusters)  複数のサーバーで1つのデータベースを構成するOracleクラスタ環境構成  アクティブ・アクティブで構成されるデータベース構成をとるため、サーバリソースを100%活用できることができる  RDS OracleデータベースエンジンではRAC構成を使用することができない


メモ
・ICMP(Internet Control Message Protocol)

・RDP(Remote Desktop Protocol)

AWSでは第三者に一時的なアクセス権限を付与する際は、IAMロールを利用することが推奨されている  IAMユーザーは一時的に利用するものではない

・RDSの自動バックアップを実施すると、S3にスナップショットを取ることでバックアップを迅速に復元しトランザクションログは5分ごとにS3に保存されるため、アプリケーションを15分というRPO以内の状態に復元することが可能

・EFSにはファイルロック機能はあるが、ファイルバージョン管理機能はない

RAID1はRTO1分以内の回復が可能

AWSリソースの更新状況を保持しておくサービスはAWS Config、CloudTrailはAWSリソースの更新状況は保持できない

・ELBにCloudWatchメトリクスを適用すると、読み取りリクエスト量と待ち時間などロードバランサーとターゲットのデータポイントに関する統計情報をメトリクスとして取得できる。これらのメトリクスを使用してシステムが正常に実行されていることを確認できる

・プロキシサーバーにより、クライアントからの要求をフィルターし製品の更新に関連する要求のみを許可して製品の更新以外の全ての要求をフィルタリングすることができる(ネットワークACLおよびセキュリティグループはURLに基づいてリクエストをフィルタリングすることができない)

・CloudWatch Eventのターゲットとして設定できるサービス  EC2、Lambda関数、Kinesis Data Stream、Kinesis Data Firehoseの配信ストリーム、ECSタスク、Systems Manager Run Command、Systems Manager オートメーション、Batchジョブ、Step Functionステートマシン、CodePipelineの倍プライン、Code Buildプロジェクト、Inspectorの評価テンプレート、SNSのトピック、SQSキュー、EC2 CreateSnapshot API call、EC2 Rebootlnstances API call、EC2 StopInstances API call、およびEC2 TerminateInstances API Call、別のAWSアカウントのデフォルトのイベントパス

・アプリケーションエラーに関連するキーワードをCloudWatchログを調べることで確認し、そのキーワードに基づいてカスタムメトリックを作成できる。さらに、そのキーワードに関するイベントをトリガーとしてEC2インスタンスを再起動するアクションを作成し、そのアクションを呼び出すカスタムメトリクスのCloudWatchアラームを設定できる

・CloudWatchアラームアクションを使用し、EC2インスタンスを自動的に停止、終了、再起動または回復するアラームを作成できる  このアラームを利用して、インスタンスを実行する必要がなくなった際に停止または終了アクションを使用できる

・CloudTrailログファイルの整合性の検証を使用することでCloudTrailによるログ配信後にそのログファイルが変更、削除、または変更されなかったどうかを判断することができる

・RedsiftはRDSと異なり、マルチAZ構成によるフェールオーバー機能がないため冗長性が低いデータベース  シングルAZ構成しか実行できないため、Redshiftはスナップショットを利用しローカルおよびリモートの量リージョンでデータをセキュアにバックアップすることが最良のソリューション

DHCP(Dynamic Host Configuration Protocol)  TCP/IPネットワークのホストに設定情報を渡すための規格  DHCPメッセージのoptionsフィールドの内容は設定パラメータ  パラーメータにはドメイン名、ドメインネームサーバー、netbios-node-typeなどがある  DHCPオプションセットでは、VPC上で利用できるDHCPオプションで必要なオプションのみ指定できる

・カスタムメトリクスを使用する場合はPutMetricData権限が必要  PutMetricDataがカスタムメトリクスを呼び出すとアプリケーションの1分未満のアクティビティをより短期間に把握できる

LDAPActive Directoryとのデータ読み書きに使用される標準的な通信プロトコル

・CloudFormationテンプレートにおけるCreationPolicy属性のResourceSignalパラメーターで、30分のTimeoutプロパティを追加することで、前提条件となるAWSリソースが起動されるまでのタイムアウト時間を設定することができる

Go echo

go mod の作成

go mod というファイルでパッケージ管理(外部ライブラリの管理)を行う

go mod init プロジェクト名
go mod init $(basename `pwd`)

※basename pwdでカレントディレクトリの取得

echo

軽量なWebフレームワーク

package main

import (
  "net/http"
  
  "github.com/labstack/echo"
  "github.com/labstack/echo/middleware"
)

var e = createMux()

func main() {
  e.GET("/", articleIndex)
  e.Logger.Fatal(e.Start(":8080"))
}

func createMux() *echo.Echo {
  // Echoのインスタンス作成
  e := echo.New()

  // 各種ミドルウェアを設定
  e.Use(middleware.Recover())
  e.Use(middleware.Logger())
  e.Use(middleware.Gzip())

  return e
}

func articleIndex(c echo.Context) error {
  return c.String(http.StatusOK, "Hello, World!")
}
var e = createMax()

Goプログラム(パッケージ)を実行した際は、依存パッケージの読み込み > グローバル定数 > グローバル変数 > init() > main() の順に実行(判定)されてく そのため、main()とinit()よりも先に上記のグローバル変数の部分が処理され、createMux()関数が呼び出される 上記のソースコードはmainパッケージのグローバル変数であるeにcreateMux()関数の戻り値を格納している箇所

パッケージの依存関係の管理

外部パッケージであるechoを利用するため、プログラムを起動する際にはechoのソースコードも必要 こうした外部パッケージを管理する手段として、Goではgo modコマンドが準備されている

go mod tidy

上記のコマンドは、ソースコードを検査して、どのような外部パッケージを利用しているのかを判定する ソースコード内で利用されている外部パッケージはgo.modとgo.sumというファイルに書き出される 直接的に利用しているパッケージはgo.modに間接的に利用しているパッケージはgo.sumに記載される go mod tidyコマンドで依存パッケージの書き出しが完了した後、外部パッケージのソースコードをPCにダウンロード(キャッシュ)する

go mod download

ダウンロードされた外部パッケージのソースコードは$HOME/go/pkg/modに配置される

セキュリティと運用について

セキュリティの確保

Security:セキュリティ

AWS内のデータ/システム/アセットを保護しモニタリングによりセキュリティを高める

【設計事項】

◾️全てのレイヤーでのセキュリティを適用

◾️アクセス追跡、モニタリングの確実な実施

◾️条件ドリブンのアラートをトリガーとしてセキュリティイベントへの応答を自動化

◾️AWS責任共有モデルに基づく対象範囲の保護に集中する

◾️セキュリティのベストプラクティスの自動化

 ・ソフトウェアベースのセキュリティ設定を使用し、

  迅速でコスト効率のいいスケーリングを安全に実行する

 ・仮想サーバーのカスタムベースラインイメージによる新サーバーへの適用自動化

 ・インフラストラクチャ全体のテンプレ化による管理

セキュリティの主要サービス

◾️データ保護  ELB、EBS、S3、RDS、KMS

◾️権限管理  IAM、MFA

◾️インフラ保護  VPC

◾️検出制御  Cloud Trail、CloudWatch、AWSGuardDuty、AmazonInspector

データ保護:暗号化

多くのDBサービスはKMSと統合されており、暗号化を容易に実施できる CloudHSMは不正使用防止策が取られている専用HWモジュール(HSM)により暗号キーを保護するサービス 厳しい暗号化要件に対応するために利用

S3はデータ保護のためにAWS認証情報によるアクセス制御と暗号化を実施 ◾️サーバーサイド暗号化  ・AWSのサーバーリソースを利用して格納データの暗号化を実施  ・暗号化タイプ:SSE-S3 / SSE-KMS / SSE-C

◾️クライアントサイド暗号化  ・暗号化プロセスをユーザー側で管理する  ・暗号化タイプ   AWS KMSで管理されたカスタマーキーで暗号化   クライアントが管理するマスターキーで暗号化

RDSはセキュリティグループによる制御とデータ接続の暗号化とリソースの暗号化を実施 ◾️セキュリティグループ  ・DBのSGでDBインスタンスへのアクセス制御  ・VPCのSGでVPC内のインスタンスへのアクセス制御  ・EC2のSGでEC2インスタンスへのアクセス制御

◾️データ接続の暗号化  ・SSL / TLSを用いてアプリケーションとDBインスタンス間のデータ接続を暗号化

◾️リソースの暗号化  ・暗号化オプションにより保管データを暗号化

責任共有モデル

セキュリティに対してAWSとユーザーとで責任分界して対応する責任共有モデルとなっている

ユーザー側の責任範囲 ・IAMによるアカウント管理 ・セキュリティグループの設定 ・アプリケーションのロールベースのアクセス設定 ・ネットワーク / インスタンスオペレーションシステム(バッチ)などの設定 ・OS / ホストベースのファイアーウォール設置

権限管理:AWS Directory Service

ディレクトリサービスとはユーザーに関わる各種情報を保管してユーザー認証を実現する仕組み

◾️管理するユーザー情報  ・ID、ユーザー名、名字氏名、部署、グループ、担当、電話番号、メールアドレス、パスワード

◾️実現する機能  ・IDとアクセス管理   運用効率の向上、コンプライアンス向上、セキュリティの強化など

 ・アプリのアクセス制御   ファイル共有   パッチ管理など

AWSに新しいディレクトリを作成するか、既存のActiceDirectory認証を利用した制御を実現 ◾️Simple AD  AWSに新規ディレクトリを作成

◾️AD Connector  既存のディレクトリをAWSに接続

権限管理:Security Token Service(STS

STSは限定的で一時的なセキュリティ認証情報を提供するサービス

権限管理:Amazon Cognito

シンプルでセキュアなユーザーのサインアップ、サインイン、およびアクセスコントロールをアプリケーションに実装

サブネットの分割

サブネットはインターネットアクセス範囲を定義するために利用する

◾️パブリックサブネット  ・インターネットと接続が必要なリソースを揃える  ・インターネットとのアクセス制御に利用する

◾️プライベートサブネット  ・インターネットから隔離することでセキュリティを高める

VPCアクセス制御

VPCはセキュリティグループとネットワークACLで制御する ◾️セキュリティグループ  ・インスタンス単位で制御  ・ステートフル

◾️ネットワークACL  ・サブネット単位  ・ステートレス

検出制御

監視やモニタリングを継続的に実施してセキュリティを高める

◾️CloudTrail  AWSユーザーの行動ログを取得し、ガバナンス・コンプライアンス、および運用とリスクの監視を行えるように支援する

◾️CloudWatch  AWSリソースとAWSで実行するアプリケーションに対して、様々なメトリクスやログを収集、追跡するモニタリングサービス

◾️AWSGuardDuty  AWS上で悪意のある操作や不正な動作を継続的にモニタリングする脅威検出サービス

◾️Amazon Inspector  自動的にアプリケーションを検証し、その露出・脆弱性・ベストプラクティスからの逸脱状況を確認し、セキュリティ評価を実施するサービス

監視やモニタリングを継続的に実施してセキュリティを高める ◾️AWS WAF  可用性、セキュリティ侵害、リソースの過剰消費といった一般的なウェブの脆弱性からウェブアプリケーションまたはAPIを保護するウェブアプリケーションファイアウォール

◾️AWS Shield  マネージド型の分散サービス妨害(DDoS)に対する保護サービス、AWS Shieldにはスタンダードとアドバンストの2つの階層があり、サポート範囲が異なる

◾️IAM Access Analyzer  外部エンティティと共有されているAmazon S3バケットやIAMロールなど組織とアカウントのリソースを識別し、セキュリティ上のリスクであるリソースとデータへの意図しないアクセスを特定

◾️AWS Security Hub  セキュリティアラートを一元的に表示して管理し、コンプライアンスチェックを自動化  監査結果から修正すべき設定の数と現在のセキュリティ状態が把握する

AWS KMS

簡単にデータを暗号化するためのマネージド型暗号化サービス

・暗号鍵の作成、管理、運用を実施するマネージドサービスでAWSマネジメントコンソール、AWSSDKまたはCLIを使用してキーを作成、インポート、ローテーション、削除、管理する ・IAMと連携して鍵のアクセス管理を実施 ・カスタマーマスターキー(CMS)の無効化・有効化・削除を実施し、1年ごとの自動キーローテーションすることが可能 ・CMKを外部から持ち込んで管理することも可能 ・キーを保護するためにFIPS140-2の検証済みまたは検証段階のハードウェアセキュリティモジュールを使用 ・AWSCloudTrailと統合されており、全てのキーの使用ログを表示 ・RDSやS3などの多数のAWSサービスに適用可能 ・KMS SDKを利用することで、アプリケーションにおける暗号化も可能

AWS KMS

RDSでは保存されるデータ・リソースの暗号化と接続の暗号化を実施可能 ◾️カスタマーマスターキー  ・暗号化を実行する上で最初に作成されるマスターキー  ・暗号化キーを暗号化する  ・ローテーションされる

◾️カスタマーデータキー(暗号キー)  ・実際のデータの暗号化に利用するキー  ・KMSで生成されてCMKで暗号化される

◾️エンベローブ暗号化  ・マスターキーで暗号化をせずに、暗号化したデータキーを利用して暗号化する暗号化方式

エンベローブ暗号化

AWS KMSは簡単にデータを暗号化するためのマネージド型暗号化サービス ・データキーとマスターキーによる暗号化を実施 ・カスタマーマスタキー(CMK)を利用してデータキーを暗号化する

AWS Certificate Manage

Secure Sockets Layer / Transport Layer Sercurity(SSL / TLS)証明書のプロビジョニング、管理、デプロイを実施

コスト最適化

Cost Optimization:コスト最適化 不要なリソースを削減し、最適な料金選択によりコストを最適化すること

【設計事項】 ・不必要なリソース削減 ・透明性のある費用賊課 ・マネージド型サービスの利用によるコスト削減 ・スケールによるコストメリット ・データセンターへの投資不要化

コスト最適化主要サービス

◾️需要と供給の一致  AutoScaling

◾️コスト効率の高いリソース  EC2購入方式、TrustedAdvisor

◾️支出の認識  CloudWatch、見積もりツール

◾️継続した最適化  AWS最新情報、TrustedAdvisor

AWSを安く使う

最もシンプルで一番最初にやるべきコスト最適化は無料枠利用の最大利用と最適な料金オプションの選択

AWSの課金方式

AWSは利用料に応じた柔軟な価格設定となっている

◾️従量課金  従量課金による利用料に応じた価格設定が基本

◾️予約による低価格  EC2などの特定のサービスにはリザーブド価格(予約による低価格販売)が実施されている

◾️使うほど安い  AWSではボリュームディスカウントを受けることができ、使用量が増えるほど節約できる

AWSの料金設定

他のクラウドサービスとの競争のために頻繁に料金改定がなされるため利用毎に料金表を確認することが基本

EC2の購入オプション

EC2の購入オプションは利用形態や利用期間などに応じて多岐にわたるため、コスト最適な選択をすることが重要 ◾️オンデマンドインスタンス ◾️スポットインスタンス ◾️リザーブインスタンス ◾️ハードウェア専有インスタンス ◾️DedicatedHost ◾️ベアメタル

EC2のリサーブドインスタンス

利用期間を長期指定して利用する形式で、オンデマンドに比較して最大75%割安になる ◾️利用期間  ・スタンダード   1年40%割引   3年60%割引

 ・コンバーティブル   1年31%割引   3年54%割引

◾️AZ / インスタンスサイズ / ネットワークタイプ変更可否  ・スタンダード   有

 ・コンバーティブル   有

◾️インスタンスファミリー / OS / テナンシー / 支払オプションの変更可否  ・スタンダード   なし

 ・コンバーティブル   有

◾️リザーブインスタンスマーケットプレイスでの販売可否  ・スタンダード   可能

 ・コンバーティブル   今後となる可能

◾️ユースケース  ・一定した状態または使用量が予測可能なワークロード  ・災害対策などキャパシティ予約が可能なアプリケーション

EC2のスポットインスタンス

予備のコンピューティング容量を、オンデマンドインスタンスに比べて割引(最大90%引)で利用できるEC2インスタンス

◾️予備用を入札式で利用するためとても安い(最大90%引き) ◾️軌道に通常よりも少し時間がかかる ◾️予備用のため途中で削除される可能性がある  →一時的な拡張などの用途で利用

物理的対応可能なインスタンス

物理サーバーにインスタンスを起動して制御が可能なタイプのインスタンス ◾️ハードウェア専有インスタンス  ・専用HWのVPCで実行されるEC2インスタンス  ・ホストHWのレベルで他のAWSアカウントに属するインスタンスから物理的に分離する  ・同じAWSアカウントのインスタンスとはHWを共有する可能性がある

◾️Dedicated Host  ・EC2インスタンス容量を完全にお客様専用として利用できる物理サーバー  ・サーバーにバインドされた既存のソフトウェアライセンスを利用可能

◾️Bare Metal  ・アプリケーションは基盤となるサーバーのプロセッサーとメモリーに直接アクセス可能なインスタンス  ・AWS各種サービスとの連携が可能でOSが直接下層のハードウェアにアクセス可能

AWS Organizationによる一括請求

AWSOrganizationsの一括請求で、メンバーアカウント間でリザーブインスタンスを共有化したり、S3などの利用量に応じた課金がお得になる

◾️ボリュームディスカウント適用  ・S3などボリューム料金階層があるサービスの場合、多く利用するほど価格が低くなると   一括請求で複数アカウントをまとめてボリューム料金に統合することでコスト削減が可能

◾️リザーブインスタンスの共有  一定の条件においてメンバーアカウント間で購入したリザーブインスタンスが共有される  ・AWS Organizationsで有効か  ・同じAZ内に購入する  ・同じインスタンスタイプである

Saving Plan

1〜3年の期間に一定の使用量を守ることによりコストを削減 ・リザーブインスタンスと同様に1年または3年の期間に特定の量の処理能力(USD / 時間で測定)を使用する契約を結ぶことで適用される割引契約 ・AWSコンピューティング使用料金を最大72%節約できる ・AmazonEC2、AWSFargate、AWSLambdaに適用可能

価格算定ツールを利用する

AWS公式ツールを利用して見積もりや価格比較を実施する ◾️簡易見積もりツール  利用するAWSサービスに対する月額料金を見積もることができます

◾️TCO計算ツール  AWS利用した場合とオンプレミス環境やコロケーション環境との価格比較ができます

◾️PricingCalCulator  ビジネスや個人のニーズに沿った個別の予測コスト見積もりを実施することができます

コストの可視化

CloudWatchのbilling機能により請求額通知を可能とし、TrustedAdvisorからアドバイスをもらう

Trusted Advisor

コスト最適化とセキュリティと耐障害性とパフォーマンス向上についてアドバイスを提供するサービス ・コスト最適化 ・セキュリティ ・耐障害性 ・パフォーマンス向上

運用上の優秀性

Operational Excellecnce:運用上の優秀性 運用の優秀性とは計画変更が起こった場合や予期せぬイベントの発生時において、自動化された運用実務および文書化されテストされレビューされた手順があること

・コード化された運用実行(環境自動化) ・ビジネス目的に沿った運用手順 ・定期的かつ小規模で増加的な変更管理 ・予期せぬイベントへの対応テストの実施 ・モニタリングにより障害を予測する ・運用上の失敗やイベントから学習する ・運用手順を繰り返しアップデートする

運用上の優秀性の主要サービス

◾️準備  CloudFormation、Codeシリーズ、RunbookPlaybook

◾️運用  SystemManager、ServiceCatalog、CloudTrail、AWSArtifact、AWSGuardDuty、CloudWatch、AWSConfig、APIGateway

◾️進化  継続的かつ段階的な改善のために時間とリソースを割り当て、運用の有効性と効率性を向上させる

AWS CloudTrail

AWSユーザーの操作(API操作やユーザーのサインインアクティビティ)をロギングするサービス

・ルートアカウント / IAMユーザーのオペレーションとトラッキング ・CloudTrailログファイルは暗号化されてS3に保存 ・KMSによる暗号化もサポート

AWS Config

AWSリソースのレポジトリ情報からリソース変更履歴や構成変更を管理するサービス ・定期的に構成情報のスナップショットをS3に保存 ・構成情報に基づきシステム構成があるべき状態担っているかを評価 ・評価基準にはAWSルールまたは独自ルールを適用

AWS Configには構成変更を管理するストリームと履歴管理するヒストリーと構成要素を保存するスナップショットがある ◾️ConfigraionStream  ・リソースが作成、変更、削除に対して作成され、構成ストリームに追加される  ・SNSトピック連携して通知設定が可能

◾️ConfigurationHistory  ・任意の期間における各リソースタイプの構成要素を履歴として蓄積  ・S3バケットに保存

◾️ConfigurationSnapshot  ・ある時点での構成要素の集合  ・自動で定期的あるいは変更トリガで作成  ・S3バケットに保存

AWS Service Catalog

AWSで承認されたITサービスのカタログを作成するおよび管理する支援サービス ◾️IT運用管理者 ・CloudFormationのテンプレートを利用して、管理されるAWSリソース定義や、これらの利用権限をカタログとして一元管理する構成を提供

◾️ユーザ部門 ・IT運用管理者が作成したカタログにより、権限がなくとも求める機能に応じたAWS環境を必要に応じて起動が可能になる

AWS Artifact

重要なコンプライアンス関連情報の頼りになる一元管理型のリソース ◾️AWS Artifact Reports  世界各地にある監査機関の指定する基準や規制を遵守状況をテストおよび確認したコンプライアンスレポートを提供

◾️AWS Artifact Agreements  AWSアカウントとの契約の確認、受託、管理を実施

AWS GuardDuty

VPCフローログ、CloudTrailログ、DNSログや悪意のあるIPやドメインリストなどを分析して処理する継続的なセキュリティモニタリングサービス

AWS Systems Manager

利用中のAWSサービスやリソースをモニタリングして、運用タスクを自動化するサービス ◾️問題検出の時間短縮  EC2などのをリソースグループごとに運用データを確認できるため、アプリケーションに影響を与えうるリソースの問題を素早く特定可能

◾️運用の自動化  EC2パッチ、更新、設定変更、削除、停止およびデプロイなどを自動化

◾️可視化と制御  各リソースグループの最新状態を簡単に可視化して制御できる

◾️ハイブリット管理  AWSサーバーとオンプレミスのサーバーとを1つのインターフェースで管理可能

CloudWatchの概要

AWSリソースとAWSで実行するアプリケーションのモニタリングサービスで、様々なログやメトリクスを監視できる ・モニタリング、監視の集約化、トラブルシューティング、ログ解析、自動アクション、運用状況の確認

◾️CloudWatch(メトリクス監視)  AWS上で稼働するシステム監視サービスで、死活監視、性能監視、キャパシティ監視を実施

◾️CloudWatchLogs  CloudWatchと連動したログ管理プラットフォームサービス  EC2上のOS・アプリケーションのログやAWSマネージドサービスのログを取得する

◾️CloudWatchEvents  CloudWatchはAWSリソースに対するイベントをトリガーにアクションを実行   オペレーションの変更に応答し、応答メッセージ送信、機能のアクティブ化、変更、状態情報収集による修正アクションを実行する

環境の自動化について

イノベーションノウハウ

テクノロジーの進化とビジネス変化のスピードに対応するため、柔軟で素早いサービス開発が求めれる

◾️テクノロジー×ビジネススピードへの対応  1、テクノロジー進化のスピードが加速  2、テクノロジーを活用したビジネスの展開スピードが加速  3、これまでより短期に開発可能かつ変更に強いシステムの必要性

◾️多様な顧客ニーズへの対応  1、多様な顧客ニーズに柔軟かつスピーディに対応する必要性  2、デザイン思考 / リーンスタートアップなどの顧客中心手法が主流に  3、本当に使うシステムだけを開発・運用する必要性

ビジネスに即応できる開発手法・技術の導入

AWSの環境自動化サービス

システムの安全性・整合性及び組織の効率性を改善するため主導プロセスを自動化する

・関連する主要サービス AutoScaling、CloudFormation、Codeシリーズ、ECS、ElasticBeanstalk、OpsWorks、EC2 Run Command

環境の自動化

環境を自動化することで開発速度を高めつつ、DevOpsとCI / CDによる開発を実現する

素早いサービス開発

リーンによる素早いサービス検討とCI / CDによる素早い開発をマイクロサービスに対して実施する

・Codeシリーズ  開発コードのGit上のコミット・実行・デプロイを自動化する  PipelineはCloudFormationとECSのデプロイ自動化にも利用可能

・Elastic Beanstalk  ウェブアプリケーションやサービスを使いなれたサーバーでデプロイおよびスケーリングするためのサービス

・OpsWorks  ChefやPuppetのマネージド型インスタンスのサーバーの設定、デプロイ、管理を自動化できるようになる設定管理サービス

・CloudFormation  クラウド環境内の全てのインフラストラクチャリソースを記述してプロビジョニングするためのテンプレート化されたプロビジョニングサービス

Amazon ECS  AWS上でDockerコンテナによる環境構築のテンプレート化を実現するサービス  Dockerfileに環境イメージを設定しインフラ設定をコード化する

・CloudWatch  EC2インスタンスやEBSボリューム、DBインスタンスまたはカスタムメトリクスなどのリソースを簡単にモニタリングできる

Codeシリーズ

開発コードのGitベースのリポジトリ上でのコミット・実行・デプロイを自動化する一連のサービス

Elastic Beanstalk

WEBアプリケーションの定番構成の構築・デプロイの自動化サービス ・早く簡単にアプリケーションをデプロイするサービス ・JavaPHPRubyPython、Node.js、NET、Docker、Goに対応してWEBアプリケーションを展開できる ・Apache、Nginx、Passenger、IISなど使いなれたサーバーでデプロイおよびスケーリングが可能 ・コードをアップロードすればキャパシティのプロビジョニング、ロードバランシング、AutoScalingからアプリケーションのヘルスモニタリングまでデプロイを自動化できる

Elastic Beanstalkの構成要素

アプリケーションという単位にバージョン・環境設定がコードとして保持され、環境にバージョンが展開される

◾️アプリケーション  ・トップレベルの論理単位でバージョンや環境や環境設定が含まれている入れ物

◾️バージョン  ・デプロイ可能なコードでS3で管理する  ・異なる環境 / 異なるバージョンを展開可能  ・バージョンレポジトリーに保持する

◾️環境  ・各環境(ウェブサーバー / ワーカー)に応じて構築されるインフラ環境  ・バージョン(ソースコード)をデプロイ

◾️環境設定  ・その環境に関連するリソースの動作を定義する設定パラメータ  ・永続データの格納場所はS3やRDSなどの外部サービスを利用する

ユースケース

WEBアプリケーションのデプロイを容易にすることや、タスク時間の長いワークロードの展開に利用する

◾️ウェブサーバー環境 ・ELB+Auto Scalingでスケーラブルな構成をコード化してバージョンとすることで、スケーラブルなウェブアプリケーションを実行できる ・単一コンテナのDockerコンテナを実行可能 ・複数コンテナはECSを使用した環境実行が可能

◾️ワーカー環境 ・SQS+AutoScalingでスケーラブルなバッチ処理ワークを実現 ・定期的なタスク実行基盤の作成:毎日深夜1時に動作するバックアップ処理 ・ワーカーホスト内でWebアプリケーションを動作させ、ワークロードの時間がかかる処理を実行させる

OpsWorks

OpsWorksはChefまたはPuppetを使用してアプリケーションを設定および運用するための設定管理サービス

・OpsWorksスタック ・OpsWorks for Chef Automation ・OpsWorks for Puppet Enterprise

Chefは様々な形式のインフラへのサーバーやアプリケーションの展開を容易にする環境自動化フレームワーク

OpsWorksはこのChefやPuppetによるインフラ設定・運用の仕組みをAWS上でマネージド型サービスとして提供している

OpsWorks for Chef Automation

Chefサーバーを作成し、継続的デプロイメントおよびコンプライアンスチェックのための完全マネージド型サーバーサービス

・ChefAutomationとは、Chefのcookbookやレシピを利用してインフラ管理を自動化するサービス ・インフラおよびアプリの継続的なデリバリーパイプラインを構成することが可能 ・リソースはChefサーバーから構成内容のアップデートを取得する ・オペレーション / コンプライアンス / ワークフローイベントを可視化することが可能 ・AWSでChefサーバを構成することができ、Chef Automate APIやChef DKなどのツールを利用することができる

OpsWorks for Puppet Enterprise

フルマネージド型Puppetマスターにより、アプリケーションのテスト・展開・運用を自動化する

・Puppetマスターは、インフラ内のノードを管理し、ノード情報を保存し、Puppetモジュールの中央リポジトリとして機能する ・PuppetマスターはソフトウェアおよびOSの設定・パッケージのインストール、データベースの設定、変更管理、ポリシー適用、モニタリングおよび品質保証証等のタスクを処理する全スタックを自動化することができる ・モジュールはインフラストラクチャの設定方法に関する手順が格納されたPuppetコードの再利用および共有が可能とするユニット ・Puppetを使用してEC2インスタンスやオンプレミスデバイスにあるノードの設定、デプロイ、管理方法を自動化できる

OpsWorksスタック

スタックとアプリケーションの作成および管理のためのシンプルで柔軟な方法を提供するオリジナルサービス ・スタック / レイヤー / インスタンス / アプリケーションと呼ばれるコンポーネントによりモデル化を実施する ・コードで構成管理やオートスケーリングが可能 ・Linux / Windouwsサーバーをサポート ・ライフサイクルイベントによるタスクの自動化が可能 ・OpsWorksエージェントがChef Clientのローカルモードでレシピを実行する ・スタックがOpsWorksのトップエンティティである全インスタンスの構成情報をJSON形式で管理している ・AWSOpsWorksスタックではChefサーバーは不要

Elastic Beanstalk VS OpsWorks

WEBアプリのデプロイに特化したElastic Beanstalkに対してOpsWorksは様々なアプリケーションに対応する高度なインフラ環境構築が可能

◾️Elastic Beanstalk  アプリケーションの自動デプロイ化   ウェブアプリケーションに置いてサービスを使いなれたサーバーにおいてデプロイとスケーリングするためのサービス

◾️OpsWorks  インフラの設定自動化   ChefやPuppetのマネージド型インスタンスのサーバーの設定・デプロイ・管理を自動化できるようになるインフラの設定管理サービス

CloudFormation

AWSクラウド環境内の全インフラリソースを記述してテンプレート化して展開する環境自動設定サービス

・プロビジョニングされたリソースの変更、削除が可能 ・追加リソースへの通常課金のみで追加料金なし ・JSON / YAMLで記述する ・クロスリージョンとクロスアカウントで管理 ・直接サポートされていないリソースや機能を利用する場合はカスタムリソースでスタック作成の一部に独自ロジックを組み込むことが可能

コンテナ

コンテナはホストマシンのカーネルを利用し、プロセスやユーザーなどを隔離する仮想化方式

Docker

Dockerはコンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム

Amazonのコンテナサービス

◾️レジストリ  コンテナエンジンに実行されるイメージが保管される場所  Amazon ECR

◾️コントロールプレーン  コンテナを管理するサービス  Amazon ECS  Amazon EKS

◾️データプレーン  コンテナが実行される環境  AWS Fargate

Elastic Container Service(ECS)

Dockerコンテナをサポートする拡張性とパフォーマンスに優れたコンテナオーケストレーションサービス

・コンテナ化されたアプリをAWSにおいて簡単に実行およびスケールできる ・Fargateを利用することでコンテナのデプロイと管理にサーバーのプロビジョニングや管理は不要 ・あらゆる種類のコンテナ化されたアプリケーションを簡単に作成できる ・Dockerコンテナの数が数十であっても数秒で簡単に起動 ・ELB / VPC / IAM / ECR / CloudWatch / CloudTrailなどのAWSサービスを利用可能 ・VPCネットワークモードでTask毎にENIを自動割り当てSecurity GroupをTask毎に設定可能  VPC内の他のリソースへPrivate IPで通信が可能 ・Fargate起動タイプとEC2起動タイプという2種類のモードがある

Elastic Container Registry(ECR)

フルマネージド型のレジストリサービスでDockerコンテナイメージを簡単に保管、管理、デプロイが可能

・ECSとDockerCLIに統合されており、開発から本番稼働までのワークフローを簡略化する ・IAMによる強力な認証管理機構 ・エンドポイントにアクセスできるならAWS外からでも利用可能 ・ライフサイクルポリシーでイメージの自動クリーンアップできる ・VPCネットワークモードでタスク毎にENIを自動割り当てして、さらにセキュリティグループをタスク毎に設定可能

Amazon Elastic Kubernetes Service(EKS)

コンテナ化されたアプリケーションのデプロイ、管理、スケールをオープンソースkubernetesを使って実行するサービス

Kubernetesは自動デプロイ、スケーリング、アプリ・コンテナの運用自動化のために設計されたオープンソースのプラットフォーム ・Kubernetesのパートナーやコミュニティが作成した既存のプラグインやツールを使用可能 ・マネージド型サービスでありコントロールプレーンの管理が不要 ・ワーカーノードとマネージドコントロールプレーンとの間に暗号化処理された安全な通信チャネルを自動的にセットアップする ・Kubernetes環境で管理されるアプリケーションとの安全な互換性がある

AWS Fargate

サーバーやクラスターの管理なしにコンテナを実行するECSに対応したコンピューティングエンジン

◾️EC2起動モード  ・ECSでEC2インスタンスを起動する  ・コンテナアプリケーションを実行するインフラストラクチャーに対して、サーバーレベルの詳細なコントロールを実行可能  ・サーバークラスターを管理し、サーバーでのコンテナ配置をスケジュール可能  ・サーバークラスターでのカスタマイズの幅広いオプションが利用できる

◾️Fargate起動モード  ・ECSで設置できる専用のコンピューティングエンジン  ・EC2インスタンスクラスターを管理する必要がない  ・インスタンスタイプの選択、クラスタースケジューリングの管理、クラスター使用の最適化は不要  ・CPU、メモリなどのアプリ要件を定義すると必要なスケーリングやインフラはFargateが管理する  ・秒で数万個のコンテナを起動

CodePipeline × CloudFormation

CloudFormationで設定したAWS環境に対してCodePipelineを使うことでテンプレートの変更・実行・展開を自動化する

CodePipeline × ECS

ECSで設定したDocker環境に対してCodePiplineを使うことでテンプレートの変更・実行・展開を自動化する

CloudFormationの概要

AWSクラウド環境内の全インフラリソースを記述してテンプレート化して展開する環境自動設定サービス ・プロビジョンニングされたリソースの変更、削除が可能 ・JSON / YAMLで記述する ・クロスリージョンとクロスアカウントで管理 ・直接サポートされていないリソースや機能を利用する場合はカスタムリソースでスタック作成の一部に独自ロジックを組み込むことが可能

環境構築を正確に実施しかつ効率的に展開したい時にCloudFormationを活用できる

AWSリソースの構築を効率化したい ・開発、テスト、本番環境で利用するインフラを標準化したい ・毎回同じリソースやプロビジョンニング設定を正確に利用したい ・ソフトウェアと同じように環境構成を管理したい

CloudFormationの構成

テンプレートで定義された内容を読み込んでAWSリソースの集合であるスタックを作成する

CloudFormationの機能

CloudFormationテンプレート自体を管理・便利に使うための機能を提供

◾️変更セット  スタックの更新を行う時の概要が変更セットで変更による影響度を確認するためのスタック  スタック変更は直接更新と変更セットの実行で可能

◾️ドリフト  テンプレートによって展開したAWSリソースを展開後に変更した場合に、元テンプレートとの差分を検出するチェック機能

◾️スタックセット  複数のAWSアカウントと複数のリージョンに対してスタックを作成できる機能

◾️スタック間のリソース参照機能  被参照テンプレートの参照値をエクスポートして値を抽出し、その後参照先のテンプレートのインポートによりリソース参照を行うことで連携したインフラ展開が可能になる機能

サーバーレスについて

疎結合化の追求

コンポーネント疎結合

コンポーネント間の疎結合依存を減らした構成とすることで1つのコンポーネント変更や障害の影響を削減する

・関連する主要サービス Lambda、SQS、ELB、SNS

密結合の問題

密結合したアーキテクチャは障害や修正に弱く、不具合が発生しやすい

【密結合はデメリットが多い】 ・1インスタンスの障害の影響が全体に及びやすい ・1つの修正対応で穂可能インスタンスへの影響を多く考慮しなければならない ・負荷対応やスケーリングなども容易にできない ・システム構成の追加、変更が難しい

疎結合化のメリット

ELBやAPIなどを利用して結合点を削減したりメッセージ結合にすることで影響を減らすことができる

疎結合化のメリット】 ・耐障害性が強まる ・負荷対応やスケーリングなどが容易 ・システム構成の追加、変更が容易

疎結合化向けサービス

サーバーレス化をするサービスやメッセージング処理をするサービスを利用して疎結合化する

◾️ELB  サーバー間のトラフィック調整と連携をELBを起点に結ぶことで疎結合化を実現

◾️SQS  SQSのキューイングによる通信でインスタンス関連携を結ぶことで疎結合化を実現

◾️SNS  SNSのアプリケーション間通信でインスタンス間連携を結ぶことで疎結合化を実現

◾️Lambda  サーバーインスタンスではなくLambdaによるトリガー処理で連携することで疎結合化を実現

通信系サービスによる疎結合

サーバー間の連携を直接結んで連携すると密結合となってしまう

疎結合設計

疎結合設計にはサーバーレス / キューイング通信 / マネージド型サービスの利用などを駆使した設計を行う

◾️密結合タイプの設計パターン  ・ユーザー認証、管理をバックエンドサーバーで処理  ・通常のEC2インスタンスでアプリケーションを構成  ・アプリケーション間では直接通信  ・静的ウェブシステムをEC2インスタンスEBSに保存

◾️疎結合化向けの設計パターン  ・ユーザー認証、管理をIAMなどのマネージド型サービスを利用  ・なるべくLambdaなどサーバレスでアプリケーションを構成  ・アプリケーション間ではSQSなどMQ通信で連携  ・静的ウェブシステムをVPC外部のS3に保存

SQSの概要

Amazon Simple Queue Service(SQS) プロセス間通信などのスレッド間通信に使われるコンポーネントで制御やデータを伝達するポーリング型キューサービス

ポーリングとは

複数のプログラム間通信に対し、一定のタイミングの問い合わせがあった場合に送受信処理を行う通信方式 直接通信だと受信側がBusyな場合に処理が滞る可能性がある

一旦中継所に通信内容をためておいて受信側のタイミングがいい時に通信を行う

SQSはキューをため込んでポーリング処理を実施するサービス

RequestキューとResponseキューにより送受信をキューイングすることができる

SQSの特徴

フルマネージド型で提供され、高可用性・高スケーラビリティ・高スループット・低コストを実現

・複数のサーバー / データセンターにメッセージを保持する高可用性構成 ・多数の送信者と受信者に対応可能なスケーラビリティの確保 ・メッセージが増加しても高スループットを維持できる ・無料枠と従量課金による低コスト

基本的には256KBまでの軽いデータしか利用できず、60秒か14日間メッセージを保持する ◾️メッセージサイズ  メッセージの最大サイズは256KB  Extended Client Libraryを利用すると2GBまでのメッセージの送受信が可能

◾️メッセージ保持期間  削除されないメッセージはデフォルトで4日間保持  保持期間は60秒から14日間で変更可能

◾️InFlightメッセージ  1つのキューごとに最大120,000In Flight(受信されたメッセージ&Visibility Timeout内)メッセージ

キューのタイプ

SQSのキューメッセージ処理順序は2つの方式から選択する

・標準キュー ・FIFO(First in First out)キュー

標準キュー

順番通りに処理と1回だけのメッセージングをなるべく実施する処理

FIFOキュー

その名の通り最初に入ったキューを最初に処理する順番を守るキューイングを実施

SQSの機能

追加機能を利用することでキューイング処理を工夫することができる

◾️Short Poling  キューが空でも即時にリターンする

◾️Long Poling  キューが空の場合はタイムアウトまで待つ

◾️デッドレターキュー  ずっと残ったメッセージを別キューに移動し、正常に処理できなかったメッセージを隔離する

◾️Visibility timeout  新しいメッセージを指定時間見えなくする

Visibility timeout

Visibility timeoutを設定することで優先的に処理してほしい受信インスタンスを指定することが可能

SNSの概要

Amazon Simple Notification Service(SNSAmazon SNSはフルマネージド型のプッシュ型通知サービスで他のサービスとの非同期通信を可能にする

送信側がトピックを作成して受信側をポリシー指定することで制御された非同期通信を実現する

SNSの特徴

AWSの様々なサービスと連携して通知可能で、疎結合アーキテクチャに利用できる

・単一発行メッセージ ・メッセージ通信順番は保証されない ・取り消し不可 ・配信ポリシーによる再試行を実施 ・メッセージサイズは最大256KB

Amazon CloudWatch:Billing Alertの通知 ・Amazon SES:Bounce / Complaintのフィードバック通知 ・AmazonS3:ファイルがアップロードされた時の通知 ・Amazon Elastic Transcoder:動画変換処理完了 / 失敗時の通知

SNSとSQS

SNSとSQSはその処理方式が異なるため利用シーンに応じて使い分ける

◾️SNS  ・メッセージは永続ではない  ・プッシュ型配信方式  ・プロデューサーが発行  ・コンシューマーがサブスクライブ

◾️SQS  ・メッセージは永続性あり  ・ポーリング型配信方式  ・プロデューサーが送受信  ・コンシューマーが送受信

SESの概要

Amazon Sinple Email Service(SES) フルマネージド型 / サーバレス型のコスト効率に優れたEメールサービス

・スケーラブルな構成で信頼性が高いマネージド型 ・メール送信:トランザクションメールなどの高品質なコンテンツを顧客に送信可能 ・メール受信:受信したメールをトリガーにS3やLambdaなどを起動可能 ・バウンス処理:メールが送れなかった場合の処理を規定

SESのメール送信方法

単なるメールサーバーとして利用するだけでなく、アプリ自動でメール送信や連携処理に利用可能

◾️HTTP REST API ・SendEmail API:From / To / Subject / Bodyだけ用意すればSES側でメッセージを生成して送信する ・SendRawEmail API:メッセージ全体をアプリケーション側で生成して送信する ・認証:AWSアクセスキーとシークレットアクセスキーを使用

◾️SMTPエンドポイント ・生成済みEmailメッセージを受け取ってSESのSMTPエンドポイントを経由してメールを送信する  SMTPを前提としてプログラムから直接利用する場合などに利用 ・利用ポート  ー25  ー465(SMTP over SSL)  ー587(Message Submission) ・TLS(Transport Layer Security)が必要 ・認証:専用IAMユーザーを作成してそのクレデンシャルを使用

SESのメール受信

SESのメール通知を利用してS3やLambdaなどと連携が可能

SES利用準備

ドメイン登録やAWS上で利用できるメールとするための利用申請を事前にする必要がある

◾️ドメインを登録 ◾️メールの事前申請

サーバーレスによるサービス化

マネージド型サービスとサーバーレスアーキテクチャにより効率的な設計と運用を実現

・関連する主要サービス Lambda、SNS、SQS、ELB、SES、DynamoDB、AmazonAPIGateway、AmazonCognito

サーバレス化

サーバー(EC2インスタンス)ではなく、Lambdaなどのコンピュートサービスによるシステム構成をできる限り利用する

サーバレス化からサービス化へ

サーバレス設計によって疎結合設計が加速し、疎結合化によってマイクロサービス化されたアプリケーションが構築できる

サービス化

昔ながらのSOA方式から、より小さなプロセス単位のサービスをAPIで連携したマイクロサービスで設計する

◾️サービス指向アーキテクチャSOA)  ・一通りの機能が揃った大きなサービス単位でコンポーネントを分割する設計方式  ・アプリケーションをコンポーネント化して通信プロトコルによる連携で他のコンポーネントにサービスを提供するアーキテクチャ設計  ・ex.年金システムであれば給付サービス、徴収サービス、適用サービスなど

◾️マイクロサービス  ・SOAよりも小さな機能単位のプロセスでサービス化した構成  ・各プロセスでは1つの小さなタスクをサービスとして提供し、プロセス間通信はAPIを用いる

疎結合化とマイクロサービス化は表裏一体の関係となる

マイクロサービス化

大きなサービスを1つの作業が終了するコンテキスト単位に分割する

◾️SOAサービス  ・保険料徴収サービス  ・記録管理サービス  ・年金適用サービス  ・年金給付サービス

◾️マイクロサービス化  ・給付対象者決定業務  ・支払額算定業務  ・支払い決済業務

API活用

マイクロサービスはAPI通信によりコンポーネント間を疎結合化して利用される

サーバレス化のポイント

利用しているインスタンスが本当に必要か設計を見直す

Lambdaの概要

インフラを機にすることなくアプリケーションコードで実行できるデータ処理サービス

クライアントからのアクセスに対してデータを登録する単純な処理をEC2インスタンスに実行されていれば Lambdaに置き換えてサーバレスに実行処理することが可能

Lambdaの特徴

サーバレスによりEC2インスタンスの代わりコードを実行することで効率的なアーキテクチャを実現する

・実行基盤は全てAWSが管理 ・AWSサービスと連携させることで簡単にイベントドリブンなアプリケーションを実装可能 ・Node.js / Javaで書かれたコードを実行 ・100ミリ単位でコード実行時間に対しての課金でありコスト効率が非常に高い ・オートスケール

Lambdaの仕組み

利用方法もシンプルでWEBアプリやモバイルアプリから簡単に利用可能

・Lambdaファンクションを用意する ・アプリからLambdaを呼び出す

イベント発生後に数ミリ秒以内にLambdaコードが実行される

・画像のアップロードをトリガーとして ・アプリケーション内の実行処理をトリガーとして ・ウェブサイトのクリックをトリガーとして ・接続デバイスからの出力をトリガーとして

Lambdaの起動

LambdaはPushモデルとPullモデルによって実行される

◾️Pushモデル S3 / Cognito / SNSなどのAWSサービスとカスタムイベントが直接実行することにより起動するLambdaファンクション  ・サービスもしくはアプリが直接実行する  ・順不同  ・3回までリトライ

◾️Pullモデル DynamoDBとKinesisなどのデータ処理はLambdaに対して直接的にイベント発行を行わないためLambdaがそれらへポーリングを行い自らイベントを取得  ・ストリームに入ってきた順に処理される  ・イベントソースとして登録したストリームに対してLambdaが自動的にデータ取得などのファンクションを実行する  ・イベントごとに複数レコードを取得可能  ・データが期限切れになるまでリトライ

Lambdaの起動:Pullモデル

Lambda自らがPullしてKinesisストリーム処理データのデータ項目を取得する

Lambdaの処理タイミング

他のAWSサービスやSDKを利用したモバイルもしくはWebアプリからの呼び出しが可能

◾️非同期実行  リクエストが正常に受け付けられたというレスポンス内容が返ってくる

◾️同期実行  実行完了時にLambdaファンクション内でセットしたレスポンスが返ってくる

Lambdaのパーミッション

Lambdaファンクション作成時にLambda側で自動で作成したり、クロスアカウントアクセスも設定可能

◾️Execution  ・LambdaファンクションがAWSリソースにどういったアクションを実施させるかを決定する  ・指定されたIAMロールにそってAWSのリソースへのアクセスが許可される

◾️Invocation  ・Lambdaファンクションをどのリソースが実行できるかを決定する

Lambdaの連携

様々なAWSサービスをトリガーとして起動するなどの連携処理が可能 ・Amazon S3Kinesis、DynamoDB Stream 、Cognito(Sync)、SNS、Skills Kit、SWF

Lambdaの設定

1、コードをアップロードする  直接エディタ記述 / S3インポート / Zip形式でアップロード 2、関数を設定  スケジュール関数は実行頻度を指定  イベント駆動型関数はイベントソースを指定 3、必要なメモリ容量を指定する 4、タイムアウト時間を指定する 5、VPCアクセス用にVPCを指定する 6、関数を起動する

ブループリント

Lambdaファンクションをコーディングする際にサンプルコード集を利用することが可能

スケジュール機能

特定時刻をトリガーにしてLambdaファンクションを実行する

バージョニング

バージョンニング機能でのファンクションの一時点を記録管理することが可能

◾️バージョンの発行方法 ・Lambdaファンクションの作成や更新時にpublishパラメーターによりバージョンが発行される ・Publish Versionにより明示的にバージョンを発行することが可能

◾️バージョンの特徴 ・一度発行すると変更不可 ・単純にバージョン番号が増加する ・エイリアス(特定バージョンに対するポインタ)を設定して特定時点にマークすることが可能 ・エイリアスを作成することでバージョン番号を把握していなくても指定バージョンを呼び出せる

VPCアクセス

インターネットを経由せずにVPC内のAWSリソースへとアクセス可能になる

◾️VPC内のリソースへのアクセス  ・AWSの全てのVPC内リソースなどへインタネットを経由せずにアクセスが可能  ・Elastic Network Interface(ENI)を利用して実現   ENIには指定したサブネットのIPがDHCPで動的に割り当てられる

◾️アクセス制御  ・VPC内リソースにアクセスさせたいLamdbaファンクションに対してVPCサブネットおよびセキュリティグループを指定  ・ファンクションに割り当てるIAM RoleにAWSLambdaVPCAccessExecutionRoleというポリシーをアタッチしておくこと

ロードバランサー機能

ALBのバックエンドにLambdaを呼び出すことが可能になり、WEBアプリにLambdaファンクションを組み込みやすくなった

Lambdaユースケース

Amazon Echoの音声処理をトリガーとしてAlexaスキルを呼び出す

S3内のCloudTrailのログ分析により異常を検知した場合に、Lambdaを起動してメール通知する

Lambda起動のスケーリング

Lambdaファンクションでストリーミングデータの傾向に応じてスケーリングのトリガーとなる

Lambdaモバイルアプリ

モバイルからの写真管理をLambdaを通じて実施するなどモバイル連携も容易

Lambdaエッジ

Lambdaの機能とCloudFrontのエッジロケーション処理の機能を合わせたサービス CloudFrontにLambda機能を連携し、世界中でインフラをユーザーに近いロケーションでコードを実行が可能になる

イベントに関連づけられてLambdaファンクションがエッジロケーションで実行されて実行結果を返答する

API Gatewayの概要

APIApplication programming interface)はシステムとシステムをつなぐ連結器

APIを通じてリクエストとレスポンスにより、他サービスの機能やデータを呼び出すことができる

◾️専門的には ・APIアプリケーションソフトウェア開発に利用される標準的なインターフェース群のこと ・中でもWEB APIはWEB上で他のサービスを呼び出す方式や取り決め

APIの活用

自社アプリ、サービスをAPI化して連携を目指す方法と、API化された他社アプリ、サービスを活用する方法がある

◾️自社アプリ・サービスのAPI公開  自社アプリ・サービスをAPI化して自社サービスとの連携してサービスを展開する

◾️他社アプリ・サービスのAPI活用  他社APIサービスを活用して自社事業と組み合わせたアプリやサービスを展開する

APIエコノミー

APIエコノミーと自社サービスやデータをAPI化して社内外連携を促進し、ビジネス領域・価値を拡大させるビジネス活動

API利用の必要事項

APIの活用のためにはAPIを効率的に構築・運用・保守が十分にできる必要がある

APIの作成、API利用状況の監視、APIのバージョン管理、APIの認証・アクセス管理

API Gateway

API作成 / 管理をフルマネージド型サービスで提供

・最大数十万個のAPI同時呼び出し、受付が可能 ・アクセス制御の管理 ・DDoS攻撃対応やスロットリングによるバックエンド保護 ・EC2 / Lambda / 任意のウェブアプリケーションのワークロード処理を実行する ・Lambdaと密接に統合されている ・WebSocketを利用したリアルタイムかつ双方向通信のAPIも処理可能

ユースケース

API Gatewayを連携口として外部アプリとの連携を実現する

ElastiCacheについて

ElastiCacheの概要

キャッシュの利用 繰り返し取り出すデータやコンテンツについてはキャッシュを利用する構成とする 関連する主要サービス ・CloudFront、ElastiCache、S3

インメモリキャッシュ

ElastiCacheはメモリ+キャッシュというデータベース

データを保持するHW

PCなどの機器でデータを保存するためのHWはメモリとHDDなどのディスクがある

メモリ型DB

データをメモリ上で動作させるとディスク上で動作をさせる場合と比較して大幅に高速に処理が可能 つまりメモリDBをうまく利用することでデータの高速処理を実現できる

キャッシュとは

一度アクセスしたデータを保存して次回アクセス時に酵素きうにアクセスできるようにする仕組み

インメモリキャッシュとは

メモリを活用して高速にキャッシュへのアクセスを可能にしたデータベースの仕組み

ElastCache

分散インメモリキャッシュサービスの構築、管理およびスケーリングを容易に実施することができるサービス

・キャッシュクラスタを数クリックで起動 ・フルマネージド型でモニタリング、自動障害検出、復旧、拡張、パッチ適用、バックアップに対応し高可用性を実現

・広く利用されている2種類のエンジンmemcached、 /redisから選択可能

オープンソースのRedisとMemcachedを利用可能で汎用性あり ◾️Redis  ・高速に値をRead/Writeできるインメモリキャッシュ型DB  ・シングルスレッドで動作するインメモリキャッシュDBで全てのデータ操作は排他的  ・スナップショット機能がある  ・データを永続かできる

◾️Memcached  ・高速に値をRead / Writeできるインメモリキャッシュ型DB  ・マルチスレッドで動作するインメモリキャッシュDB  ・スナップショット機能がない  ・データを永続化できない  ・フェイルオーバーや復元ができない

シンプルに利用する場合はMemcachedを利用するが、それ以外はRedisを利用する場合が多い

◾️Redis  ・複雑なデータ型が必要である  ・インメモリデータセットをソートまたはランクつけする必要がある  ・読み込み処理の負荷に対して、リードレプリカにレプリケートする必要がある  ・pub / sub機能が必要  ・自動的なフェイルオーバーが必要  ・キーストアの永続性が必要  ・バックアップと復元の機能が必要  ・複数のデータベースをサポートする必要がある

◾️Memcached  ・シンプルなデータ型が必要  ・複数のコアまたはスレッドを持つ大きなノードを実行する必要がある  ・システムでの需要の増減に応じてノードを追加または削除するスケールアウトおよびスケールイン機能が必要  ・データベースなどのオブジェクトをキャッシュする必要がある  ・キーストアの永続性は必要ない  ・バックアップ復元の機能が必要でにあ  ・複数のデータベースを利用できない

ElastiCache with Redis

その他に位置情報クエリ / Luaスクリプトによる操作やpub / subモデルを活用可能

◾️Luaスクリプト  ・移植性が高く、高速な実行速度などの特徴を持っているスクリプト言語

◾️位置情報クエリ  ・経度、緯度などの位置情報をクエリ処理することが可能  ・検索距離や検索範囲の指定可能

◾️pub / subモデルの利用  ・イベントを起こす側とイベント処理を行う側を分離するのがpub / subモデル  ・メッセージ処理やイベント処理で活用

ユースケース

データアクセスを高速にしたいケースがあればキャッシュの活用を検討する ・セッション管理 ・IOT処理とストリーム分析 ・メタデータ蓄積 ・ソーシャルメディアのデータ処理 / 分析 ・Pub / Sub処理 ・DBキャッシュ処理

キャッシュすべきデータを特定して、他のDBと合わせて利用するのが標準的な構成方法 ◾️キャッシュ未使用パターン  DBアクセス負荷が増大すると処理能力が低下し可用性が低下する

◾️インメモリキャッシュ利用パターン  アクセス頻度の高いデータをキャッシュに配置して可用性を高める

ユースケース

アプリケーションでデータの即時反映が必要なケースなどに活用する

・ユーザーのマッチング処理 ・レコメンデーションの結果処理 ・画像データの高速表示 ・ゲームイベント終了時のランキング表示

CloudFrontの概要

AWSが提供するCDN(Content Delivery Network)サービス CDNはWEBコンテンツ配信処理を高速化するためのサービス

大規模なアクセスも世界中にエッジのあるキャパシティを活用して効率的かつ高速にコンテンツ配信が可能なサービス

・210以上のエッジロケーションによる高性能な分散配信 ・高いパフォーマンス ・AWS WAF / AWS Certificate Managerとの連携やDDoS対策によるセキュリティ機能 ・オリジンに対してHeader / Cookie / Query Stringsによるフォワード指定で、動的なページ配信が可能

Distribution設定

CloudFrontの配信設定を実施して各ドメインにて利用する

・各配信先となるドメインに割り当てるCloudFrontを設定する ・マネジメントコンソールやAPIより作成する ・WEB DistributionとRTMP Distributionを選択する ・使用量が最大40Gbps / 10万RPS超は上限緩和申請を実施する ・独自ドメインを指定可能

・コンテンツオリジン設定:CloudFrontの配信ファイルの取得先の設定 ・アクセス設定:ファイルアクセスの許可設定 ・セキュリティ設定:アクセスにHTTPSを利用するかの設定 ・Cookieまたはクエリ文字列転送の設定:オリジンへのCookie / クエリ文字列の転送要否を設定 ・地域制限:特定の国のユーザーからアクセス拒否設定 ・アクセスログ設定:アクセスログを作成要否の設定

Adobeメディアを利用する場合は、RTMPディストリビュージョンを利用するが、通常はWEBディストリビュージョンを利用

◾️WEB Distribution  ・通常のHTTPプロトコルを利用したWEB配信をする際に利用  ・HTTP1.0 / HTTP1.1 / HTTP2に対応  ・オリジンはS3バケット / MediaPackageチャネル / HTTPサーバーを設定  ・HTTPやHTTPSを使用した静的および動的なダウンロードコンテンツ配信  ・Apple HTTP Live Streaming(HLS)やMicrosoft Smooth Streamingなど様々な形式のビデオオンデマンド

◾️RTMP Distribution  ・RTMP形式配信の際に利用  ・Adobe Media ServerとAdobe Real-Time Messaging Protocol(RTMP)を使用してメディアファイルをストリーミング  ・S3バケットをオリジン設定  ・クライアントはメディアファイル / メディアプレイヤー(JW Player、Flowplayer、Adobe Flash)を利用

Gzip圧縮機能

エッジ側でコンテンツをGZIP圧縮してより高速に配信可能

キャッシュコントロール機能

キャッシュコントロールによりキャッシュヒット率を上昇させて効果的なキャッシュ活用を可能にする

◾️パラメーター値の完全一致  ・URLとフォワードオプション機能(head / Cookie / Query Strings)のパラメーター値の完全一致でキャッシュが指定される仕組み  ・単一ファイルのキャッシュは最大20GB  ・GET / HEAD / OPTIONリクエストを対象

◾️キャッシュ無効化  ・キャッシュが期限切れになる前に無効化することが可能  ・必要のないキャッシュを無効化することで効果的な利用を可能にする  ・コンテンツごとに最大3000個まで無効化パスを指定できる  ・ワイルドカードを利用して最大15個まで無効化パスリクエストが指定可能

セキュリティ機能

様々なセキュリティ設定によるセキュアなコンテンツ配信

SSL配信書を設定して、コンテンツ配信時のHTTPS対応しており、ビューワーアクセスとオリジン配信時の暗号化通信が可能 ・オリジンカスタムヘッダーによる通信制御が可能 ・AWS WAFによるファイアーウォールと連携し、ディストリビューションに対するウェブリクエストを許可、ブロックが可能  また、Referrer制限によるリンク参照禁止も可能 ・AmazonS3バケットからの配信の際にOAIとCloudFrontを指すカスタムドメインによってアクセス制限 ・AWS ShieldによるDDoS対応 ・著名付きURL / Cookieによる有効期限指定 ・GEOリストリクションによる地域情報でアクセス判定

CloudFrontの利用設計

キャッシュ対象を決定した上で、キャッシュ時間やセキュリティ制御を設計する

◾️キャッシュ対象設定  ・コンテンツ利用データ分析などを実施して静的コンテンツ / 動的コンテンツへのキャッシュ対象URLを設定する

◾️TTLの設定  ・変更が反映されるまでの時間も考慮してキャッシュ時間(TTL)を決定する

◾️その他の設定  ・セキュリティ対応等のその他の設定事項の要否を決定(SSL認証の有無 / HTTPSの有無)