🧠

CodeWhispererの機能まとめ

2024/03/06に公開

What is CodeWhisperer?

以下公式ドキュメントを参照している
https://docs.aws.amazon.com/codewhisperer/latest/userguide/what-is-cwspr.html

料金とライセンスについて

料金は2つのライセンスから選べる。

  • Free ライセンス
    • AWS アカウント不要。 Builder ID のみあればいい。
    • 無料。
  • Professional ライセンス
    • IAM Identity Center(旧SSO)でAWSアカウントの用意が必要
    • 19USD/ユーザ/月

今回は個人的に試したかっただけなので、Free ライセンスで動かしてみました。

機能について

Dashboard(公式

Professional ライセンスでのみ使用可能。
何が見れるのか?

  • CodeWhispererの提案をどれくらいの頻度で受けているかを示す受諾率
  • 受諾率のような項目を言語ごとに絞り込める

Code impact セクションでわかること

  • CodeWhisperer の提案を受け入れた行数
  • 参照しているオープンソースプロジェクトの数

Security scans

  • 何回セキュリティスキャンされたかがわかる

language

対応している言語について

  • プログラミング言語

    Java
    Python
    JavaScript
    TypeScript
    C#
    Go
    PHP
    Rust
    Kotlin
    SQL
    Ruby
    C++
    C
    Shell
    Scala
    
  • IaC系

    JSON (AWS CloudFormation)
    YAML (AWS CloudFormation)
    HCL (Terraform)
    CDK (Typescript, Python)
    

Security scans

  • 静的アプリケーション・セキュリティ・テスト(SAST)
    • SASTとSCAの違いについて(参照)
  • 秘密検出
  • Infrastructure as Code(IaC)スキャン

上記方法によるスキャンで、セキュリティ・ポリシー違反や脆弱性を検出できる。
VSCode などのIDEでスキャンすると問題が Problems タブに表示される。

対応言語

セキュリティスキャンできる言語は限られている。

Java ‐ Java 17 and earlier
JavaScript ‐ ECMAScript 2021 and earlier
Python ‐ Python 3.11 and earlier, within the Python 3 series
C# ‐ All versions (.Net 6.0 and later recommended)
TypeScript ‐ All versions
Ruby ‐ Ruby 2.7 and 3.2
Go ‐ Go 1.18
Infrastructure as Code (IaC) languages
  AWS CloudFormation
  Terraform ‐ 1.6.2 and earlier
  AWS CDK - TypeScript and Python

Javaに対してスキャンを実行する場合、事前にビルド生成物を作成する必要がある。

Security scans - CodeWhisperer

Security scans 実行例(Java)

以下のようにエラーを吐いてくれる。

CWE-390 - Catching and not re-throwing or logging exceptions

Problem: An exception has been ignored. The catch-block hides information about the stack trace. Not logging or forwarding the stack trace of an exception can mask unexpected errors and complicated debugging.

要は例外が握りつぶされている場合に出る警告。

public ClientsRecord find(String clientId)
    {
        try {
            ClientsRecord clientRecord = create.selectFrom(CLIENTS)
                    .where(CLIENTS.CLIENT_ID.eq(clientId))
                    .fetchOne();
            return clientRecord;
        } catch (Exception e) {
            return null;
        }
    }

CWE-755 - Stack trace not included in re-thrown exception

Consider passing the exception object either as "rootCause" or as an inner exception parameter, to the constructor of the new exception before throwing new exception. This will help keep stack trace.

例外は再スローされているが、内容を受け継いでいない。

} catch (Exception e) {
    throw new UsernameNotFoundException("ユーザー名かパスワードが間違っています");
}

CWE-597 - Incorrect string equality operator

Use equals() method to compare the string values.

Javaの文字列比較は equals() を使うべき。

if (resType != "code") {
    throw new Exception("unseported response type error");
}

感想

無料で使えるし、セキュリティスキャンはシンプルに使えそう。

コードの提案についてはテストコード生成程度なら無料だし使ってみると良さそうだった。

Copilotより手軽に使える簡易版といった感じだろうか。

Discussion