[アップデート] AWS Transfer Family web apps が CloudFormation で構築できるようになったのでユーザー割り当ても含めたテンプレートを作ってみた

[アップデート] AWS Transfer Family web apps が CloudFormation で構築できるようになったのでユーザー割り当ても含めたテンプレートを作ってみた

Clock Icon2025.02.12

いわさです。

先日 CloudFormation のサポートリソースに AWS Transfer Family web apps が追加されました。

B1D41DF2-22E2-4B84-A940-CC1113180B58.png

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 のリージョンは一致させる必要があります。

12FB9C82-37E1-444D-9B48-AE9513CB2E53.png

また、IAM Identity Center ユーザーにアクセスを提供するものとなりますので、IAM Identity Center ユーザーも作成しておきます。

38E37BC7-0516-4718-9A58-F3F76A78F2A2.png

さらに、このサービスは裏側で S3 Access Grants という仕組みを使って IAM Identity Center の認可コンテキストに S3 へのアクセスを許可する仕組みを使います。
そこで事前に S3 から Access Grants を構成しておく必要があります。

503E4196-1D23-4AFA-B0FB-D8F19CCB2704.png

事前準備はこんなところです。

テンプレートを作成する

今回のアップデートで追加されたのはこちらのAWS::Transfer::WebAppです。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-webapp.html

指定パラメータがいくつかありますが、必須なものとしては AWS CLI のtransfer create-web-app[1]あたりを抑えておくとわかりやすいと思います。
必須なものはIdentityProviderDetailsInstanceArnRoleです。

InstanceArnには IAM Identity Center インスタンス ARN を指定します。
Roleについては Transfer Family web apps の次の公式ドキュメントにて解説されていまして、特定の信頼ポリシーにて S3 へのアクセス権限が必要となります。

https://docs.aws.amazon.com/transfer/latest/userguide/webapp-roles.html

マネジメントコンソールから作成した場合だと自動で 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 はデプロイした後にコンソール上からユーザー割り当てが必要です。全ユーザーが使い始めれるわけではありません。

52B81BEA-D8CF-4603-842D-C411F7A3CC15.png

手動対応しても良いのですが、今回のアップデートとは関係のないところでユーザー割り当て自体は可能です。
裏側ではAWS::SSO::ApplicationAssignmentというリソースタイプを使って割当を行います。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sso-applicationassignment.html

このAWS::SSO::ApplicationAssignmentはマネージドアプリケーションがデプロイされて IAM Identity Center を関連付けされた後に発行される「アプリケーション ARN」が必要なのですが、今回追加されたAWS::Transfer::WebAppから取得することが可能です。GetAttで取得しています。

デプロイしてみる

デプロイ後 Transfer web apps アプリケーションが作成されています。

BAA47219-D9EA-4232-BCA0-24975D7710DE.png

IAM Identity Center のマネージドアプリケーションとしても登録されています。

022F0BAF-C9C1-4D35-8AA2-991EE800C398.png

Web apps コンソールを見てみると指定した IAM Idnetity Center ユーザーが割当されていますね。うまくいった。

C259A467-ECE5-419D-B35C-DE7E752FA98D.png

ポータル URL にアクセスしてみると、IAM Identity Center の認証情報で S3 Access Grants で許可した S3 バケット(ロケーション)にアクセスすることが出来ました。

1B3D7946-6519-48D9-BC0C-D545E11314A1.png

もしここで次のようにフッターにエラーメッセージが表示される場合は S3 Access Grants の設定が完了していないので、そちらを追加で対応しましょう。

5F72A23D-FB5D-4776-A5C7-E72A20084667.png

さいごに

本日は 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を使えるのは個人的には発見でした。

脚注
  1. create-web-app — AWS CLI 1.37.17 Command Reference ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.