[アップデート] AWS Transfer Family web apps が CloudFormation で構築できるようになったのでユーザー割り当ても含めたテンプレートを作ってみた
いわさです。
先日 CloudFormation のサポートリソースに AWS Transfer Family web apps が追加されました。
AWS Transfer Family web app は 昨年の AWS re:Invent 2024 で登場したばかりの新機能です。
このサービスは従来の Transfer Family シリーズと異なり特定のプロトコルに対応するためのものではなく、IAM Identity Center ユーザーに対して S3 バケットへのアクセスを Web UI で提供する機能です。
サービスが登場してからまだ触っていなかったことに気が付き、これはまずいと思ったのでこの機会に触ってみることにしました。
テンプレートの前提条件
まず AWS Transfer Family web app は本日時点では IAM Identity Center の利用が前提となります。
事前に IAM Identity Center を有効化しておきます。この時の注意点として Transfer Family web apps のデプロイリージョンと IAM Identity Center のリージョンは一致させる必要があります。
また、IAM Identity Center ユーザーにアクセスを提供するものとなりますので、IAM Identity Center ユーザーも作成しておきます。
さらに、このサービスは裏側で S3 Access Grants という仕組みを使って IAM Identity Center の認可コンテキストに S3 へのアクセスを許可する仕組みを使います。
そこで事前に S3 から Access Grants を構成しておく必要があります。
事前準備はこんなところです。
テンプレートを作成する
今回のアップデートで追加されたのはこちらのAWS::Transfer::WebApp
です。
指定パラメータがいくつかありますが、必須なものとしては AWS CLI のtransfer create-web-app
[1]あたりを抑えておくとわかりやすいと思います。
必須なものはIdentityProviderDetails
のInstanceArn
とRole
です。
InstanceArn
には IAM Identity Center インスタンス ARN を指定します。
Role
については Transfer Family web apps の次の公式ドキュメントにて解説されていまして、特定の信頼ポリシーにて S3 へのアクセス権限が必要となります。
マネジメントコンソールから作成した場合だと自動で IAM ロールを作成してくれるのですが CloudFormation の場合は明示的にロール作成&指定が必要です。
ということで出来上がったテンプレートがこちらです。
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
HogeWebApp:
Type: AWS::Transfer::WebApp
Properties:
IdentityProviderDetails:
InstanceArn: arn:aws:sso:::instance/ssoins-77585951bf05fe55
Role: !GetAtt HogeRole.Arn
HogeRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: transfer.amazonaws.com
Action:
- 'sts:AssumeRole'
- 'sts:SetContext'
Condition:
StringEquals:
'aws:SourceAccount': !Ref 'AWS::AccountId'
ManagedPolicyArns:
- !Ref HogePolicy
HogePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 's3:GetDataAccess'
- 's3:ListCallerAccessGrants'
Resource: !Sub 'arn:aws:s3:${AWS::Region}:${AWS::AccountId}:access-grants/*'
Condition:
StringEquals:
's3:ResourceAccount': !Ref 'AWS::AccountId'
- Effect: Allow
Action: 's3:ListAccessGrantsInstances'
Resource: '*'
Condition:
StringEquals:
's3:ResourceAccount': !Ref 'AWS::AccountId'
HogeUserAssign:
Type: AWS::SSO::ApplicationAssignment
Properties:
ApplicationArn: !GetAtt HogeWebApp.IdentityProviderDetails.ApplicationArn
PrincipalId: 47e4ea18-f0e1-70f2-762c-f3c05476517f
PrincipalType: USER
IAM Identity Center インスタンス ARN とユーザープリンシパル ID がハードコーディングされているのでご注意ください。
上記には先ほど解説していなかったAWS::SSO::ApplicationAssignment
が含まれています。
こちらですが、Transfer Family web apps はデプロイした後にコンソール上からユーザー割り当てが必要です。全ユーザーが使い始めれるわけではありません。
手動対応しても良いのですが、今回のアップデートとは関係のないところでユーザー割り当て自体は可能です。
裏側ではAWS::SSO::ApplicationAssignment
というリソースタイプを使って割当を行います。
このAWS::SSO::ApplicationAssignment
はマネージドアプリケーションがデプロイされて IAM Identity Center を関連付けされた後に発行される「アプリケーション ARN」が必要なのですが、今回追加されたAWS::Transfer::WebApp
から取得することが可能です。GetAtt
で取得しています。
デプロイしてみる
デプロイ後 Transfer web apps アプリケーションが作成されています。
IAM Identity Center のマネージドアプリケーションとしても登録されています。
Web apps コンソールを見てみると指定した IAM Idnetity Center ユーザーが割当されていますね。うまくいった。
ポータル URL にアクセスしてみると、IAM Identity Center の認証情報で S3 Access Grants で許可した S3 バケット(ロケーション)にアクセスすることが出来ました。
もしここで次のようにフッターにエラーメッセージが表示される場合は S3 Access Grants の設定が完了していないので、そちらを追加で対応しましょう。
さいごに
本日は AWS Transfer Family web apps が CloudFormation で構築できるようになったのでユーザー割り当ても含めたテンプレートを作ってみました。
re:Invent の際にスルーしてしまっており今回始めて Transfer Family web apps を触ったのですが、これはなかなか良いかもしれませんね。
Amazon S3 をよくあるストレージサービスとして使いたいという要望をたまに聞くのですが、S3 + Cyberduck、WinSCP とかで実現することがあります。
今後はこの Web UI も選択肢のひとつになりそうです。IAM ユーザー不要で IAM Identity Center ユーザーで管理ができるのがとても良いです。
マネジメントコンソールから作成する場合も非常に簡単に作成が可能なので、CloudFormaiton で作成したいという需要はあまり無い気もします。
でもユーザー割り当てにAWS::SSO::ApplicationAssignment
を使えるのは個人的には発見でした。