AWS Sustainability Scanner を利用してサステナビリティやコスト最適化を意識してみた

AWS Sustainability Scanner を利用してサステナビリティやコスト最適化を意識してみた

Clock Icon2025.01.23

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

みなさん、 AWS Sustainability Scanner 使ってますでしょうか?私は先ほど知りました。

AWS Sustainability Scanner を使うとサステナビリティを意識したアーキテクチャになっているか簡易的にチェックできます。

AWS Sustainability Scanner

AWS Sustainability Scanner は CloudFormation テンプレートに対して、 AWS Well-Architected の持続可能性の柱に沿ったアーキテクチャになっているかチェックするツールです。

https://github.com/awslabs/sustainability-scanner/tree/main

判定ロジックには cloudformation-guard が利用されており、 IaC のコードに対して静的なスキャンを行います。

判定ルール

執筆時点では以下のサービス、項目があります。持続可能性と言いつつ、コスト最適化観点でも非常に重要な要素ですね。

サービス名 内容
API Gateway ペイロード圧縮を行っているか
API Gateway 最小圧縮サイズが 1024 から 2048 バイトの間であるか
CloudFront デフォルトキャッシュビヘイビアで圧縮しているか
CloudFront 各キャッシュビヘイビアで圧縮しているか
CloudFront 各キャッシュポリシーのデフォルト TTL が 24 時間以上か
CloudFront 各キャッシュポリシーの MAX TTL が 24 時間以上か
CloudWatch Logs ロググループの保持期間が設定されているかどうか
CodeCommit CodeCommit で CodeGuru が有効になっているかどうか
EC2 Session Manager を利用しているか。Bastion を使っていないか
EMR タスクノードにスポットインスタンスを利用しているかどうか
Glue タイムアウトをデフォルトの 48 時間に設定していないか
Glue ワーカーをデフォルトの 10 ワーカーに設定していないか
Glue キャパシティ割り当てを設定しているか
Glue 最大キャパシティを設定しているか
Graviton RDS で Graviton を利用しているか
Graviton Lambda で Graviton を利用しているか
RDS Performance Insights を無料期間でもいいので利用しているか
S3 ライフサイクルルールが設定されているか

最新の情報は以下をご覧ください。

https://github.com/awslabs/sustainability-scanner/blob/main/susscanner/rules_metadata.json

やってみる

それでは AWS Sustainability Scanner を試してみたいと思います。

CloudShell 内でインストールします。

pip3 install sustainability-scanner
susscanner --version

curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/aws-cloudformation/cloudformation-guard/main/install-guard.sh | sh
export PATH=~/.guard/bin:$PATH
cfn-guard --version

うまくインストールおよびバージョンが表示されば OK です。

~ $ pip3 install sustainability-scanner
Defaulting to user installation because normal site-packages is not writeable
Collecting sustainability-scanner
  Downloading sustainability-scanner-1.3.0.tar.gz (23 kB)
  Preparing metadata (setup.py) ... done
Collecting typer==0.12.4
  Downloading typer-0.12.4-py3-none-any.whl (47 kB)
     |████████████████████████████████| 47 kB 2.7 MB/s
Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.9/site-packages (from typer==0.12.4->sustainability-scanner) (8.1.7)
Requirement already satisfied: rich>=10.11.0 in /usr/local/lib/python3.9/site-packages (from typer==0.12.4->sustainability-scanner) (13.9.4)
Collecting shellingham>=1.3.0
  Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)
Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.9/site-packages (from typer==0.12.4->sustainability-scanner) (4.12.2)
Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.9/site-packages (from rich>=10.11.0->typer==0.12.4->sustainability-scanner) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.9/site-packages (from rich>=10.11.0->typer==0.12.4->sustainability-scanner) (2.18.0)
Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.9/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer==0.12.4->sustainability-scanner) (0.1.2)
Building wheels for collected packages: sustainability-scanner
  Building wheel for sustainability-scanner (setup.py) ... done
  Created wheel for sustainability-scanner: filename=sustainability_scanner-1.3.0-py3-none-any.whl size=26089 sha256=07ffd46d40421068986966f9d98ee68e61fd3e2173e78ecfa4b36d54d751af53
  Stored in directory: /home/cloudshell-user/.cache/pip/wheels/3e/6b/f2/25a81b154844b20021c7847a9a97599de63ce71ac832bf65c8
Successfully built sustainability-scanner
Installing collected packages: shellingham, typer, sustainability-scanner
Successfully installed shellingham-1.5.4 sustainability-scanner-1.3.0 typer-0.12.4
~ $ susscanner --version
susscanner v1.3.0
~ $
~ $ curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/aws-cloudformation/cloudformation-guard/main/install-guard.sh | sh
Installing cfn-guard version '3.1.2'...
Guard is a general-purpose tool that provides a simple declarative syntax to define
policy-as-code as rules to validate against any structured hierarchical data (like JSON/YAML).
Rules are composed of clauses expressed using Conjunctive Normal Form
(fancy way of saying it is a logical AND of OR clauses). Guard has deep
integration with CloudFormation templates for evaluation but is a general tool
that equally works for any JSON- and YAML- data.

Usage: cfn-guard <COMMAND>

Commands:
  validate     Evaluates rules against the data files to determine success or failure.
                   You can point rules flag to a rules directory and point data flag to a data directory.
                   When pointed to a directory it will read all rules in the directory file and evaluate
                   them against the data files found in the directory. The command can also point to a
                   single file and it would work as well.
                   Note - When pointing the command to a directory, the directory may not contain a mix of
                   rules and data files. The directory being pointed to must contain only data files,
                   or rules files.

  test         Built in unit testing capability to validate a Guard rules file against
                   unit tests specified in YAML format to determine each individual rule's success
                   or failure testing.

  parse-tree   Prints out the parse tree for the rules defined in the file.
  rulegen      Autogenerate rules from an existing JSON- or YAML- formatted data. (Currently works with only CloudFormation templates)
  completions  Generate auto-completions for all the sub-commands in shell.
  help         Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version
Remember to SET PATH include PATH=${PATH}:~/.guard/bin
~ $ export PATH=~/.guard/bin:$PATH
~ $ cfn-guard --version
cfn-guard 3.1.2
~ $

各スタックに対して AWS Sustainability Scanner を実行してみます。

susscanner.sh
#!/bin/bash

# スタック一覧を配列として取得
stacks=($(aws cloudformation describe-stacks --query 'Stacks[].StackName[]' --output text))

# 配列の各要素に対してループ処理
for stack_name in "${stacks[@]}"; do
    echo "Processing stack: $stack_name"

    # テンプレートを一時ファイルに保存
    temp_file="${stack_name}.template"
    aws cloudformation get-template --stack-name "$stack_name" --query TemplateBody --output text > "$temp_file"

    # susscanner で解析
    echo "Scanning template for $stack_name..."
    susscanner "$temp_file"

    # 一時ファイルを削除(必要に応じて)
    rm "$temp_file"

    echo "----------------------------------------"
done

私の環境の場合だと、Lambda に対して Graviton を利用してねとコメントが出てきましたね。

~ $ sh susscanner.sh
----------------------------------------
Processing stack: pcs-blog
Scanning template for pcs-blog...
{
    "title": "Sustainability Scanner Report",
    "file": "pcs-blog.template",
    "version": "1.3.0",
    "sustainability_score": 2,
    "failed_rules": [
        {
            "rule_name": "check_graviton_architecture_usage_in_lambda",
            "severity": "MEDIUM",
            "message": "Use AWS Graviton for Lambda functions, if possible, to take advantage of energy efficiency improvements.",
            "links": [
                "https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/sus_sus_hardware_a3.html",
                "https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/"
            ],
            "resources": [
                {
                    "name": "/Resources/GetAZLambdaFunction/Properties",
                    "line": "508"
                }
            ]
        }
    ]
}
----------------------------------------
Processing stack: aws-sam-cli-managed-default

'str' object has no attribute 'items'
Scanning template for aws-sam-cli-managed-default...
Error occurred Parser Error when parsing `Error encountered while parsing data file: /home/cloudshell-user/aws-sam-cli-managed-default.template, data beginning with
2010-09-09      Managed Stack for AWS SAM CLI
SAMCLIINFO      f860202e-7e45-47ad-bc4f-27c0add960f5    1.126.0
VAL
 ...`
{
    "title": "Sustainability Scanner Report",
    "file": "aws-sam-cli-managed-default.template",
    "version": "1.3.0",
    "sustainability_score": 0,
    "failed_rules": []
}
----------------------------------------
Processing stack: CDKToolkit
Scanning template for CDKToolkit...
{
    "title": "Sustainability Scanner Report",
    "file": "CDKToolkit.template",
    "version": "1.3.0",
    "sustainability_score": 0,
    "failed_rules": []
}

GitHub Actions

この AWS Sustainability Scanner は Actions も用意されています。つまり、デプロイ前にサステナビリティ意識できるってことですね。

https://github.com/aws-actions/sustainability-scanner

まとめ

以上、「AWS Sustainability Scanner を利用してサステナビリティやコスト最適化を意識してみた」でした。

主にコスト最適化観点で Glue などは非常に興味深いポイントでした。

このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.