Slide 1

Slide 1 text

AWS Startup Day 2023 今日ここで! コスト削減ハンズオン Startup Community Hiroaki OGASAWARA (@xhiroga)

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

やること・やらないこと ● やること ○ 実験などで作成したゴミリソースの掃除 ○ 主にアプリケーションを ECSを動かしている方向けの設定 ● やらないこと ○ Reserved InstanceやSavings Planといった、前払い系の施策は紹介しません ○ Cost ExplorerやBilling Dashboardの見方は紹介しません ○ Anomaly Detectionの設定やFinOpsといった、運用には踏み込みません

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

目次 1. 検査 a. AWS Trusted Advisor b. AWS Compute Optimizer c. EC2 Global View d. AWS Systems Manager Automation (AWSSupport-ListEC2Resources) 2. 適応 a. CloudTrail b. EC2の停止・削除 c. EIPの開放 d. ENIの削除 e. CPU・メモリ最適化(ECS) f. 休日・夜間の停止(ECS) g. Fargate Spot h. ECRのライフサイクルポリシー

Slide 6

Slide 6 text

ハンズオンのやりかた ● 本ハンズオンでは「実際にリソースを停止・削除」等することをオススメします。 ● はじめに不要リソースのリストアップをするので、お手元にGoogle Spreadsheetや Notionなどをご用意ください。

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

おことわり ● 本ハンズオンの内容を実施したことで御社に損害があっても、責任を取りかねま す。自信がない方は有識者にレビューしてもらいましょう。 ● 2023-08-29時点の東京リージョンのコストを掲載しています。

Slide 9

Slide 9 text

検査 検査によって適応が可能になる。 ―スクラムガイド

Slide 10

Slide 10 text

サービス マルチ アカウント マルチ リージョン 主な対象 備考 AWS Trusted Advisor ✅ ✅ 各種Reserved Instance, Savings Plan, 各種利用率が低いリソース Organization管理アカウ ントのサポートプランが Buisness以上 AWS Compute Optimizer ✅ ✅ EC2インスタンス, Auto Scalingグルー プ, EBSボリューム, Lambda, ECS Fargate 使用可能なリージョンに 制限あり(東京・大阪 OK) EC2 Global View ❌ ✅ EC2インスタンス, EBS, VPC関連リソー ス AWS Systems Manager Automation AWSSupport-ListEC2Re sources ❌ ✅ EC2インスタンス, ENI, ELB, AMI, EBS スナップショット, EBSボリューム 検査

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

AWS Trusted Advisor ● セキュリティやコストについての自動チェック ● サポートプランによって範囲が異なる ○ ベーシック($0/月)、デベロッパー($29/月):コアセキュリティチェックなど ○ ビジネス($100/月)以上:コスト最適化を含む全て ● Trusted Advisor自体の利用は無料(のはず) ● 主にReserved InstanceやSavings Planが勧められる

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

AWS Compute Optimizer ● AWSのCompute系リソースのコスト最適化のアドバイス ○ EC2: インスタンスサイズ小さくできるよ! ○ ECS Fargate: CPUやメモリサイズ削減できるよ! ● EBSのボリュームサイズ、Lambdaのメモリサイズの適切さについては、Trusted Advisorに統合できる ○ むしろEC2やECSの方が統合してほしいんですが ...? ● 内部的にはCloudWatch Metricsを分析している ● 基本無料 ○ EC2とAuto Scaling Groupを対象に、分析期間を2週間から3ヶ月に延長できる有料機能 あり

Slide 16

Slide 16 text

はじめてオプトインする場合、 数分〜数十分(マルチアカウントの場合) はかかるかも?

Slide 17

Slide 17 text

cloudwatch:GetMetricDataを中心に、 ec2: や autoscaling: 、organizations: の権限

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

この組織のすべてのアカウントを対象にした場合、各メ ンバーアカウントでロールを発行し終わる( =アカウント 画面でエラーが出ない)までに 15分程度かかります。

Slide 21

Slide 21 text

Organizationを有効化している場合、 アカウントを指定する必要ありです。 (一括検索してほしい!)

Slide 22

Slide 22 text

40時間程度メトリクスが取られていないとレコメンドさ れないらしいです。

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

2023-08-31現在、EC2 Auto Scaling Groupが対象 です(ECSは対象外)

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

EC2 Global View ● AWS リージョン全域で、インスタンス、VPC、サブネット、セキュリティグループ、ボ リュームなどの AWS リソースを閲覧できる ● すべてのAWSリージョンで利用可能 ● 全リージョンのデフォルトVPCリソースを削除するのにも便利 ● ユーザーの権限で実行するので、実行にあたり ec2:... のpermissionが必要

Slide 29

Slide 29 text

Organization非対応 気になるリソースがあるアカウントで 実行しましょう。

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

余談: SCPでリージョン縛ってるとめっちゃエラー出ま す笑

Slide 32

Slide 32 text

AWS Systems Manager Automation ● Systems ManagerはオンプレとAWSのサーバー管理のツールセット ● AWSのマネージドサービスも管理できるように進化 ● EC2インスタンス機能のための機能群と、それ以外の機能群 ● ドキュメントという機能があり、これはAnsibleのPlaybookのようなもの ● 今回はドキュメント AWSSupport-ListEC2Resources を用いる

Slide 33

Slide 33 text

Organization非対応 気になるリソースがあるアカウントで 実行しましょう。

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

ロール指定がない場合、現在ログインしているユー ザーの権限で実行されます。

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

検査のふりかえり ● 調べたいリソースはいくつありましたか?

Slide 43

Slide 43 text

適応 まずは、「捨てる」を終わらせてください。 ―近藤麻理恵

Slide 44

Slide 44 text

CloudTrail リソースの停止・削除で最も難しいのは、「本当に止めて/消していいのか?」 CloudTrailで監査ログを調べて、「いつ誰がリソースを作ったか」を確認!

Slide 45

Slide 45 text

サービス 保持期間 対象イベント 転送費用 保存費用 クエリ費用 CloudTrail イベント履歴 過去 90日間 CloudTrailイベント (管理) $0 $0 $0 CloudTrail + S3 + Athena S3に準じる CloudTrailイベント(管理・データ ・Insight)から選択 1つ目の Trailは無料 S3に準じる $5/TB (=Athena) CloudTrail Lake 最大 7 年間 (2557 日) CloudTrailイベント(管理・データ・ Insight), AWS Configイベント, 外部イベントから選 択 $2.5/GB $0 $5/TB CloudTrailとCloudTrail Lake ● すでにCloudTrailの証跡 (Trail) が作成されていれば、それを見る ○ ex: Control Tower ● CloudTrailの証跡を作成する予定がなければ、 CloudTrail Lakeを検討! 参考: [訂正記事] CloudTrail Lakeの保存料金はデータ取り込み時の一度だけでした!(毎月の保存料金は発生しません)

Slide 46

Slide 46 text

アンケート 1. Control Towerを有効化している 2. Control Towerは無効だが、CloudTrailからS3にログを保存している 3. CloudTrail Lakeを有効化している

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

参考: CloudTrailイベントの違い ● 管理イベント ○ ex. S3 Bucketの作成、IAMリソースの作成 ● データイベント ○ ex. S3のGetObject、LambdaのInvokeFunction ● Insightイベント ○ 異常なアクティビティの検知 ○ GuardDutyがEC2やIAMに強いのに対し、幅広いAWSリソースに対 応している強みがある

Slide 51

Slide 51 text

CloudTrail + S3 + Athenaの構築 画像: S3 に保存した CloudTrail のログを Athena でクエリしてRoute 53 のレコードをいつ誰が作成したか調査してみた

Slide 52

Slide 52 text

0.KMSキーにLog Archiveアカウントのアクセス付与 Control TowerでCloudTrailの証跡 (Trail) を作成した方向けです。 KMSカスタマーキーのキーポリシーに以下のステートメントを追記します。 { "Sid": "Allow a LOG ACCOUNT", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::682025012577:root" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }

Slide 53

Slide 53 text

1. (CloudTrail) Athenaテーブルを作成

Slide 54

Slide 54 text

2. (CloudTrail) テーブルを作成

Slide 55

Slide 55 text

3. (Athena) 設定を編集

Slide 56

Slide 56 text

4. (Athena) S3 Bucketを選択 Expected bucket owner について ● 所有アカウントが異なるS3 Bucketに 結果を出力する場合、Bucket名は手 打ちになります。タイポで知らないアカ ウントのBucketに保存しないように、 所有アカウントIDを別途入力できるよ うです。 暗号化について ● AWSのAPI呼び出し時に秘匿すべき 情報を渡しているなら、暗号化すべき かも。

Slide 57

Slide 57 text

参考: S3 Bucketに保存される結果サンプル ● CSVとhive metadataの組み合わせが出力される

Slide 58

Slide 58 text

5. (Athena) お試しクエリ実行

Slide 59

Slide 59 text

CloudTrail Lake

Slide 60

Slide 60 text

● CloudTrail + S3 + AthenaとCloudTrail Lakeで型が異なる ○ CloudTrail + S3 + Athena ○ CloudTrail Lake ● まずは SELECT * でデータの特徴を掴む ● 型によって .(ドット)演算子、element_at、json_extractを使い分ける Athena / CloudTrail Lakeのクエリーのコツ

Slide 61

Slide 61 text

プロパティ Athenaの型 Lakeの型 eventversion STRING string useridentity STRUCT STRUCT eventtime STRING timestamp eventsource STRING string eventname STRING string awsregion STRING string sourceipaddress STRING string useragent STRING string errorcode STRING string errormessage STRING string requestparameters STRING map responseelements STRING map additionaleventdata STRING map requestid STRING string eventid STRING string readonly STRING boolean resources ARRAY array eventtype STRING string apiversion STRING string managementevent N/A boolean recipientaccountid STRING string sharedeventid STRING string annotation N/A string vpcendpointid STRING string serviceeventdetails STRING map addendum N/A map edgedevicedetails N/A map insightdetails N/A map eventcategory N/A string tlsdetails STRUCT structtlsversion:string,ciphersuite:string,clientprovidedhostheader:string sessioncredentialfromconsole N/A string eventjson N/A string eventjsonchecksum N/A string

Slide 62

Slide 62 text

考察 ● CloudTrail Trailは2023-09-02時点でS3に保存する際の形 式を選べず、JSON形式で保存される ● CloudTrail LakeはApache ORC形式に変換して保存してい る ● Lakeはクエリ以外で参照されないので思い切って Apach e ORC形式としたのではないか

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

EC2インスタンスの停止・削除 CloudTrail Lake専用クエリ

Slide 65

Slide 65 text

EIPの開放

Slide 66

Slide 66 text

ENIの削除

Slide 67

Slide 67 text

CPU・メモリ最適化(ECS) 考察 ● 最低値はCPU: 256 (.25 vCPU)、メモリ: (512 MiB) ● CDKのデフォルトは256/512 ● 過去に「挙動が安定しなかった」「本番に大量リクエストがあ り、テンプレートごと修正した」のようなケースで取り敢えず 引き上げて忘れてることがよくある

Slide 68

Slide 68 text

休日・夜間の停止(ECS) ● Application Auto ScalingでCRON式によるサービスの停止・再開が可能 ● Application Auto ScalingにGUIはない ● CLI, API, CDK, Terraformなど、お好きな手段で設定ください ● APIとしてはタイムゾーンを設定できるが、2023-09-02 現在CDKからは設定するこ とができない ○ 頑張ってUTCに変換する

Slide 69

Slide 69 text

休日・夜間の停止(ECS)設定例 { "ScalableTargets": [ { "ServiceNamespace": "ecs", "ResourceId": "service/******", "ScalableDimension": "ecs:service:DesiredCount", "MinCapacity": 0, "MaxCapacity": 0, "RoleARN": "arn:aws:iam::************:role/aws-service-role/ecs.applicati on-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoS caling_ECSService", "CreationTime": "2023-06-14T18:26:19.446000+09:00", "SuspendedState": { "DynamicScalingInSuspended": false, "DynamicScalingOutSuspended": false, "ScheduledScalingSuspended": false }, "ScalableTargetARN": "arn:aws:application-autoscaling:ap-northeast-1:******" }, { "ScheduledActions": [ { "ScheduledActionName": "claim-internal-ecs-start", "ScheduledActionARN": "arn:aws:autoscaling:ap-northeast-1:******", "ServiceNamespace": "ecs", "Schedule": "cron(00 22 ? * SUN-THU *)", "ResourceId": "service/******", "ScalableDimension": "ecs:service:DesiredCount", "ScalableTargetAction": { "MinCapacity": 1, "MaxCapacity": 2 }, "CreationTime": "2023-06-14T18:01:04.088000+09:00" },

Slide 70

Slide 70 text

Fargate Spot ● ECS版のスポットインスタンス ● Savings Planは前払い、Fargate Spotは空きリソースの活用 ● タスクが中断することがある ● だいたいコストが3~4割に抑えられ る。 この期間は バグってたので 無視してください

Slide 71

Slide 71 text

Fargate Spot CDK設定サンプル export const fargateCapacity = (envPrefix: EnvPrefixType): CapacityProviderStrategy => { if (envPrefix == DEV') { return { capacityProvider: 'FARGATE_SPOT', weight: 1, }; } else { return { capacityProvider: 'FARGATE', weight: 1, }; } };

Slide 72

Slide 72 text

ECRのライフサイクルポリシー ● ルールを満たしたECRのイメージを期限切れにする ● 条件は「最新からn個以降」か「プッシュしてからn日以上」 ● 単に「プッシュしてからn日以上」だけ設定すると、うっかりイメージが全部消えて ECSが再起動できない羽目になるので注意(一敗) ● 使用中のイメージは消さないように、タグのprefixの設定を検討する

Slide 73

Slide 73 text

ECRのライフサイクルポリシー 設定例 lifecycleRules: [ { rulePriority: 1, description: 'Retain the last 10 images.', tagStatus: TagStatus.ANY, maxImageCount: 10, }, ],

Slide 74

Slide 74 text

まとめ ● リソースの可視化とコスト削減をしましょう! ● 今日は取り上げませんでしたが、RDSなどもやっていきましょう!