半年前アーキテクトに合格ので今度はAWS認定デベロッパー- アソシエイト (DVA) にチャレンジしました。
そして無事合格しました。
ひたすらコマンドかなと想像していましたが、サンプル問題等を見る限りただの知識問題のようで開発時にディベロッパーとして問われる基本知識を見ているようです。FAQが勉強の役にたちました。
今回もDynamoDB,S3,EC2などサービス毎に必要な知識をまとめていきますのでお役立ちできればと思います。
S3
セキュリティ
昨年、「Amazon S3バケットのアクセス設定に関する注意喚起メールにつきまして 」https://aws.amazon.com/jp/blogs/news/securing_amazon_s3_buckets/
と公式からもアナウンスがあったようにS3が誰でもアクセス出来ないよう設定しましょう。
具体的にはパブリックの読み取りアクセスを削除し、有効期限で署名された URL を使用します。
そのままだと以下のように十分に予測可能と判断出来るURLでバケットにアクセスできます。
(バケット名).s3-website-ap-northeast-1.amazonaws.com
課金コンテンツのダウンロードなどの際は有効期限で署名された URLを利用し不正利得されないようにする事が大切です。
さらにS3内のデータアクセス制御としてACL、BucketPolicy、IAMを設定します。
Amazon S3 で管理されたキーによるサーバー側の暗号化 (SSE-S3)では
256 ビットの高度暗号化規格 (AES-256) を使用してデータを暗号化が出来ます。
オブジェクト作成の REST API を使用してサーバー側の暗号化を要求するには、
x-amz-server-side-encryption リクエストヘッダーを送信するだけで実行できます。
バケットポリシー上も以下のようにServer Side Encryption: AES256」のオプションが指定されていない場合に、
許可しないと設定するのが良いでしょう。
“Condition”:{
“StringNotEquals”:{
“s3:x-amz-server-side-encryption”:”AES256″
}
}
特性と制約を活かしたS3の利用方法
S3が分散型ストレージである特性から結果整合性が採用されています。
これは最後に更新した処理が終わると、時間が経てば必ず全てのストレージに
最新情報が反映されるということです。
このような特性からトランザクションの制御できないと考えて良いです。
※SimpleDBの設定で出来なくはないそうです。なるほど・・
Amazon DynamoDB では現在、テーブルに格納する各項目のサイズを制限しています 。
アプリケーションで DynamoDB のサイズ制限よりも多くのデータを格納する必要がある場合は、
1 つ以上の大きな属性を圧縮するか、S3には画像などのメディアを保存して、
Amazon S3 オブジェクト識別子を DynamoDB 項目に格納することができます。
大量の画像をアップロードする場合は注意が必要です。
1 回のオペレーションでアップロードできるオブジェクトのサイズは最大 5 GB です。
5 GB を超えるオブジェクトの場合は、マルチパートアップロード API を使用する必要があります。
またバケット数にも制約があります。デフォルトでは、AWS アカウントにつき最大で 100 個のバケットを作成できます。
追加のバケットが必要な場合は、サービスの制限の緩和を申請することによって、
バケットの制限を引き上げることができるそうです。
ハンズオンを開催して一斉に作ったら100個ぐらいならすぐいきそうですね。
DynamoDB
DynamoDB は、一貫性のため、条件付き書き込みを使用しています。
DynamoDB は、オプティミスティック同時実行制御を使用しています。
SQS
メッセージ配信の順序不定で、メッセージは、1 回または複数回配信されます。
SNS
メッセージのフォーマットはMessageId、unsubscribeURL、件名、メッセージおよびその他の値を含む JSON オブジェクト
UnsubscribeURLはエンドポイントの受信登録を解除するために使用できる URLです。
この URL にアクセスすると、Amazon SNS はエンドポイントの受信登録を解除し、このエンドポイントへの通知の送信を停止します。
EC2
EC2APIマシンイメージ(AMI)のリストを取得するためにはDescribeImagesを実行します。
EBS
EBS のインスタンスは停止・再起動することができる事が特徴です。
データ保護の方法としてS3 サーバ側の暗号化サービスを使用して、ボリュームを暗号化できます。
ElasticBeanstalk
サービスとしてはAuto scaling groups、Elastic Load Balancers、RDS InstancesはElasticBeanstalkで展開可能です。
プラットフォームとしては.NETやApache Tomcatなどがサポートするされています。
VPC
VPC上でAMI とセキュリティグループの設定を同じにしただけではインターネット上からアクセスできません。
EIPを設定するとアクセス出来るようになります。
プライベートサブネット内のインスタンスからインターネットへのアウトバウンド接続を行う場合、NAT インスタンス上の送信元/送信先チェック属性を無効にする必要性があります。
ELB
ただ純粋に負荷分散すると同じサーバにアクセスする事が保証されないので
例えばセッション管理をクッキーで行う場合、アクセスできる保障がありません。
これでは困るので対応方法として「スティッキーセッション」の設定があります。
1.EC2のロードバランサーの設定を開きます。
2.説明タブにあるポート構成の維持設定が「無効」のときは
スティッキーセッションが設定されていません。
3.維持設定:無効の横の編集をクリックします。
4.ELBのスティッキーセッションはCookieの有効期限設定が2種類あります。
①任意の有効期限を指定する
②アプリケーションのCookieに従う
今回の目的に合うのは②を選択
5.Cookie名を入力して保存します。
SWF
SWFはワークフローの各タスクを疎結合を実現するためのサービスです。
ポイントとなる言葉を中心に概要を理解しましょう。
ドメイン (Domain)は、関連するワークフローを一括りにする概念です。
ワークフロー (Workflow)は、アクティビティを調整するロジックと共に、いくつかの目的を実行する一連のアクティビティです。
SWF タスクは一度割り当てられ、複製されることはありません。また、SWF ワークフローの実行は1年まで持続可能です。
アクション (Action)は、ワークフローを実行するのに行われる個別のタスクです。
アクティビティワーカー (Activity Worker)は、アクションタイプ (Activity Type)を持ちタスクを実際に実行します。
SWF は ディサイダー とワーカーを使用してタスクを完了します。
ディサイダー (Decider)は、ワークフローを調整するロジックを持ちます。
要求後に行う処理はDeciderが決定する為、Deciderのプログラムを新しいビジネスロジックに変更すれば良く、
要求元、要求先プログラムの変更の必要がない。これは疎結合ですね。
課金体系は少し分かりにくいです。
実行 – ワークフローの1実行あたり、$0.0001で、 24時間以上アクティブになっている場合は追加で$0.000005かかります。
タスク、タイマー、シグナル、マーカー – 各タスクの実行、タイマー、シグナル、マーカーあたり $0.000025。
通常のAWSの帯域の利用料金が加算されます。
IMA
IMAポリシーによるアクセスの管理でおさえたいのは拒否と許可の優先順位です。
公式には以下のようにまとめられています。
①明示的な拒否を持つポリシー内のステートメントがリクエストのアクションおよびリソースと一致する場合: 明示的な拒否は他のすべてを上書きします。指定されたリソースに対する指定されたアクションは、常にブロックされます。
②明示的な拒否がないが、リクエストのアクションとリソースに一致する明示的な許可を持つステートメントがある場合: 明示的な許可が適用され、そのステートメント内のアクションにそのステートメント内のリソースへのアクセスを許可します。
③明示的な拒否を持つステートメントがなく、明示的な許可を持つステートメントがリクエストのアクションおよびリソースと一致しない場合: このリクエストはデフォルトで暗黙的に拒否されます。
スッキリまとめると
暗黙的な拒否は、明示的な許可で上書きできます。
しかし、明示的な拒否は、明示的な許可で上書きできません。
ElastiCache
Amazon ElastiCache では、Memcached と Redis のキャッシュエンジンがサポートされています。
ElastiCache バージョン 4.X以降で暗号化がサポートしてされます。
利用ケースとして負荷分散の実装によりWebアプリケーションで利用するセッションを維持させる方法として
ElastiCache を使用してセッション状態を保存する方法があります。
CloudFormation
JSON/YAML形式のテンプレートで環境を定義するサービスです。
AWSTemplateFormatVersionとResourcesの部分は触らずにResourcesに作りたいリソースを書いていきます。
注意点はスタック内のリソースのいずれかが作成できないと以前に作成されたリソースが削除され、スタックの作成が終了してしまうことです。
Fn::GetAtt 機能を使用するとDNS 形式のアドレスを使用してリソースの指定ができます。
コチラにテンプレートスニペットがまとまってます。
{ “Fn::GetAtt” : [ “logicalNameOfResource”, “attributeName” ] }
ELBでDNS 形式のアドレスを使用する場合以下のようになります。
{ “Fn::GetAtt” : [ “EalsticLoadBalancer”, “DNSName” ] }
AWS
サービス全体に関する知識です。
デフォルトのエリアはus-east-1です。
(私のように)知らずに設定して問い合わせると英語で返ってきてAWSだからそういうものかと思っていた時期もありました。
AMI はリージョンのリソースです。そのため、AMI を共有すると、そのリージョンで利用できるようになります。
AMI を他のリージョンで利用できるようにするには、AMI をそのリージョンにコピーし、共有する必要があります。
今回は以上です。