電通総研 テックブログ

電通総研が運営する技術ブログ

Amazon Translate のカスタム用語を CDK で登録する

こんにちは。コーポレート本部 サイバーセキュリティ推進部の耿です。

Amazon Translate による GuardDuty の説明の機械翻訳

電通総研では社内向けクラウド SOC として、案件が管理している AWS アカウントで発生した GuardDuty アラートを集中して監視し、担当者へ通知しています。(参考

SOCのオペレーション

GuardDuty 検出結果には説明(Description)フィールドがあり、検出内容の要約が文章で示されています。
(例)

"Description": "APIs commonly used in Impact tactics were invoked by user AssumedRole : my-role under unusual circumstances. Such activity is not typically seen from this user.",

英語だと分かりづらいことがあるので、案件担当者に通知する時には Amazon Translate のリアルタイム翻訳を利用して、日本語に機械翻訳した説明も合わせてお知らせしています。

import { TranslateClient, TranslateTextCommand, TranslateTextCommandInput } from "@aws-sdk/client-translate";

const client = new TranslateClient();

const command = new TranslateTextCommand({
  Text: "APIs commonly used in Impact tactics were invoked by user AssumedRole : my-role under unusual circumstances. Such activity is not typically seen from this user.",
  SourceLanguageCode: "en",
  TargetLanguageCode: "ja",
});
const result = await client.send(command);
console.log(result.TranslatedText);

翻訳結果

インパクト戦術でよく使われる API は、通常とは異なる状況下で AssumeDrole: my-role というユーザーによって呼び出されました。このようなアクティビティは、通常、このユーザーからは見られません。

概ね自然な日本語に翻訳してくれている印象ですが、一部の用語が(翻訳前からそもそも)分かりにくいことがありました。
例えば「インパクト戦術」と言われてもすぐにピンとくる人はあまりいないでしょう。(原文でも Impact tactics で分かりづらい。Impact というのは GuardDuty において脅威の目的によるカテゴリ分けの一種である。)

カスタム用語で Amazon Translate の翻訳をカスタマイズ

Amazon Translate にはカスタム用語という機能があり、特定の用語の翻訳を事前に登録しておくことができます。これを利用すると翻訳文をより分かりやすくすることができると思いました。
その際、既存の継続的デリバリーの仕組みを利用するために、カスタム用語の登録は CDK で行いたいと思いました。

まずカスタム用語の翻訳のマッピングCSV ファイルで用意します。
今回は「Impact tactics」をより説明的に「データやプロセスの改ざんが目的」という翻訳に割り当てます。

terminology.csv

en,ja
Impact tactics,データやプロセスの改ざんが目的
Persistence tactics,AWS環境への不正アクセスを維持することが目的

あとはこれを Translate に登録するわけですが、残念ながら Translate サービスのリソースは CloudFormation による作成がサポートされていません。(2024/3時点)
こんな時はカスタムリソースを利用します。シンプルな AWS API の呼び出しを行うカスタムリソースなら、CDK の AwsCustomResource コンストラクトで簡単に構築することができます。

// カスタムリソースが使用するポリシー
const policyStatement = new iam.PolicyStatement({
  resources: ["*"],
  actions: ["translate:ImportTerminology", "translate:DeleteTerminology"],
  effect: iam.Effect.ALLOW,
});

// 用語ファイルを読み込み
const terminology = fs.readFileSync("terminology.csv", "utf-8");
const terminologyName = "my-terminology";

// カスタムリソース作成
new AwsCustomResource(this, "Terminology", {
  // リソース作成時:importTerminology APIでカスタム用語を登録
  onCreate: {
    service: "Translate",
    action: "importTerminology",
    physicalResourceId: PhysicalResourceId.of("translate-terminology"),
    parameters: {
      Name: terminologyName,
      MergeStrategy: "OVERWRITE",
      TerminologyData: { File: terminology, Format: "CSV" },
    },
  },
  // リソース更新時:同じくimportTerminology APIでカスタム用語を上書き
  onUpdate: {
    service: "Translate",
    action: "importTerminology",
    parameters: {
      Name: terminologyName,
      MergeStrategy: "OVERWRITE",
      TerminologyData: { File: terminology, Format: "CSV" },
    },
  },
  // リソース削除時:deleteTerminology APIでカスタム用語を削除
  onDelete: {
    service: "Translate",
    action: "deleteTerminology",
    parameters: {
      Name: terminologyName,
    },
  },
  policy: AwsCustomResourcePolicy.fromStatements([policyStatement]),
});

デプロイ後、AWS マネジメントコンソールからもカスタム用語が登録されていることが確認できます。

登録されたカスタム用語

カスタム用語を利用して翻訳を実行させると、より分かりやすい説明文になりました。

const command = new TranslateTextCommand({
  Text: "APIs commonly used in Impact tactics were invoked by user AssumedRole : my-role under unusual circumstances. Such activity is not typically seen from this user.",
  SourceLanguageCode: "en",
  TargetLanguageCode: "ja",
  TerminologyNames: ["my-terminology"], // 登録した用語を使用させる
});
const result = await client.send(command);
console.log(result.TranslatedText);

翻訳結果

データやプロセスの改ざんが目的でよく使われる API は、通常とは異なる状況下で AssumeDrole: my-role というユーザーによって呼び出されました。このようなアクティビティは、通常、このユーザーからは見られません。

執筆:@kou.kinyo、レビュー:@yamada.y
Shodoで執筆されました