SSM Distributor AmazoneFsutilsを使ってamazon-efs-utilsをインストールする
AWS SOAの出題範囲の1つである、デプロイ、プロビジョニング、およびオートメーションに関する内容です。
以下のページでEFSの基本的な構成をご紹介しました。
ご紹介したページでは、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クライアントを新規インストールまたは定期更新することができます。
構築する環境
基本的には、冒頭でご紹介したページと同様の構成です。
異なる点はネットワーク設定です。
プライベートサブネット内の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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- Instance1:i-0c59ea8cc2aeb73c2
- Instance2:i-0dd528e705bdd4c14
- EFS:fs-04f30fea390abb082
AWS Management ConsoleからもSSMの状況を確認します。
まず関連付けの作成状況を確認します。
確かに2つのSSMドキュメントが実行されたことがわかります。
次にAWS-ConfigureAWSPackageの関連付けの詳細を確認します。
スケジュールが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を新規インストールまたは定期更新できることを確認しました。