SOA

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

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

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

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

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

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

Amazon EFS クライアントの手動インストール - Amazon Elastic File System
Amazon Linux および Amazon Linux 2 を実行している Amazon EC2 Linux インスタンス、および macOS ビッグサーを実行する EC2 Mac インスタンス、およびその他のサポートされている Linux ディストリビューションに Amazon EFS クライアントを手動でインス...

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

AWS Systems Manager を使用して、Amazon EFS クライアントを自動的にインストールまたは更新する - Amazon Elastic File System
ではを使用できます。AWS Systems ManagerAmazon EFS クライアントの管理を簡素化するため ( amazon-efs-utils ).AWS Systems ManagerはAWSでインフラストラクチャを表示および制御するために使用できるのサービスです。AWS。AWS Systems Manag...

具体的には、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テンプレートを配置しています。

awstut-soa/03/002 at main · awstut-an-r/awstut-soa
Contribute to awstut-an-r/awstut-soa development by creating an account on GitHub.

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

本ページは、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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

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

  • 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の詳細につきましては、以下のページをご確認ください。

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を新規インストールまたは定期更新できることを確認しました。

タイトルとURLをコピーしました