AWS Well-Architected Lens – Serverless Applications まとめ セキュリティ編
アーキテクチャを検討する上で、とても役に立つフレームワークであるAWS Well Archtected Framework。
サーバーレス版が公開されたのでベストプラクティスについてまとめておきます。
https://d1.awsstatic.com/whitepapers/architecture/AWS-Serverless-Applications-Lens.pdf
運用編、セキュリティ編、信頼性編、パフォーマンス編、コスト編の5回に分けてメモしていきます。
解釈が間違っているかもしれないので、ご注意ください。
SERVSEC 1:サーバーレスAPIへのアクセスをどのように承認し、認証しますか?
- 認証/認可の観点からは、APIゲートウェイ内でAPI呼び出しを認可する3つのメカニズムがある
- 一時認証を使用したIAM認可を活用し、それぞれのIAMユーザ、グループ、ロールに最低限の権限を追加することで安全にAPIを呼び出す。
- 既存のIDプロバイダ(IDP)を所有している場合、API Gatewayのカスタムオーソライザーを利用して、IdPに対して特定のユーザーを認証/検証するためのLambda関数を呼び出すことができる。
- IdPを持っていない場合、Amazon Cognitoのユーザープールを活用するか、Facebook、Twitter、Google +、Amazonなどの外部IDプロバイダーと統合することができる。
SERVSEC 2:Lambda機能がアクセスできるAWSサービスについて、どのように境界を強制していますか?
SERVSEC 3:サーバーレスのアプリケーションログをどのように分析していますか?
- CloudWatchのメトリクスフィルタを利用すると、サーバレスアプリケーションの標準出力を、正規表現のパターンマッチングによってカスタムメトリクスに変換して件数をグラフ化することが可能です。
- さらに、アプリケーションのカスタムメトリクスに基づいてCloudWatchアラームを作成することで、アプリケーションの動作を素早く把握できる。
- AWS CloudTrailログは、監査とAPI呼び出しの両方に使用する必要がある。
- トラブルシューティングの際に、ステージ全体ではなく個々のメソッドに対してAPIGatewayログを有効にすることを検討する。
- サーバーレスアプリケーションの設計によっては、機密データが含まれている場合があるので注意する。
- Lambda関数のコード内でCloudWatchに対するAPI呼び出しを行うと、不要なデータがログに取り込まれる可能性がある。
- API Gatewayはリクエスト/レスポンスの全てを記録することがあり、コンプライアンス要件に違反する可能性がある。ロギングを有効にする前に、コンプライアンスチームに確認する。
SERVSEC 4:サーバーレスアプリケーション内の依存関係の脆弱性をどのように監視していますか?
SERVSEC 6:サーバレスアプリケーションで機密データをどのように保護していますか?
- API Gatewayは、すべての通信でSSL/TLSを使用する。URLの一部であるリクエストパスとクエリ文字列は暗号化されないので注意が必要です。
- 暗号化されたHTTPペイロードはAPI GatewayやLambdaから受信すると複合されるので、標準出力に出力された場合、機密データがCloudWatchログを介して誤って公開される可能性があるので注意。(ここ自信なし)
- 不正な入力や傍受された入力は、システムへのアクセスを得るか、誤動作させる攻撃として使用することができる。
- 機密データは、すべてのレイヤーで常に保護される必要がある。
- API Gateway, Lambdaに関して、機密データはデータ操作前にクライアント側で暗号化されるか、HTTP POST要求の一部として送信される必要がある。ヘッダを暗号化することも含まれる。
- これにより、CloudWatchログのデータが公開された場合のデータ漏洩が防止される。
- 暗号化されたデータはDynamoDB、Amazon ES、またはAmazon S3のいずれかに永続させる。
- 機密データが暗号化されていないAPI Gatewayでのログ記録を有効にすることもお勧めしない。API Gatewayのログを有効にする前に、コンプライアンスチームと相談してください。
AWS Well-Architected Lens – Serverless Applications まとめ 運用編
アーキテクチャを検討する上で、とても役に立つフレームワークであるAWS Well Archtected Framework。
サーバーレス版が公開されたのでベストプラクティスについてまとめておきます。
https://d1.awsstatic.com/whitepapers/architecture/AWS-Serverless-Applications-Lens.pdf
運用編、セキュリティ編、信頼性編、パフォーマンス編、コスト編の5回に分けてメモしていきます。
解釈が間違っているかもしれないので、ご注意ください。
SERVOPS 1:サーバレスアプリケーションの異常をどのように監視し、対応していますか?
- サーバーレス・アーキテクチャーの性質上、分散トレースを行うことは基本。
- サーバーレスアプリケーションを変更すると、展開、変更、およびリリース管理が必要。
- AWS X-Rayの分散トレース機能を使用することで、可視化されたサービスマップから迅速にトラブルシューティング行う。X-Rayは、パフォーマンスの低下を特定し、レイテンシ分布を含む異常を迅速に理解できる。
- 個別レベルと集約レベルのアラームの設定が必要。
- ビジネスとアプリケーションの洞察を捕捉するために、CloudWatchのカスタムメトリクスを使用する。
SERVOPS 2:変更の影響を最小限に抑えながら、サーバーレスアプリケーションをどのように進化させていますか?
- API Gateway ステージ変数は、リリースするときに変更の数を最小限に抑えるのに役立つ。たとえば、ステージ変数は$ LATESTではなくLambdaのエイリアス名を参照できる。
- AWS SAMを使用して、サーバレスアプリケーションをパッケージ化、デプロイ、モデリングする。また、SAM Localを使用すると、Lambda関数をローカルに開発する際のデバッグサイクルを高速化できる。
- Lambda環境変数は、ソースコードと設定を分離するのに役立つ。たとえば、Lambda関数内で呼び出されたリソース名を変更する場合は、コードではなく環境変数のみを変更する。
- 複数サーバーにまたがって共有している構成や鍵を制御する場合、環境変数に対してAmazon EC2システムマネージャ(SSM)のパラメータストア機能を検討する。パラメータストアで追加の遅延が発生する可能性があるため、SSMパラメータストアまたは環境変数の使用を決定する際にベンチマークを実行する必要がある。
- 注: A/Bテストは、LambdaのTraffic Shifting機能で実現できる。変更時の停止時間をゼロにすることを推奨。
- SAM Localは、パフォーマンスの目安としては使用しない。AWS環境では、計算リソースとネットワークレイテンシーが大きく異なるため、別途テストが必要。
- API Gatewayステージ変数とLambdaエイリアス/バージョンは、ステージを分けるために使用してはいけない。これは、デプロイ単位のモニタリングの可視性を低下し、ツールの複雑さが増す。(ここ自信なし)
- X-Rayは、AWS Lambdaの初期化や使用されているサービスの絞り込みなど、サービスメトリクスの詳細を提供している。CloudWatchのメトリクスだけでなく、X-Rayも使用する。これは、異常を特定して対応する際に役立つ。
EC2インスタンスの起動停止スケジューラー(CloudFormation)
起動時間、停止時間、タグを指定するだけで簡単に動きます。
下記リンクを参考にしました。
dev.classmethod.jp
JAWS DAYS 2018 参加レポート
去年に引き続き今年も参加。
AWSのコミュニティが集まるイベントで、今年は1800人を超えたそうです。
海外コミュニティからの参加も多く、AWSのChiefエバンジェリストであるJeff Barrとツーショットで写真撮影してきました。
2018/03/21 追記
スライドまとまってました。見たセッションの資料ものせておきます。
JAWS DAYS 2018 スライドまとめ - Qiita
エッジデバイスでディープラーニング! AWSを活用したエッジデバイスマネジメントの紹介 河崎 敏弥
IoTでの推論環境 エッジを使うべき状況
— 山野 健太 (@yamano3201) 2018年3月10日
・低レイテンシ
・オフラインでも実行可能
・処理済みの少量データのみクラウドに送れる
・ローカル環境からデータが出ない。学習データはクラウドに蓄積が必要#jawsdays #jd2018_c
推論部分をなるべくIoTデバイス側で行えるかがカギになりそうです。
まだプレビューですが、Greengrass Inferenceに期待。
コニカミノルタのIoTの取り組み 中村 明彦
コニカミノルタのIoT。会社説明系セッション。コンセプトムービーに複合機はもう出てこないんだな。#jawsdays #jd2018_c
— 山野 健太 (@yamano3201) 2018年3月10日
[ランチタイムセッション] アールスリーインスティテュート
power budget
— 山野 健太 (@yamano3201) 2018年3月10日
自身の生産性を向上させるためスキルアップを目指し勉強するための予算を個人が持ってる
報告は不要#jawsdays #jd2018_a
「AWS Technical Evangelists Special talk session -スペシャルトークセッション AWSとユーザーコミュニティが生み出すNo borderな未来-」 Jeff Barr / Randall Hunt / Julio Faerman / Channy Yun / 亀田 治伸
ハンズオンが重要。認定取得には本が重要 #jawsdays
— 山野 健太 (@yamano3201) 2018年3月10日
いつも過去を見て未来を見ていなかった。我々はちょっとだけ未来にいる #jawsdays
— 山野 健太 (@yamano3201) 2018年3月10日
学習したことは無駄にならない #jawsdays
— 山野 健太 (@yamano3201) 2018年3月10日
Learn and Be Curious #jawsdays
— 山野 健太 (@yamano3201) 2018年3月10日
これからも手を動かしてアウトプットしていきます。
サービスをスケールさせるために〜AWSとAWS利用者の技術 荒木 靖宏
www.slideshare.net
direct connect gateway。東京のオンプレミスと海外のVPCを繋ぐことができる。#jawsdays #jd2018_i
— 山野 健太 (@yamano3201) 2018年3月10日
最近のMediaServiceから始まり内容盛りだくさんでした。スライド公開希望。
編集業務の生産性向上へ向けたserverlessなアプローチ(EditTech) 落合 隆文
自動校正。自動見出し作成。#jawsdays #jd2018_b
— 山野 健太 (@yamano3201) 2018年3月10日
既存のサービスの置き換えというよりは、新しい社内向けサービスをserverlessで構築したお話でした。少人数でやっているみたいですごい。
aiboの心はAWSの中にある?(RoboTech) 森本 良平
aiboの話。HOWはAWS一択だった#jawsdays #jd2018_b
— 山野 健太 (@yamano3201) 2018年3月10日
aibo、wifiなくても繋がる。
— 山野 健太 (@yamano3201) 2018年3月10日
AWS IoTで常時接続、双方向通信が可能。
デバイス認証機能で個体認証。#jawsdays #jd2018_b
aiboとクラウドをどうつなげよう?工場、ソニーストア、コールセンターなどから得た情報を紐づけた。すごい、、#jawsdays #jd2018_b
— 山野 健太 (@yamano3201) 2018年3月10日
デバイス認証の話はいつも気になるところ。各部署から情報を集めて実現というのが驚いた。各部署にAPIを叩いてもらって実現しているように見えました。こちらもスライド公開希望。
[DeepDive] AWS Japan SA Lightnings! 浅野佑貴 / 藤原吉規 / 福井厚 / 江川大地 / 塚越啓介 / 桐山隼人 / 畑史彦 / 大村幸敬
www.slideshare.net
lambda@edgeで画像リサイズhttps://t.co/Dx2CqPyVHS#jawsdays #jd2018_h
— 山野 健太 (@yamano3201) 2018年3月10日
www.slideshare.net
guard duty。まず有効にする。#jawsdays #jd2018_h
— 山野 健太 (@yamano3201) 2018年3月10日
サービスだけでは脅威に対応できない。コミュニティベースのホワイトエコシステムで対応しよう#jawsdays #jd2018_h
— 山野 健太 (@yamano3201) 2018年3月10日
www.slideshare.net
CFnの話
— 山野 健太 (@yamano3201) 2018年3月10日
・YAML使う
・jsonはcfn-flipで変換
・クロススタックで分ける
・SSM parameter store 便利
・drift detection
他5つある#jawsdays #jd2018_h
AWS SAによる連続LTでした。CloudFormationの話は参考になりそうでした。スライド希望。→スライド貼りました
雑談
いろいろな人と話ました。メモしておきます。
- Well Archtectedレビューは強制するのはダメ。
- Cloud9で共同作業をするときにCodeCommitへのコミット履歴はどうなるか。
- IAMユーザ単位でのアカウント払い出しになるのでコミット履歴もわけられる。
- GuardDutyは全リージョンに設定するべきか。
- 全部するのが好ましい。お金かからないし、逆に使ってないリージョンに対してオンにするのもありかもしれない。CloudWatchイベントとかSNSをリージョンごとに設定しないといけないのが少し不便。
AWS 役割別 IAM管理ポリシー
IAMポリシーを役割別に管理しようとすると、どんどん複雑になっていきます。
例えば、管理者と開発者は分けたいとか、本番環境のアクセスは絞りたいとか、いろいろあると思います。
個人的には用意されているものを組み合わせて使うのが良いと思っています。
ということで、よくリンクがわからなくなる「職務機能の AWS 管理ポリシー」をメモしておきます。
docs.aws.amazon.com
- 管理者: AdministratorAccess
- 請求: Billing
- データベース管理者: DatabaseAdministrator
- データサイエンティスト: DataScientist
- 開発者パワーユーザー: PowerUserAccess
- ネットワーク管理者: NetworkAdministrator
- システム管理者: SystemAdministrator
- セキュリティ監査人: SecurityAudit
- サポートユーザー: SupportUser
- 閲覧専用ユーザー: ViewOnlyAccess
開発時はIAMをいじれる人はAdministratorAccess、IAMをいじれない人はPowerUserAccess or SystemAdministratorにしておいて、本番運用が始まるときに他のポリシーにして権限を絞るイメージでしょうか。
あとは必要に応じてBillingをつけましょう。
監査要員はViewOnlyAccessで充分でしょう。ただしS3に個人情報などが入ってる場合は、S3側でアクセスをちゃんと絞りましょう。(例えばVPCエンドポイントで絞る)
無停止でEBSのボリュームを変更する方法(Linux)
Linuxで無停止でEBSのボリュームを変更する方法をメモしておきます。
公式を参考にしました。
Linux の EBS ボリュームのサイズ、IOPS、またはタイプの変更 - Amazon Elastic Compute Cloud
コンソールからEBSのボリュームを変更する
インスタンスにログインして事前確認。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 80G 0 disk └─xvda1 202:1 0 80G 0 part /
コンソールからEBSのボリュームを選択して、「ボリュームタイプ」、「サイズ」を変更します。
80Gから400Gに変更されました。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 400G 0 disk └─xvda1 202:1 0 80G 0 part /
ボリュームのファイルシステムを拡張する
まずは事前確認。80G全てを使いつくしています。
$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvda1 82436764 82336544 0 100% / devtmpfs 1920364 60 1920304 1% /dev tmpfs 1928944 0 1928944 0% /dev/shm
パーティションを拡張します。
$ sudo growpart /dev/xvda 1 CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=167768030,end=167772126 new: size=838856670,end=838860766
つづいて各ファイルシステムのサイズを新しいボリューム容量に変更します。
$ sudo resize2fs /dev/xvda1 resize2fs 1.42.12 (29-Aug-2014) Filesystem at /dev/xvda1 is mounted on /; on-line resizing required old_desc_blocks = 5, new_desc_blocks = 25 The filesystem on /dev/xvda1 is now 104857083 (4k) blocks long.
事後確認して終了。
$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvda1 412716188 82343232 330272708 20% / devtmpfs 1920364 60 1920304 1% /dev tmpfs 1928944 0 1928944 0% /dev/shm