![[アップデート] AWS Transform でアーティファクトの保存先に自分の S3 バケットを指定できるようになりました](https://images.ctfassets.net/ct0aopd36mqt/6sr6qXoJHrSGCktI3d56Hk/4504fc5f0b23d1e8430dfc948c18f606/aws-transform.png?w=3840&fm=webp)
[アップデート] AWS Transform でアーティファクトの保存先に自分の S3 バケットを指定できるようになりました
いわさです。
AWS Transform はアプリケーションのモダナイゼーションやマイグレーションを AI エージェントで支援してくれるサービスです。
AWS Transform ではトランスフォーメーションの過程で様々なアーティファクト(変換計画、コード差分、レポートなど)が生成されますが、これまではサービスが管理する S3 バケットに保存される仕組みでした。
そのため、アーティファクトの保存場所や暗号化方式を自分たちのポリシーに合わせて管理したいケースでは対応が難しい状態でした。
先日、AWS Transform で自分の S3 バケットをアーティファクトの保存先として構成できるようになりました。
自分のバケットを使うことで、カスタマーマネージド KMS キーによる暗号化やバケットポリシーによるアクセス制御を自分の AWS アカウント内で管理できるようになります。
また、複数の AWS アカウントにまたがるアーティファクトストレージの一元管理や、バケットへの直接アップロードも可能になったようです。
今回こちらを確認してみたので紹介します。
実際に確認してみる
AWS Transform コンソールの Settings から構成を確認してみます。
デフォルトの状態を確認
まず、Settings 画面の「Artifact storage」セクションを確認します。
デフォルトでは「AWS Transform managed storage」が選択されています。

なお、この設定は AWS Transform の有効化時にも選択できるようになっていました。
最初から自分のバケットを使いたい場合は有効化のタイミングで指定できます。

バケットの構成
Settings の「Edit」を押すと「Edit artifact storage」画面が表示されます。
「Use my own S3 bucket」を選択すると、バケットの S3 URI や KMS キーの ARN を入力するフィールドが表示されます。
同一アカウントのバケットだけでなく、別の AWS アカウントのバケットも指定できるようになっています。

上部に「Changing artifact store S3 location would cause data linkage to break in AWS Transform, all current jobs could fail.」という警告が表示されています。
進行中のジョブがある場合は切り替えに注意が必要みたいですね。
保存時にバリデーションが実行されるので、いくつかエラーパターンを試してみました。
まず、AWS Transform プロファイルとは異なるリージョンのバケットを指定してみたところ、「Cross-region S3 bucket is not supported. The specified bucket is not in the same region as the AWS Transform profile.」というエラーになりました。

公式ドキュメントにも前提条件としてクロスリージョンバケットは非対応と記載されています。
The bucket must be in the same AWS Region where AWS Transform is enabled.
次に、同じリージョンのバケットを指定しつつバケットポリシーを設定していない状態で保存してみたところ、「Unable to access the specified S3 bucket. Please ensure your bucket resource policy grants the necessary permissions to the AWS Transform service principal (transform.amazonaws.com).」というエラーになりました。

バケットポリシーでは transform.amazonaws.com サービスプリンシパルに対して、以下のようなアクションを許可する必要があります。
公式ドキュメントによると、Condition で aws:SourceAccount と aws:SourceArn を指定して自分のプロファイルからのアクセスのみに制限する構成が推奨されているようです。
{ "Effect": "Allow", "Principal": { "Service": ["transform.amazonaws.com"] }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts", "s3:PutObjectTagging" ], "Resource": "arn:aws:s3:::bucket-name/AWSTransform/*", "Condition": { "StringEquals": { "aws:SourceAccount": "profile-account-id", "aws:SourceArn": "profile-arn" } } }
profile-account-id と profile-arn は AWS Transform の Settings 画面で確認できるサービスプロファイル ARN から取得できます。
加えて s3:ListBucket のステートメントも別途必要です。
バケットポリシーを設定して再度保存したところ、正常に構成が完了しました。
以前のアーティファクトは元のバケットに残る旨のメッセージが表示されています。

Settings 画面の「Artifact storage」セクションに、Storage choice が「Use my own S3」、S3 location に指定したバケットの URI が表示されていることが確認できます。
アーティファクトの保存先を確認
構成完了後にジョブを作成してみると、S3 コンソールから AWSTransform/Workspaces/{workspace-id}/Jobs/{job-id}/ 配下にフォルダ構造が作成されていることが確認できました。

自分のバケットにアーティファクトが保存されていることがわかります。
公式ドキュメントによると、このバケットにファイルを直接アップロードして変換エージェントに利用させることもできるみたいです。
You can upload files directly to your Amazon S3 bucket without using the AWS Transform web application. To make uploaded files available to transformation agents, upload them to the
User Uploadsfolder for the job.
ワークスペースの Artifacts タブからも同じ内容を確認できます。

暗号化の構成
暗号化については SSE-S3(AES256)とカスタマーマネージド KMS キーによる SSE-KMS がサポートされています。
KMS key フィールドを空にした場合はバケットのデフォルト暗号化設定が適用されるようです。
なお、AWS マネージド KMS キー(aws/s3)は非対応です。
AWS-managed KMS keys are not supported. If your bucket is encrypted with
aws/s3, migrate to a customer-managed key or SSE-S3 before using the bucket with AWS Transform.
AWS Transform のサービスプリンシパルがキーに対して kms:CreateGrant を実行する必要があるため、キーポリシーを変更できない AWS マネージドキーは使えないということみたいですね。
カスタマーマネージドキーを使う場合は、キーポリシーに以下のステートメントを追加する必要があるようです。
{ "Sid": "AllowAWSTransformServiceAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::key-owner-account-id:root" }, "Action": [ "kms:CreateGrant", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "transform.region.amazonaws.com" } } }
その他の仕様
公式ドキュメントによると、バケットに保存されるのはユーザーがやり取りするアップロードやアーティファクトのみで、内部的にシステムが生成するアーティファクトは保存されないようです。
Your Amazon S3 bucket stores only the uploads and transformation artifacts that you interact with. Internal system-generated artifacts are not stored in your bucket.
また、サービスマネージドのバケットにいつでも戻すことができるようです。
Settings から「AWS Transform managed storage」を選択して保存するだけですが、切り替え時に進行中のジョブがある場合はそのジョブが失敗するみたいです。
自分のバケットに保存されたアーティファクトは自動的に移行されないため、必要に応じて手動でダウンロードして再アップロードする必要があります。
If you switch storage configurations while transformation jobs are in progress, those jobs fail.
さいごに
本日は AWS Transform でアーティファクトの保存先に自分の S3 バケットを指定できるようになったアップデートを確認してみました。
アーティファクトの保存場所や暗号化方式を自組織のポリシーに合わせて管理したいケースで活用できそうです。
特に、クロスアカウントバケットにも対応しているので、複数アカウントでアーティファクトを一元管理するような使い方もできそうだなと思いました。







