【30分AWSハンズオン(9)】S3 Files を使ってみよう

記事タイトルとURLをコピーする

こんにちは、エデュケーショナルサービス課 AWS トレーナーの小倉です。
今回は30分AWSハンズオンシリーズです。

サーバーワークスでは、自由に勉強会を開催してスキルアップをしています。その中で私は毎週火曜日の朝、「30分AWSハンズオン」という30分でできるAWSハンズオンを2021年9月から継続して開催しています。その内容をブログで定期的に紹介していきます。AWSをご利用のみなさまのスキルアップにお役立ていただければと考えています。

9回目は、「S3 Files を使ってみよう」をやります。

S3 Files については別のブログでも紹介されていますので、確認してみてください。

blog.serverworks.co.jp

ハンズオンは、以下の流れで実施します。

1.CloudFormation でハンズオン環境の構築
2.S3 Files を作成
3.EC2 から接続
4.後片付け

使用するAWSサービス

S3 Files

S3 Files とは、EC2などからS3内のデータへ共有ファイルシステムとしてアクセスすることができる機能です。大規模なデータ処理をするとき、今までは S3 から別のストレージにコピーしてから処理をしていましたが、S3 Files を使うことで S3 バケットにデータを置いたまま処理することが可能です。

参考サイト:
Launching S3 Files, making S3 buckets accessible as file systems | AWS News Blog

構成図

今回の構成図です。
VPC 内に EC2 を作ります。その後、S3 バケットと S3 Files を作成し、EC2 からマウントして利用できることを確認します。

ハンズオン手順

1.CloudFormation でハンズオン環境の構築

ハンズオン環境を CloudFormation を使って構築します。CloudFormation とはコードでインフラを管理できる AWS サービスです。以下のコードをコピーしてローカルのメモ帳などのテキストエディタに貼りつけて、ファイル名 handson9.yml で保存します。このコードを利用すると VPC、サブネット、EC2、IAM ロールを作成してくれます。

AWSTemplateFormatVersion: 2010-09-09
#Description: 'S3 Files Test Stack'
Resources:
  # VPC
  TestVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: AWS-S3Files-Test-VPC
  
  # Internet Gateway
  TestIGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: AWS-S3Files-Test-IGW
  
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref TestVPC
      InternetGatewayId: !Ref TestIGW
  
  # Public Subnet
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref TestVPC
      CidrBlock: 10.0.1.0/24
      MapPublicIpOnLaunch: true
      AvailabilityZone: !Select [0, !GetAZs '']
      Tags:
        - Key: Name
          Value: AWS-S3Files-Test-Public-Subnet
  
  # Route Table
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref TestVPC
      Tags:
        - Key: Name
          Value: AWS-S3Files-Test-Public-RT
  
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref TestIGW
  
  SubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable
  
  # Security Group
  TestSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: AWS-S3Files-test-sg
      GroupDescription: EC2 for S3 Files security group
      VpcId: !Ref TestVPC
      Tags:
        - Key: Name
          Value: AWS-S3Files-Test-SG
  
  NFSSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: AWS-S3Files-nfs-sg
      GroupDescription: Allow NFS access from EC2
      VpcId: !Ref TestVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 2049
          ToPort: 2049
          SourceSecurityGroupId: !Ref TestSecurityGroup
      Tags:
        - Key: Name
          Value: AWS-S3Files-NFS-SG

  # IAM Role for Session Manager
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWS-S3Files-SSM-Role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: AWS-S3Files-SSM-Role
  
  # Instance Profile
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: AWS-S3Files-SSM-Profile
      Roles:
        - !Ref EC2Role
  
  # EC2 Instance for S3 Files testing
  TestInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t3.micro
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      IamInstanceProfile: !Ref EC2InstanceProfile
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !Ref TestSecurityGroup
      Tags:
        - Key: Name
          Value: AWS-S3Files-Test-Instance

CloudFormation で上記のコードを実行すると以下の構成ができあがります。
Systems Manager のセッションマネージャーで EC2 にログインできます。


AWSマネジメントコンソールにログインし、画面上の検索窓で「CloudFormation」と入力し、サービスの下に表示された [CloudFormation] をクリックし、CloudFormation のコンソール画面を開きます。また今回のハンズオンは東京リージョンで実施しますので、右上のリージョンが東京になっていない場合は東京に変更しておきましょう。
スタック一覧の画面が表示されるので、右上の [スタックの作成] - [新しいリソースを使用 (標準)] をクリックします。 もしスタック一覧が表示されない場合は、左上のハンバーガーメニュー (三本線のアイコン) をクリックし、ナビゲーションペイン (左メニュー) を表示し、スタック をクリックしてスタック一覧を表示します。
スタックの作成画面が表示されるので、以下を設定して [次へ] をクリックします。

・テンプレートソース: テンプレートファイルのアップロード
・テンプレートファイルのアップロード: ファイルの選択をクリックし、先ほどローカルに保管した handson9.yml を選択


スタックの詳細を指定の画面で、スタック名に S3Files-handson と入力して、右下の [次へ] をクリックします。


スタックオプションの設定画面が表示されるので、一番下にスクロールして、AWS CloudFormation によって IAM リソースが~にチェックを入れ、右下の [次へ] をクリックします。

 :
レビューの画面が表示されるので、下にスクロールして右下の [送信] をクリックします。

 :

[送信] をクリックすると、CloudFormation によって、AWSリソースの作成が始まります。ステータスが CREATE_IN_PROGRESS から CREATE_COMPLETE になったら作成完了です。5 分ほどかかりますので、作成完了まで待ちます。

【作成中】
【作成完了】

2.S3 Files を作成

ハンズオン環境の準備ができたら S3 Files を作成していきます。
まずは S3 Files で使用する S3 バケットをつくります。 画面上の検索窓で S3 と入力し、サービスの下に表示された [S3] をクリックし S3 のコンソール画面を開きます。


S3 のコンソール画面が表示されるので、[バケットを作成] をクリックします(以下の画面が表示されない場合がありますが、画面内に [バケットを作成] はありますので、そちらをクリックします)。


バケットを作成画面が表示されますので、以下を設定し、一番下にスクロールして [バケットを作成] をクリックします。

・バケット名前空間:アカウントのリージョナル名前空間 を選択
 ※グローバルだとすべてのAWSアカウントでユニークな名前にしないといけないのですが、リージョナルを選択すると自分のAWSアカウント内だけでユニークな名前にすればS3バケットを作成できます
・バケット名の接頭辞:s3files
・バケットのバージョニング:有効にする を選択
 ※S3 Files で使用するS3バケットはバージョニングの有効が必須です

 :  :
以下の画面が表示されればOKです。


次に S3 Files の設定を行います。
画面左上のハンバーガーメニュー (三本線のアイコン) をクリックし、ナビゲーションペイン (左メニュー) を表示します。
メニューの [ファイルシステム] をクリックし、クリックした後に表示される画面内にある [ファイルシステムを作成] をクリックします。


ファイルシステムを作成画面が表示されるので、以下を設定し、 [ファイルシステムを作成] をクリックします。

・汎用バケットまたはプレフィックスの [S3の参照] をクリックし、先ほど作成したS3バケットを選択し、[パスの選択] をクリックします。
・仮想プライベートクラウド(VPC):AWS-S3Files-Test-VPC を選択 (CloudFormationで作成したVPC)


ファイルシステムの作成には5分ほどかかりますので、少し時間を置いてから右上の [詳細を表示] をクリックします。


ファイルシステムの画面が表示されたら、マウントターゲットタブをクリックし、マウントターゲットの状態が 利用可能 になっていればOKです。


マウントターゲットに自動で VPC のデフォルトのセキュリティグループが適用されるので、EC2からNFS(ポート番号2049)の通信を許可する必要があります。今回は必要な通信を許可するセキュリティグループをCloudFormationで作成しているので、このセキュリティグループに変更します。

マウントターゲットにチェックを入れ、[編集] をクリックします。


セキュリティグループをクリックし、default のチェックを外し、AWS-S3Files-NFS-SG にチェックを入れ、[変更を保存] をクリックします。


これで、S3 Filesの作成が完了しました。
補足ですが、マネジメントコンソールから作成すると自動でS3の操作権限が付与されたIAMロールが適用されています。この権限により、S3 Files から S3 バケットの操作ができるようになっています。


3.EC2 から接続

S3 Files の準備ができましたので、EC2 からマウントしてファイルの作成/削除をしてみます。
画面上の検索窓で EC2 と入力し、サービスの下に表示された [EC2] をクリックし EC2 のコンソール画面を開きます。


EC2 のコンソール画面が表示されるので、ナビゲーションペインの [インスタンス] をクリックし、インスタンス名 AWS-S3Files-Test-Instance にチェックを入れ、[接続] をクリックします。


SSM Session Manager タブをクリックし、[接続] をクリックします。


ログインしたら、以下のコマンドを実行していきます。

### クライアントユーティリティをダウンロードしてインストール

curl https://amazon-efs-utils.aws.com/efs-utils-installer.sh | sudo sh -s -- --install

### マウントするフォルダを作成

sudo mkdir /mnt/s3files

### mount コマンドの実行 (fsではじまるものはS3 FilesのID)

sudo mount -t s3files fs-0938af31b76bcded3 /mnt/s3files

### ファイルの作成

sudo touch /mnt/s3files/test.txt

ここまで実行したら、S3 コンソールから S3 バケットの中身を確認します。
すぐには反映されず、1 分ほどかかる場合もありますが、test.txt が作成されていることが確認できます。


今度は EC2 で以下のコマンドを実施し、ファイルの削除を行います。

### ファイルの削除

sudo rm /mnt/s3files/test.txt

もう一度、S3 コンソールから S3 バケットの中身を確認します。
test.txt が削除されていることが確認できます。


バージョン管理を有効にしていますので、バージョンの表示を有効にすると、削除したファイルを確認できます。


これで、ハンズオンは以上となります。
S3 Files を使うことで、EC2 でファイルシステムをマウントして S3 に保管されているデータを操作できることが理解できたと思います。

4.後片付け

AWS のリソースは従量課金のため、作ったまま放置しておくとお金がかかってしまいます。そのため、ハンズオンが終わったら不要なリソースは削除しておきましょう。

まず、S3 Files を削除します。
S3 のコンソール画面から、ナビゲーションペインの [ファイルシステム] をクリックし、ファイルシステムID をクリックします。


S3 Files を削除するときは、マウントポイントとアクセスポイントを先に削除する必要があります。
マウントターゲットタブをクリックし、マウントターゲットを選択し、[削除] をクリックします。


確認画面が表示されますので、確認 と入力し、右下の [削除] をクリックします。


アクセスポイントタブをクリックし、ファイルシステムのアクセスポイントを選択し、[削除] をクリックします。


確認画面が表示されますので、確認 と入力し、右下の [削除] をクリックします。


ナビゲーションペインの [ファイルシステム] をクリックし、ファイルシステムID を選択し、[削除] をクリックします。


確認画面が表示されますので、確認 と入力し、右下の [削除] をクリックします。


これで S3 Files の削除は完了です。

次にS3バケットの削除をします。 ナビゲーションペインの [汎用バケット] をクリックし、s3files で始まるバケットを選択し、[空にする] をクリックします。


確認画面が表示されますので、完全に削除 と入力し、右下の [空にする] をクリックします。


削除が完了したら、右上の [終了] をクリックします。


バケット一覧の画面でもう一度、s3files で始まるバケットを選択し、[削除] をクリックします。


確認画面が表示されますので、バケット名 を入力し、右下の [バケットを削除] をクリックします。


これでS3バケットの削除が終わりました。

最後にCloudFormationでスタックの削除をします。
CloudFormation でまとめて作成したリソース (VPC、EC2) は、まとめて削除できます。

CloudFormationのコンソール画面を開き、ナビゲーションペイン (左メニュー) の [スタック] をクリックしてスタック一覧を開きます。ハンズオン環境構築のスタック (S3Files-handson) を選択し、 [スタックを削除] をクリックします。


確認画面が表示されますので、S3Files-handson と入力し、右下の [スタックを削除] をクリックします。


5分ほど経つと削除が完了します。
これで今回のハンズオンは以上となります。

まとめ

今回は S3 Files の基本的な使い方を確認しました。EC2 から S3 のファイルを直接更新できることを確認しました。
今まで、S3 のデータを処理をするときには、EBS などのストレージにコピーしてから処理をしていましたが、コピーせずに処理が可能になります。ただ、データへのアクセスの速度が遅いように感じますので、要件にあっているかを確認してからのご利用をおすすめします。

小倉 大(記事一覧)

アプリケーションサービス本部エデュケーショナルサービス課 札幌在住

AWSトレーニングの講師をしています。

最近は9歳の息子と遊ぶのが楽しいです!

Twitter: @MasaruOgura