ベストプラクティスに従ってEFSクライアントをインストールする

ベストプラクティスに従ってEFSクライアントをインストールする

SSM Distributor AmazoneFsutilsを使ってamazon-efs-utilsをインストールする

AWS SOAの出題範囲の1つである、デプロイ、プロビジョニング、およびオートメーションに関する内容です。

以下のページでEFSの基本的な構成をご紹介しました。

あわせて読みたい
CFNでEFS入門 【CloudFormationでEFS入門】 AWS SAAの出題範囲の1つである、高性能なアーキテクチャの設計に関する内容です。 EFSはAWSが提供するストレージサービスの1種です。 Amaz...

ご紹介したページでは、SSM Document AWS-RunShellScriptを使用して、EFSクライアントをインストールするコマンドを実行しました。
これはAWS公式的には、EFSクライアントの手動インストールに相当する方法です。

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/installing-amazon-efs-utils.html

今回はベストプラクティスに従ってEFSクライアントをインストールする方法を確認します。

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/manage-efs-utils-with-aws-sys-manager.html

具体的には、SSM Distributor AmazoneFsutilsを使用する方法です。
AmazoneFsutilsを使用することによって、EFSクライアントを新規インストールまたは定期更新することができます。

構築する環境

Diagram of install EFS client according to best practice.

基本的には、冒頭でご紹介したページと同様の構成です。

異なる点はネットワーク設定です。
プライベートサブネット内のEC2インスタンスが、VPC外のリソースにアクセスするために、VPCエンドポイントではなく、NAT Gatewayを使用します。
これはAmazoneFsutilsが実行する一連の処理の中で、pipやyumを使用して、インターネット上のサードパーティーリソースにアクセスするものが含まれており、VPCエンドポイントでは動作要件を満たすことができないためです。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-soa/tree/main/03/002

テンプレートファイルのポイント解説

本ページは、AmazoneFsutilsを使用して、amazon-efs-utilsをインストールする方法を中心に取り上げます。
EFSの基本的な事項については、冒頭にご紹介したページをご確認ください。

EC2インスタンス用のIAMロール

Resources:
  InstanceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - ec2.amazonaws.com
      Policies:
        - PolicyName: SSMStateManagerPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:PutObject
                  - s3:PutObjectAcl
                  - s3:ListBucket
                Resource:
                  - !Sub "arn:aws:s3:::${LogBucketName}"
                  - !Sub "arn:aws:s3:::${LogBucketName}/*"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonElasticFileSystemsUtils
Code language: YAML (yaml)

ポイントはAWS管理ポリシーに関する設定(ManagedPolicyArnsプロパティ)です。

AmazonElasticFileSystemsUtils AWS マネージドアクセス許可ポリシーを使用して、ロールに適切なアクセス許可を割り当てます。

AWS Systems Manager を使用して、Amazon EFS クライアントを自動的にインストールまたは更新する

上記に従い、インスタンス用のIAMロールにAmazonElasticFileSystemsUtilsポリシーを追加します。

なおインラインポリシーとして、S3バケットへのアクセスを許可する内容を定義しています。
これは後述のSSM Document実行時のログを配信するために必要な権限となります。

SSM Distributorの実行

Resources:
  ConfigureAWSPackageAssociation:
    Type: AWS::SSM::Association
    Properties:
      AssociationName: !Sub "${Prefix}-configure-awspackage-association"
      Name: AWS-ConfigureAWSPackage
      OutputLocation:
        S3Location:
          OutputS3BucketName: !Ref LogBucketName
          OutputS3KeyPrefix: !Sub "${Prefix}/configure-awspackage-association-log"
      Parameters:
        action:
          - Install
        installationType:
          - In-place update
        name:
          - AmazonEFSUtils
      ScheduleExpression: rate(30 days)
      Targets:
        - Key: InstanceIds
          Values:
            - !Ref Instance1
            - !Ref Instance2
      WaitForSuccessTimeoutSeconds: !Ref WaitForSuccessTimeoutSeconds
Code language: YAML (yaml)

SSM Distributorの実行するためには、SSM Document AWS-ConfigureAWSPackageを実行する形を取ります。
つまりAWS-ConfigureAWSPackageとインスタンスの関連付けを作成するということです。

Parametersプロパティに、AWS-ConfigureAWSPackageを実行するためのパラメータを指定します。
actionに「Install」、installationTypeに「In-place update」を指定します。
これらはAWS公式の指定通りの値です。

パラメータでは、アクション > インストール および インストールのタイプ > インプレース更新 を選択します。

AWS Systems Manager を使用して、Amazon EFS クライアントを自動的にインストールまたは更新する

nameに「AmazonEFSUtils」を指定します。

ScheduleExpressionに「rate(30 days)」を指定しました。
これで30日ごとにamazon-efs-utilsの更新が試行されることになります。
なおこの更新頻度は、AWS公式の推奨値です。

スケジュールの指定 では、AmazoneFsutils の推奨設定は30日ごとです。

AWS Systems Manager を使用して、Amazon EFS クライアントを自動的にインストールまたは更新する

なおAmazonEFSUtilsで実行される内容は、あくまでamazon-efs-utilsのインストールに留まります。
EFSのマウントについては、以下のように追加で実行する必要があります。

Resources:
  RunShellScriptAssociation:
    Type: AWS::SSM::Association
    DependsOn:
      - ConfigureAWSPackageAssociation
    Properties:
      AssociationName: !Sub "${Prefix}-shellscript-association"
      Name: AWS-RunShellScript
      OutputLocation:
        S3Location:
          OutputS3BucketName: !Ref LogBucketName
          OutputS3KeyPrefix: !Sub "${Prefix}/shellscript-association-log"
      Parameters:
        commands:
          - sudo mkdir /mnt/efs
          - sleep 90
          - !Sub "sudo mount -t efs ${FileSystemId}:/ /mnt/efs"
      Targets:
        - Key: InstanceIds
          Values:
            - !Ref Instance1
            - !Ref Instance2
      WaitForSuccessTimeoutSeconds: !Ref WaitForSuccessTimeoutSeconds
Code language: YAML (yaml)

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • Instance1:i-0c59ea8cc2aeb73c2
  • Instance2:i-0dd528e705bdd4c14
  • EFS:fs-04f30fea390abb082

AWS Management ConsoleからもSSMの状況を確認します。
まず関連付けの作成状況を確認します。

Result of SSM Document 1.

確かに2つのSSMドキュメントが実行されたことがわかります。

次にAWS-ConfigureAWSPackageの関連付けの詳細を確認します。

Result of SSM Document 2.
Result of SSM Document 3.

スケジュールが30日ごとに実行されるように設定されていることがわかります。
パラメータを見ると、AmazonEFSUtilsをインプレース更新でインストールするように設定されていることがわかります。

実行時のログをS3バケットに保存するように設定しました。
保存されたログは以下の通りです。

Initiating AmazonEFSUtils 1.33.2-1 install
Plugin aws:runShellScript ResultStatus Success
install output: Running sh install.sh
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Examining ./amazon-efs-utils-1.33.2-1.amzn2.noarch.rpm: amazon-efs-utils-1.33.2-1.amzn2.noarch
Marking ./amazon-efs-utils-1.33.2-1.amzn2.noarch.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package amazon-efs-utils.noarch 0:1.33.2-1.amzn2 will be installed
--> Processing Dependency: stunnel >= 4.56 for package: amazon-efs-utils-1.33.2-1.amzn2.noarch
--> Running transaction check
---> Package stunnel.aarch64 0:4.56-6.amzn2.0.3 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package Arch    Version          Repository                               Size
================================================================================
Installing:
 amazon-efs-utils
         noarch  1.33.2-1.amzn2   /amazon-efs-utils-1.33.2-1.amzn2.noarch 198 k
Installing for dependencies:
 stunnel aarch64 4.56-6.amzn2.0.3 amzn2-core                              148 k

Transaction Summary
================================================================================
Install  1 Package (+1 Dependent package)

Total size: 346 k
Total download size: 148 k
Installed size: 627 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : stunnel-4.56-6.amzn2.0.3.aarch64                             1/2
  Installing : amazon-efs-utils-1.33.2-1.amzn2.noarch                       2/2
  Verifying  : stunnel-4.56-6.amzn2.0.3.aarch64                             1/2
  Verifying  : amazon-efs-utils-1.33.2-1.amzn2.noarch                       2/2

Installed:
  amazon-efs-utils.noarch 0:1.33.2-1.amzn2

Dependency Installed:
  stunnel.aarch64 0:4.56-6.amzn2.0.3

Complete!
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Package wget-1.14-18.amzn2.1.aarch64 already installed and latest version
Nothing to do
Collecting pip
  Downloading pip-22.1.2-py3-none-any.whl (2.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 45.1 MB/s eta 0:00:00
Collecting wheel
  Downloading wheel-0.37.1-py2.py3-none-any.whl (35 kB)
Installing collected packages: wheel, pip
  Attempting uninstall: pip
    Found existing installation: pip 20.2.2
    Uninstalling pip-20.2.2:
      Successfully uninstalled pip-20.2.2
Successfully installed pip-22.1.2 wheel-0.37.1
Collecting botocore
  Downloading botocore-1.27.17-py3-none-any.whl (8.9 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.9/8.9 MB 81.8 MB/s eta 0:00:00
Collecting urllib3<1.27,>=1.25.4
  Downloading urllib3-1.26.9-py2.py3-none-any.whl (138 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 139.0/139.0 kB 20.3 MB/s eta 0:00:00
Collecting jmespath<2.0.0,>=0.7.1
  Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)
Collecting python-dateutil<3.0.0,>=2.1
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 247.7/247.7 kB 45.5 MB/s eta 0:00:00
Collecting six>=1.5
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: urllib3, six, jmespath, python-dateutil, botocore
Successfully installed botocore-1.27.17 jmespath-1.0.1 python-dateutil-2.8.2 six-1.16.0 urllib3-1.26.9

Successfully installed AmazonEFSUtils 1.33.2-1
Code language: plaintext (plaintext)

amazon-efs-utilsおよびこれに依存関係のあるパッケージがインストールされたことがわかります。

動作確認

準備が整いましたので、EC2インスタンスにアクセスし、amazon-efs-utilsがインストールされたことを確認します。
今回はInstance1にアクセスして確認を行います。
インスタンスへのアクセスはSSM Session Managerを使用します。

% aws ssm start-session --target i-0c59ea8cc2aeb73c2

Starting session with SessionId: root-02323560c270157c7
sh-4.2$
Code language: Bash (bash)

SSM Session Managerの詳細につきましては、以下のページをご確認ください。

あわせて読みたい
LinuxインスタンスにSSM Session Manager経由でアクセスする 【LinuxインスタンスにSSM Session Manager経由でアクセスする】 EC2インスタンスにSSM Session Manager経由でアクセスする構成を確認します。 Session Manager は完全...

amazon-efs-utilsがインストールされているか確認します。

sh-4.2$ sudo yum list installed | grep efs
amazon-efs-utils.noarch               1.33.2-1.amzn2                   installed
Code language: Bash (bash)

正常にインストールされていることがわかります。
このようにSSM Distributor AmazonEFSUtilsを使用して、amazon-efs-utilsをインストールできることがわかりました。

AmazonEFSUtilsでインストールしたamazon-efs-utilsが正常に動作する確認を行います。

dfコマンドでディスク状況を確認します。

$ sudo yum list installed | grep efs
amazon-efs-utils.noarch               1.33.2-1.amzn2                   installed
sh-4.2$
sh-4.2$
sh-4.2$ df -hT
Filesystem                                              Type      Size  Used Avail Use% Mounted on
devtmpfs                                                devtmpfs  178M     0  178M   0% /dev
tmpfs                                                   tmpfs     215M     0  215M   0% /dev/shm
tmpfs                                                   tmpfs     215M  356K  215M   1% /run
tmpfs                                                   tmpfs     215M     0  215M   0% /sys/fs/cgroup
/dev/nvme0n1p1                                          xfs       8.0G  1.6G  6.4G  20% /
/dev/nvme0n1p128                                        vfat       10M  3.8M  6.3M  38% /boot/efi
fs-04f30fea390abb082.efs.ap-northeast-1.amazonaws.com:/ nfs4      8.0E     0  8.0E   0% /mnt/efs
Code language: Bash (bash)

EFSがマウントされています。
正常にamazon-efs-utilsが動作しているということがわかります。

最後にEFSにファイルの書き込みを実行します。

sh-4.2$ cd /mnt/efs

sh-4.2$ sudo touch test.txt

sh-4.2$ ls
test.txt
Code language: Bash (bash)

正常に書き込むことができました。
AmazonEFSUtilsでインストールしたamazon-efs-utilsは正常に動作しました。

まとめ

ベストプラクティスに従って、EFSクライアントをインストールする方法をご紹介しました。
SSM Distributor AmazoneFsutilsを使用することによって、amazon-efs-utilsを新規インストールまたは定期更新できることを確認しました。