この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS事業本部 梶原@福岡オフィスです。
既存のEC2に対して、EFSファイルシステムを作成しマウント、ファイル共有をする構成を作成する際に CloudFormation Templateで作成したので公開します。 勢いで先日東京リージョンにGAされたAWS Backupも設定していますので、CloudFormationで構築する際に役に立つと幸いです。
今回作成したAmazon EFSファイルシステムは2つのサブネットに配置されたEC2からアクセスされることを想定しています。 また、AWS Backpuは1日1回取得する設定にしています。バックアップ保持日数等はパラメータ化していますが、構築要件に合わせてご自由にカスタマイズください。
構成図
前提条件
- VPC
- サブネット(2つ)
- EC2 (Amazon Linux2)
- OSは特に制限はありませんが、EFSファイルシステムのマウントコマンド等はAmazon Linux2を想定しています。
- EC2へのSecurityGroupの割り当て
- EFSへの接続をEC2へ割り当てたSecurityGroupで作成しています。
CloudFormationテンプレート
入力パラメータ
ネットワーク設定
- Vpc
- EFSを作成するVPCを選択してください
- Subnets
- エンドポイントを作成するサブネットを2つ選択してください
- EC2SecurityGroup
- アクセス元となるセキュリティグループを選択してください
- EFSに割り当てるセキュリティグループはCloudFormationの中で作成します。
※2つのサブネットからアクセスされることを想定しています。1つのサブネットもしくは3つのサブネットからのアクセスが必要な場合はテンプレートの編集を行ってください。
EFS設定
- Encrypted
- 暗号化の有無
- PerformanceMode
- generalPurpose:汎用,MaxIO:最大パフォーマンス その他の設定は基本的にデフォルト設定としています。
AWS Backup設定
- UseAWSBackup (false)
- AWS Backupを使用する場合はtrueを選択してください(デフォルトはfalseにしています)
- BackupHour (5)
- Backup開始時刻をUTCで指定します(実際のバックアップ開始までは1時間のタイムラグがあります)
- DeleteAfterDays (40)
- バックアップを削除するに日数を指定します その他の設定は基本的にデフォルト設定としています。
CloudFormationテンプレートの実行
テンプレートはS3に置いてますので、ログイン後に以下ボタンをポチっとしてください。
※IAMの権限(AWS Backup用のIAM Roleを作成します)の確認がありますので、AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。
にチェックをして進めてください。
パラメータ
CloudFormation実行後作成後のリソース状況
EFS
コンソール https://ap-northeast-1.console.aws.amazon.com/efs/home?region=ap-northeast-1#/filesystems
- 指定したVPCまた、サブネットに作成されているか確認をお願いします。
AWS Backup
コンソール https://ap-northeast-1.console.aws.amazon.com/backup/home?region=ap-northeast-1#dashboard
- 指定した時刻また、作成したEFSリソースが指定されているか確認をお願いします。
EFSのマウント
CloudFormationのテンプレートのOutputにマウント用のコマンドが出力されますので参考にしてEC2よりEFSをマウントして使用して下さい。
$ sudo yum install -y amazon-efs-utils;
$ sudo mkdir -p /mnt/efs; sudo mount -t efs fs-xxxxxx:/ /mnt/efs;
※マウント先のエンドポイントは作成毎に代わりますので、ご確認ください。
AWS Backupの実行確認
指定した時間(UTC)(1時間のバックアップ開始時間の猶予があります)にバックアップが実行されていることを確認してください。
まとめ
EFSのCloudFormationテンプレートを作成していたのですが、丁度いいタイミングでAWS Backupが東京でGAされたのでCloudFormationで作ってみました あまりテンプレートのサンプルも見当たらなかったので、どなたかのお役に立てると幸いです。
テンプレート
AWSTemplateFormatVersion: '2010-09-09'
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: "Network Settings"
Parameters:
- Vpc
- Subnets
- EC2SecurityGroup
- Label:
default: "EFS Settings"
Parameters:
- Encrypted
- PerformanceMode
- Label:
default: "AWS Backup Settings"
Parameters:
- UseAWSBackup
- BackupHour
- DeleteAfterDays
Parameters:
Vpc:
Type: AWS::EC2::VPC::Id
Description: Vpc Name.
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup::Id
Description: Environment Name.
Subnets:
Type: 'List<AWS::EC2::Subnet::Id>'
Description: The list of SubnetIds in your Virtual Private Cloud (VPC)
ConstraintDescription: >-
must be a list of at least two existing subnets associated with at least
two different availability zones. They should be residing in the selected
Virtual Private Cloud.
Encrypted:
Type: String
Default: false
AllowedValues: [false, true]
Description: A Boolean value that, if true, creates an encrypted file system.
PerformanceMode:
Type: String
Default: generalPurpose
AllowedValues: [generalPurpose, maxIO]
Description: The performance mode of the file system.
UseAWSBackup:
Type: String
Default: no
AllowedValues: [yes, no]
BackupHour:
Type: Number
Default: 5
Description: specifying the hour when AWS Backup initiates a backup job.(UTC)
DeleteAfterDays:
Type: Number
Default: 40
Description: Specifies the number of days after creation that a recovery point is deleted
Conditions:
UseAWSBackup: !Equals [ !Ref UseAWSBackup, yes ]
Resources:
EfsSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: EFS Allowed Ports
VpcId: !Ref Vpc
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 2049
ToPort: 2049
SourceSecurityGroupId: !Ref EC2SecurityGroup
Tags:
- Key: Name
Value: EfsSecurityGroup
FileSystem:
Type: AWS::EFS::FileSystem
Properties:
Encrypted: !Ref Encrypted
PerformanceMode: !Ref PerformanceMode
MountTarget1:
Type: AWS::EFS::MountTarget
Properties:
FileSystemId: !Ref FileSystem
SubnetId: !Select [ 0, !Ref Subnets ]
SecurityGroups:
- !Ref EfsSecurityGroup
MountTarget2:
Type: AWS::EFS::MountTarget
Properties:
FileSystemId: !Ref FileSystem
SubnetId: !Select [ 1, !Ref Subnets ]
SecurityGroups:
- !Ref EfsSecurityGroup
BackupPlan:
Condition: UseAWSBackup
Type: AWS::Backup::BackupPlan
Properties:
BackupPlan:
BackupPlanName: "EfsDailyBackupPlan"
BackupPlanRule:
- RuleName: "EfsDailyBackupPlanRule"
TargetBackupVault: !Ref BackupVault
ScheduleExpression: !Sub "cron(0 ${BackupHour} ? * * *)"
StartWindowMinutes: 60
# CompletionWindowMinutes: 10080
Lifecycle:
DeleteAfterDays: !Ref DeleteAfterDays
BackupSelection:
Condition: UseAWSBackup
Type: AWS::Backup::BackupSelection
Properties:
BackupPlanId: !Ref BackupPlan
BackupSelection:
SelectionName: "EfsBackupResouce"
IamRoleArn: !GetAtt AWSBackupServiceRole.Arn
Resources:
- !Sub "arn:aws:elasticfilesystem:${AWS::Region}:${AWS::AccountId}:file-system/${FileSystem}"
BackupVault:
Condition: UseAWSBackup
Type: AWS::Backup::BackupVault
Properties:
BackupVaultName: EfsBackupVault
AWSBackupServiceRole:
Condition: UseAWSBackup
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Action: "sts:AssumeRole"
Effect: "Allow"
Principal:
Service: backup.amazonaws.com
Path: "/service-role/"
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup"
- "arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores"
Outputs:
MountCommand1:
Value: sudo yum install -y amazon-efs-utils;
MountCommand2:
Value: !Sub sudo mkdir -p /mnt/efs; sudo mount -t efs ${FileSystem}:/ /mnt/efs;