AWS Devday2020雑記
Page content
AWS DevDay Online Japanに参加したので雑記。
仕事の都合で部分部分しか参加できていないですが。
サーバーレス
コスト削減
- CloudFront->S3でキャッシュ使え、ApiGatewayでキャッシュ使え
- ロググループの保持期間 1年も必要?RetentionInDays設定
- RestAPIよりHttpAPIの方が安い
- lambdaのcompute saving planで1年分/3年分まとめて購入
- ec2,lambda,fargate
セキュリティ
- lambdaのメモリ設定に比例して割当CPUも変わる
- lambda power tuningで確認
- メモリ/CPU上げると実行時間も下がって安くなったりする
- vpc lambdaにするとネットワーク,リージョンサービスから切り離される
- これを利用してセキュアに保ってもいい
- api gateway, lambdaともsourceIP, sourceArnをpolicyで設定できる
- 属人化しないようにルール化できる
コンテナ開発
環境変数
- 動作環境毎に異なる情報を変数として切り出す
- コード/コンテナに入れない
- セキュリティリスク ソースの属環境化
- 外から渡す
- 起動時に渡す / アプリから必要な時に取得
- AWS SystemsManager, SecretsManager, S3
デプロイ
- コンテナのデプロイ時間短縮
- コンテナイメージサイズを小さく
- BaseImageで軽量選択(alpine, scratch, busybox)
- 言語(シングルバイナリ/Golang)
- Dockerfileの書き方
- 不要なものを入れない
- .dockerignoreを利用
- マルチステージビルド
- アプリケーション起動時間を短縮
- root以外で実行
- 必要なファイルはイメージとしてパッケージング
- 実行環境に近い(同一リージョン)ECRイメージレジストリ利用
- ECRイメージスキャンで定期的に脆弱性スキャン
ログ
- 利用目的によって構成を変える
- 保管目的(頻度低 期間長)
- Kinesis Firehose -> S3で保管
- 分析目的(頻度中 期間中)
- Kinesis Firehose / Stream -> S3 -> Athena / Redshift
- Kinesis Firehose -> S3 -> Data Analytics
- 監視目的(期間少 リアルタイム)
- Cloudwatch
- Kinesis Firehose -> Elasticsearch / kibana
モニタリング
- ContainerInsights
- X-Ray
DynamoDB初心者向け
- 適切なProvisionedCapacityUnit設定できるならOndemanより安い?
- 先にテーブルを作り始めるのはNG
- DynamoDBはデータ操作アクションが限られ、欲しいデータが持ってこれない 力技で持ってくると高い
- データ、アクセス形式を固めてから作り始める
- Streams、TTL、PointInTimeRecoveryは意識して使う
- Partition毎に極端にアクセス偏るKey設計すべきではないが、AdaptiveCapacityが対応してくれるのでそんなに気にしなくてよい?
- アイテムサイズは減らす
- CUは4KB、大きくとも1アイテム4KB以内に納めるべき
- Queryで複数とってもCU消費しないように、本当はもっと小さい方がいい
- 画像データとか入れない、S3に置いて配置先を入れる
- Scanは高いからあまり使わないように
- 本当に最新データが必要か考える
- 基本結果整合性で読む
- アプリでキャッシュしていいものはキャッシュ
- GSI OVERLOADING使う
- GSIで1つCU節約しつつ柔軟にクエリ出来る
- 先にローカル設計綿密にしてから作る
- DynamoDB Local
- ローカル環境向けDynamoDB
- Dockerコンテナで提供、TTLとStream対応
- WorkBench
- データモデル設計、そのままimportとかできる
DBの使い分け
- 要件をブレイクダウンして高い開発効率、低い運用負荷のDBを選ぶ
- アクセスパターン、データ量、スケールパターン、ユースケース、機能要件、エンジニアのスキルセット
- Working Backwards クエリを想定したデザイン 目的→必要なデータ→必要なクエリ
- 例①
- 文書管理 タグや著者名、コメントを付与
- データ量TB/そんなに多くない、不定形データ、ピークあり スパイクアクセスは無い 想定リクエスト数万/sec
- →DoucumentDB
- データは大きくない 開発効率の良さ 柔軟なデータ構造、クエリ
- クエリベース
- 記事IDで記事取得、作成日時でソートしX件取得、執筆者/タグで検索、記事IDでコメント一覧取得
- 例②
- 例①から変化→スパイクアクセスあり 想定リクエストが数百万/sec
→オートスケールが必要 - DynamoDB Ondemandでピーク対応しながら全体コストを下げられる
- 検索はDynamoDBstreamでElasticsearchに振ってもよい
- 例①から変化→スパイクアクセスあり 想定リクエストが数百万/sec
lambdaでtensorflowを使う
- 厳しいインフラ条件への対応で予測モデルを複数起動
- SageMakerだとスケーリング遅い、無駄スケーリング、高コスト
- lambda上でtensorflow
- 実行時間課金、不規則アクセスに強い
- 環境制約強く高負荷の機械学習に向かない、環境が毎回リセットされる
- lambda用に工夫
- serverlessでモジュールサイズ削減
- python serverles1プラグインでサイズ落とす
- 初期化処理をinitで吸収
- lambdaのinit関数でモデルダウンロード、予測関数抽出を行い二回目以降は実行しない
- lambdaのデメリットは環境構築とサイズ上限
アジャイルでクラウド開発
- ソフトウェアは無形で柔軟性が高い
- ソフトウェア開発の競合優位性とはアジリティである
- アジリティを高め、顧客からのフィードバックを中心に経験主義的アプローチを重ねて価値を高めることが競合優位性になる
- ソフトウェア全体のアジリティを高める必要がある
- バージョン管理、CI/CD、TDD、InfraAsCode、マイクロサービス
- アジリティを高めるためにアジャイル開発をする
- 機能は細かくリリース
- 都度リファクタリング リアーキテクチャリングを行う
- アジャイル開発で成果物を作る、リリースするのにマネージドなクラウドベンダサービスは有効だから使う
- クラウド活用アンチパターン
- EC2インスタンス使いがち マネージドサービスを使わずEC2上にアプリ構築→インフラマネージで苦労
- リザーブドインスタンス買いがち 予算立てやすいから買っちゃう→買った分は使うマインドで無駄設計
- CI/CD整ってない リリースに人の手が多分に入りリリースに心理的負荷→リリース頻度低下、アジリティ低下
- 本番と乖離した検証環境
- 顧客目線でないサービス選定 マーケティング視点で新規サービス利用→SLA÷障害
- 教訓
- 価格やマーケティングなど、システム以外の事案を中心に設計すべきではない