セキュリティ・認証系
CloudFront
署名付きURL
CloudFrontの署名つきURLを発行して、S3への直接アクセスを防ぐ
S3署名つきURLを発行して、他のユーザーからのアクセスを削除する。
地域制限
CloudFrontのGeo-Restrictionで国単位でのアクセス制限をかける。
OAI
S3でCFrontディストリビューションを経由してアクセスさせたい場合はOAIを使って、オリジンアクセスIDを許可し、S3 URLを使ってのアクセスを削除する
また、セキュリティを強化する場合は、信頼された署名者(AWSアカウント)による署名つきURLを発行する
証明書の配置
ViewerーCloudFrontーオリジン
Viewer-CFront間は、自己証明でもいいし、CA証明でもいい
CFront-オリジン間は、CA証明でなければならない。
ストリーミングはダウンロードオプションを用いる。
CDNとしての機能もあるので、動的コンテンツも対象になる。
オリジンへのTCP接続
クエリ文字列の転送を有効、TTLを0にしておくと常時接続
GuardDuty
VPCフローログおよびCloudTrailイベントログを分析および処理する継続的なセキュリティモニタリングサービス
KMS
KMSマスターキーとS3暗号化クライアントを使用して、クライアント側でデータを保護することもできる。
証明書(X.509証明書)を使って接続の際の認証を行いたい、しかもインスタンスごとに一意に
→インスタンス起動時にSNSでKMSに送信する。KMSで署名付き証明書を生成し、新しく起動したインスタンスに直接送信する。
※KMSはサービスをポーリング(見張る)する機能はない。
CloudFrontを用いた暗号化
KMSを使用してソースデータを復号化し、結果の出力を暗号化する。
また、OAIを使うので、コンテンツはS3 URLではなく、CFを介してのみ提供される。
個別管理
S3へのアクセスなどで個々のユーザーが、個々の暗号化キーにアクセスするためには、、、
・KMS管理のキーによるサーバ側暗号化を使用し、個別のCMKを作成し、キーポリシーを使用してアクセスを制御する。
・顧客のCMKを使用し、CloudHSMインスタンスを使用してキーを管理する。CloudHSMクライアントソフトで生成されるキーへのアクセスを制御する。
IAM
監査
監査人がAWSに入って確認したいとき、サードパーティツールがあるときは、クロスアカウント用のIAMロールを作成して、サードパーティツールがロールを引き受ける。
IAMロールを参照するには、インスタンスプロファイルからロールを参照する。あくまでEC2は資格情報を保持しない。
IAMロールをEC2にアタッチするとインスタンスメタデータから一時的なセキュリティ認証情報を取得する。
APIアクセス時に認証する場合
・インスタンス起動時にIAMロールを指定
・実行中または停止中にロールをアタッチする
・ロールを引き受けた後で、アプリで使用できるAPIを定義
・一時的な認証情報セットを取得して使用
オンプレ認証連携
オンプレのADで認証を一元化したい場合
・ADフェデレーションサービスなどのSAMLベースのIDプロバイダーと連携するためのIDプロバイダーを構築
・STSを使用して一時トークンを生成
・SSOエンドポイントをセットアップ
・IDプロバイダーを信頼できるエンティティとして識別するIAMロールを作成
具体的なUC
①アプリはLDAPに対して認証を行い、ユーザーに関連づけられたIAMロールの名前を取得する。次にアプリはIAMのSTSを呼び出して、そのIAMロールを引き継ぐ。アプリは一時視覚情報を使用して適切なS3バケットにアクセスする。
②LDAPに関して認証を行い、IAMのSTSを呼び出して、IAMフェデレーションされたユーザー資格情報を取得するIDブローカーを開発、アプリはIDブローカーを呼び出して適切なS3バケットにアクセスできるIAMフェデレーションユーザー資格情報を取得する。
※LDAP認証情報を使ってIAMログインはできない。
OpenIDによる認証連携
Webアイデンティティプロバイダを活用して、STSのAssumeRoleWithWebIdentityを利用して一時的な認証情報を生成する。そのWebプロバイダーのIAMロールを作成して、IAMロールのアクセス許可を設定し、S3へのGETやDynamoDBへのPUTなどを許可する。
※Cognitoを認証に利用しても良い。
S3
CORS(クロスオリジンリソース共有)
S3で別のドメインからアクセスがありファイルが引っ張ってこれないときはこれを疑う。
S3バケットの公開阻止
・PutObject呼び出しを行う
・S3がCloudTrailにログを刻むとともにCloudWatchEventsに通知
・Lambdaで蓋をする
※S3ログの監視だと1min以上かかる場合があるのでダメ
※Trusted Advisorはリアルタイムアラートは提供していないのでダメ
特定のユーザーに特定の時間だけS3にアクセスさせるには署名済みURLを利用する。
暗号化種類
SSE-S3:各オブジェクトが一意のキーで暗号化される、定期的にローテーションするマスターキーを使用してキー自体を暗号化する。
SSE-KMS:CMKマスターキーを管理する。いつ、誰によってキーが使用されたかの監査証跡も残る
AWS Config
### リソースポリシーの監視
AWS ConfigでConfigカスタムルールをLambdaと関連づけ作成・変更・削除を継続的に評価
CloudWatch Eventsのリアルタイムストリーム機能で検知して、Lambdaで直す。
証明書
SSL証明書を隔離したい場合、IAMもしくはCertificate Managerに配置し、アクセス制限を行う。
例:開発者はEC2の権限のみ、セキュリティ管理者はIAMやCMの権限を付与し、ELBでSSL終端する。
クライアント証明書
ELBは対応していないので、TCP/443で素通してWebサーバで解決
ELBを使わず、WebサーバにEIPをつけて解決させる方法もある。
SSL証明書
独自ドメインの場合はカスタムSSL証明書→IAMとかSCMで管理する
Systems Manager
コンテナ(ECS)内DBへのアクセスは、機密情報をSystems ManagerのParameter Storeもしくは、Secrets Managerを利用する。
ライフサイクル管理とキーローテーションが必要な場合は、Secrets Managerを使う。(SMのParameter Storeはそんな機能はない)
CloudHSM
CloudHSMを利用して、秘密鍵を保存し、SSLトランザクションを実行する。
また、アプリログはS3に暗号化されたログを蓄積することで秘匿性を守る。
EFS
EFSの暗号化
保存データの暗号化:EFS作成時
転送データの暗号化:EC2マウントされてる時
マウントターゲットはマウント前に作成する必要がある(当然)
EFSマウントヘルパーを使用してEC2にマウントする
・EFSファイルシステムID
・EFSマウントターゲット
・EC2
・EFSマウントヘルパー(ユーティリティを使用する場合は -o tlsの暗号化オプションを追加する)
AWS Shield
CloudFront、Route53を使用するとメリットあり
WAF
CloudFront、ALBと連携
モバイル認証
Cognitoを利用するか、WebIdPとやりとりするカスタムコードもしくはアプリを作成し、AssumeRoleWithWebIdentityを呼び出すことで認証を実現できる。
ネットワーク系
VPC内Lambda
Lambdaがインターネットアクセスが必要な場合、NATGWなどを利用する。
また、LambdaのSGのアウトバウンド設定にInternet向けが許可されているかを確認する。
CloudFront
配信系でデータの読み込みが遅い場合には、CloudFrontと静的コンテンツS3とインメモリキャッシュのECacheを用いるのが良い。
CloudFrontはDBクエリはキャッシュできない。
CloudHub
複数のAWS Site-to-Site VPN接続がある場合は、CloudHubを利用して、安全なサイト間通信を提供する
VPCの有無にかかわらず使用できるハブアンドスポークモデルで動作する。
複数のCGWを使ってVGWを作成する必要がある。
CGWの一位のBGP自律システム番号 (ASN)を使用する必要がある。
CGWは適切なルートをそのSite-to-SIte接続にアドバタイズする。
これらのルーティングアドバタイズが受信され、各BGPピアに再アドバタイズされることでサイト間でのデータ送受信が可能になる。
サイト間でIPが重複することは許されない。
VPC
1つのVPCに仮想プライベートゲートウェイは1つまで
VPN
DX +
各VPCのVGWでVPNトンネルを終了し、ルート管理用にBGPを設定
Route53
VPC間でプライベートDNSを共有するには、共有VPCでRoute53のプライベートホストゾーンを関連づけ、各VPCと共有VPCをピアリングし、プログラム的に関連づける。
ELB
クライアントのIPを知るにはELBのProxyProtocol機能を用いる
各エンドポイント
ゲートウェイエンドポイント:S3,Dynamo
インターフェイスエンドポイント:EC2、ELBなど
プレイスメントグループ
プレイスメントグループと制御用EC2のネットワーク速度を改善したい
→いっそのこと、プレイスメントグループに制御用EC2も入れちゃう。
DirectConnect
インターネットからもオンプレからもアクセスしたいEC2がある時
→デフォルトルートをIGWにしておいて、DXのCGWでBGPを介してオンプレのスタティックルートを伝播する。
オンプレからS3などにアクセスしたい時、パブリックインタフェースを作成して、BGPを既存のルーティングに再配布する。NWの特定のルートをAWSにアドバタイズする。
BGPは「最適パス」で動作する
プロキシサーバ
特定のURL以外のアウトバウンド接続を拒否りたい時
DX Gateway
TransitVPC
VPCがハブとなって、オンプレミス群を管理する。
TransitGW
運用・コスト系
CloudWatch
CloudWatchログストリーム
単一のログストリームに複数のエージェントからログを送信することはできない。
アラーム
サポート範囲の確認
Auto Scaling起動設定に通知してスケールアップできない。
Service Catalog
エンドユーザーがデプロイできるものを制御する。
CloudFormation
定期的にCFormationをメンテナンスしながら、環境を最新に保っておきたい時
CloudFormationとSystems Manager Parameter Storeを使用してテンプレートの最新のAMI IDを取得する。EC2を更新する場合は、CloudFormationテンプレートのupdate-stack APIを呼び出す。
Cloud Formationで作ったリソースの更新
Systems Manager Parameter Storeを使い、テンプレートの最新AMI IDを取得
CloudFormationでupdate-stack-APIを呼び出して更新する
ただし、別個に作ったリソースがネットワークに乗っかっている場合、サブネットの削除などのネットワークスタックの更新が失敗する。
別リージョンや別アカウントに環境を複製したい場合(DRとかではなく、単なるコピー)
CFormationのStackSetsを利用(リソースセクションでアプリの詳細を記述)して、アプリを他のリージョンにデプロイするスタックインスタンスを起動する。
EC2のユーザーデータを使うとアプリの展開と構成を自動化できる。
インプレースデプロイ
Blue/Greenとは違い、稼働中の環境にデプロイを仕掛けていく。
数十TB級のデータは、移行日が何週間かになっていればSnowballを使う。
また、移行時に入れたデータからの差分はVPN経由でオンプレからレプリケーションしてくる。
エンドポイント監視方法(Route53ヘルスチェック)
エンドポイントが2XXもしくは3XX系を返すことを確認する
特定のテキストがレスポンスの最初の5120バイト内に出現しているか確認する
コールセンターの構築
Connect(クラウド型のコールセンター)
Lex(対話型で発信者の意図を認識する)
Lambda(関連サービスとの統合)
継続的デリバリー
CodePipelineとCodeCommitを使った組み合わせ
別のパイプラインを生成する
Codebuildで単体テストを行う
CodeDeployを使ってS3などに入っているコードをデプロイする
AWS Config
リソースの設定を継続的に監視および記録する
AWS Config Managed Rule
これで、承認済みのAMIを使用しているかなど監視する。
OpsWorks
OpsWorksの自動修復機能を利用して、障害発生時にすぐに再起動するようにする。
OpsWorks Stackでは起動中に最新の更新を行う。
→ライフサイクルイベントはインスタンス(AMI)そのものではなく、インスタンス内でのタスク実行
OpsWorksで立てたリソースのパッチ更新
・新しいインスタンスを起動して、現在のインスタンスと置き換える(新しいインスタンスには最新のセキュリティパッチが入っている)
・Linuxベースの古いインスタンスでは、Update Dependenciesスタックコマンドを実行する
DevOpsの構築
OpsWorksのスタック、レイヤー、インスタンスを構成
CodepipelineでソースをS3バケットとして、選択→アプリのzipファイル化
Opsworksスタックを展開プロバイダとして設定、アプリをスタックに自動でデプロイ
CloudFormation
RDSとS3をCFormationで作成したあと、いつでもデータを使用できるようにしたい時
DeletionPolicyについて
RDSをsnapshot、S3をretainにしておく。
RDSにアクセスを常にしたい場合はretain。
EFS
サーバが大量にあり、データの中身が急速に変化する場合は、EFSを用いる(S3ではなく)
また、EFSはオンプレとAWSの間でリソースを共有できる。
Systems Manager
Systems ManagerのState Managerは大規模サーバの一括構成管理に向いている。
パッチ管理はSSMエージェントをEC2にインストールして、Systems Managerで行う。
未承認のAMIでEC2を起動しようとした際の保護と監視について
Systems ManagerのPatch ManagerでインストールOKなパッチを定義したパッチベースラインを設定する。
承認済みAMIを使用しているかどうか、AWS Configのmanaged Ruleを用い、監視し、問題があれば、通知を行うため、CloudWatchを使う。
終了させる場合はLambdaを使う
パッチ運用
・AWS-DefaultPatchBaselineを使用してパッチを決定、メンテナンスウインドウを作成
・AWS-RunPatchBaselineドキュメントを使用してパッチを適用
※パッチグループのタグは1つしかつけられない。
※メンテナンスウインドウでは破壊的なパッチ適用は行わない。スケジューリングすることができる。
Step Functions
変更に伴うデプロイなどでサーバレス環境のワークロードを自動化したい
EBS
Data Lifecycle ManagerでEBSの自動バックアップアンド鮮度維持を行う。
Lambda
バッチ処理をLambdaでやった時にスケーリングできない
→IPが足りない
→VPCにサブネットENIおよびIPがない。
AWS Limit Monitor
CloudWatch + Lambda + SNS
ビジサポ必須
CloudTrail
CloudTrailはグローバルサービスオプションを有効にすると、複数のリージョンにおける証跡を一元化することができる。
データイベント→S3オブジェクトのAPIオペレーション
管理イベント→SGの設定、ログ記録の設定、デバイスの登録などなど
CloudTrailとCloudWatchEventsを統合して、CloudWatchEventsがアラームを起こす。
CloudTrail単体では不正なアクティビティは検出できない。
CloudTrailの設定
新しいS3バケットを各アカウントに設定
S3バケットへのアクセス制御のIAMロールを作成する
S3バケットへのアクセス制御のバケットポリシーを作成する
トラフィック監視
VPCに出入りするトラフィックをIPS/IDSシステムでみはる
環境内の変更を見張るにはCloudTrailとCloudWatchを使う
ログの集約
ログ管理専門のAWSアカウントでKinesis Data Streamを作成する
各アカウントからData Streamのサブスクリプションを利用してCWatch LogsからData Firehoseストリームに配信してログ管理専門アカウントのS3バケットにログを保存する。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/Subscriptions.html
Redshift
Redshiftはクロスリージョンスナップショットコピーを行うことが可能である。
移行先でマスターキーのセットアップを行う。
ただ、Multi-AZは組めない。
自動スナップショットを持つようにし、クロスリージョンスナップショットコピーを実行すれば、DRサイトに自動で複製される。
IAM
リクエスタ支払いをしたい場合、クロスアカウントアクセスは使わない。ロール作成元(ブーメラン)に料金が飛んでしまうから。
PowerUserAccess
開発者の権限管理にうってつけ。
IAM、Organizationsの権限がなく、そのほかの権限が全てあるので。
Organizations
SCPをOUに付与する際は、アカウントを1つ1つ移動していく
IAMのサービス最終アクセスデータや、CloudTrailで問題ないか確認をしておく。
認可には使用できるが、認証には使用できない。
#ストレージ系
RDS
RDSで読み取り多発の場合は、
・ストレージをプロビジョニングIOPSタイプにする
・リードレプリカを準備する
・もしくはECacheを手前に置く。
RDSで書き込み多発して、将来的に厳しい場合
・Kinesis Data StreamsとLambdaを用いてデータを取り込み処理する
・RDSからDynamoDBに移行する。
別リージョンにリードレプリカを作成することができる。
これで1つのリージョンにデータを集約させることができる。
EC2
EC2で書き込みが遅い場合は
RAID0にしてストライピング(複数のHDに同時に分散して読み書き)化を行い、性能を上げる
RAID1はミラーリングで耐障害性を上げる。
インスタンスタイプをあげてIOPSを上げる。
ハードウェア専有インスタンスを作成しても同じ物理サーバ上で作り続けられるとは限らない
スケーリングする際は、CloudWatchアラームを使用してAuto Scalingポリシーを作成する。
EBSのI/Oパフォーマンステスト
テストの前に全てのブロックを読み取り、事前にEBSが温められていることを確認する
DynamoDB
書き込み
DynamoDBで動作が遅い場合(書き込み)には、SQSキューを起動
大量の書き込み案件には、
フロントにAuto Scaling EC2、その後ろにバッファリングのためのSQS、そしてDynamoDBがベスト。
DAX
DAXのメモリキャッシュサービスを使うことにより、読み込み性能が向上する。
リザーブドキャパシティ
DynamoDBで性能を上げたい場合は、
リザーブドキャパシティを購入しておいて、割り当てると良い。
リージョン間同期
DynamoDBで複数のリージョンでデータを同期させたい時は、
Dynamoグローバルテーブルを活用し、Streamオプションを有効にしておく。
昔はDatapipelineによるLastupdated属性によるフィルターによるコピー
リージョン間同期(DR的な)
クロスリージョンレプリケーションも使える
グローバルセカンダリインデックス
パーティションキーとソートキーをもつインデックス。ベーステーブルのものとは異なる可能性がある。
全てのパーテションにまたがりベーステーブル内の全てのデータを対象とする可能性があるので、グローバルと呼ぶ。
ローカルセカンダリインデックス
パーティションキーはベーステーブルと同じだが、ソートキーが異なる。
同じパーティションキー値を持つベーステーブルのパーティションに限定されるという意味でローカル。
Aurora
Aurora Serverless
使いどころ
・予測不可能なワークロードのとき
・使わない時がある場合(自動でシャットダウンできる)
制限
・パブリックIPを割り当てることはできない(VPC内からのみアクセス可能)
S3
S3DistCp→書き込み処理が原因でアプリ動作が不安定な場合
S3DistCp + EMRで分散DBのような振る舞いをさせることも可能
To オンプレDB
DistCpでHDFSに効率的にコピーできる。
そこからEMRの機能が使える。
S3 Transfer Acceleration
アップロードパフォーマンスを向上させる
Hadoop
MapReduce
Mapでキーバリューをマッピングし
Reduceで欲しいデータを集計する。
HiveはMapReduce処理をSQLライクにできる。
EFS
性能向上
1つのEBSボリュームを複数のEC2で共有する場合に、性能が出ないときはEFSを使う。
EFSは複数AZ間で共有できる
DBクラスタ
DBクラスターの性能を上げたい場合
・ENAの拡張ネットワーキングを使う
・クラスタープレイスメントグループを使う(単一AZ内のインスタンスを論理的にグループ化)
・ジャンボフレームを有効にする
ホストのアフィニティ
有効にしておくと、特定のホストで起動したインスタンスが停止しても常に同じホストで再開される。
大容量データの処理とBIをマネージド
Atheta + QSight
Lambda@Edge
CloudFrontサイトなどでUX(ログインが遅いなど)が悪い場合
A/BテストやB/Gデプロイで役に立つ。
CloudFrontを使っていて、ログイン処理などが遅い時
・Lambda@Edgeで近いところで認証処理
・オリジングループを作って、オリジンフェールオーバーをセットアップ
RDS障害発生時
DB障害が起きた時、RDSイベント通知を行うように設定しておく
通知を受けたらLambdaをトリガーにして、リードレプリカがあればそれをマスターに昇格させる。
設計系
SQS
リージョン間でデータの処理などをレプリケーションしたい場合は、スケールアウトできるSQSを仲立ちして処理することもできる。
AppStream
マネージド型ストリーミング提供サービス
RDSを使用して、ユーザーアカウントの管理や保存などができる。
ECS
特徴
・Dockerコンテナに対応した管理システム
・VPCやELB、EBS、IAMなどが利用できる。
デプロイ
Elastic Beanstalkは、デプロイとスケーリングを簡単に行うことができるのでコードの記述に集中できる。
なので、この上にECSを乗っければ、環境を意識せずにより楽にアプリをリリースできる。
SAM
CI/CD
サーバレスでCI/CDパイプラインを構築する場合は、
SAMを使用して、CBuild、CDeploy、CPipelineを構築する。
Cognito
認証
モバイルアプリで大量ユーザーがいる場合、認証はCognitoを使う
SNSを使ってデバイスにサイレントプッシュ通知→ユーザーには表示されない。
モバイルアプリの設計
モバイルアプリでデータをクライアントに即時に投げたい時
SQSにリクエストを投げて、EC2 groupがDynamoからデータを引っ張り出し、Mobile Pushを使用してクライアントモバイルに送信する。
リアルタイムデータのDWHへの格納と過去データ削除
KinesisーLambdaーEMRーRedshift
API GW
API Gateway Lambda統合
・APIメソッドをLambda関数に統合する
・CognitoユーザープールでAPIヘのアクセス制御
・DynamoDBで永続的ストレージを提供
・保護されたS3バケットでコンテンツ配信するために署名つきURLを使用
Elastic Cache
Elastic Cacheクラスターのデータ耐久性は
・自動バックアップ
・Redis追加専用ファイル(AOF)を利用した手動バックアップ
・自動フェールオーバーを備えたマルチAZセットアップ
Kinesis
Data Streams
ストリーミング
拡張ファンアウト
コンシューマとシャード間に論理的な2MB/sのスループットパイプを提供する→データストリームから読み取る処理を増やせる。
Firehose
データストリームをAWSのサービスに直接ロードする
S3とか。
DataPipeline
タスクランナーはDatapipelineから実行するタスクを受け取るためにPollForTaskを呼び出す。
バックアップ系
バックアップサイトですぐに復旧させたい場合
DBはクロスリージョンレプリケーションで別リージョンのS3に保存
トランザクションログはRPO以内に収まるようにする。
クロスリージョンレプリケーションはS3でもGlacierでも使える
移行系
Snow系
Snowmobile1つよりはSnowball複数のほうが効率はいい。
SMS
SMSはDB2をサポートしていない。DB2はDMSを使え!
DMS
DMSはRDS on VMwareには対応していない。
データ変換(SCT)
Aamzon MQ
Apache ActiveMQ用のメッセージブローカー
移行対象
DMSでOracleDBを移行する場合、暗号化などはほとんど対応している(TDEなど)
Storage Gateway
ファイルゲートウェイ
NFSなどのファイルプロトコルを使用して、S3でオブジェクトの保存と取得ができる。直接アクセスできる。バックアップファイルなどをおいておくと良い。
テープゲートウェイ
S3に保存されたデータに直接アクセスすることはできない。(Storage Gateway APIを使う必要がある)
Glacierへのアーカイブが可能である。
キャッシュゲートウェイ
AWS側でストレージボリュームを作成して、オンプレサーバにアタッチして低遅延アクセスを可能にする。
Discovery Service
各仮想マシンにエージェントを入れて、デプロイすれば、全ての情報を収集できる。
※エージェントレスだと全ての情報は収集できない。
※サーバ間のネットワーク情報や、ワークロードなどを入手したい場合はエージェントを入れるしかない。
別リージョンへの移行
PEMキーは別リージョンにコピーされないが、同じPEMキー名で起動されることを確認する必要がある。
オンプレ
オンプレアクセス低減
オンプレミスで、大量トラフィックを捌くためにはCloudFront distributionをAWSに立てて、Route53でそちらに向けておく。そうすることで、エッジにキャッシュされ、オンプレへのアクセスが減る。
移行ステージ
リホスト
手動で移行したり、SMSを使ったりなどでとりあえず移行すること
リプラットフォーム
既存のコアアーキテクチャを変更せずにメリットを享受する
RDSに置き換えたりなど
再購入
別の製品に移ること
使用してきたライセンスモデルを変更する
リファクタリング
使用停止
役に立たないのでやめる。
保持
移行する準備ができてないのでそのままにする。