こんにちは。SCSKのふくちーぬです。
AWS Systems Managerのフリートマネージャーを利用して、Windowsサーバにブラウザベースでのリモート接続している方多いかと思います。今回は閉域網環境において、ローカル-サーバ間においてファイル共有するためにAWS Tools for Windows PowerShellを用いる方法をご紹介します。
AWS Tools for Windows PowerShellとは
AWS Tools for Windows PowerShellは、PowerShell向けのサービスです。PowerShellからAWSサービスを利用するためのコマンドツール群です。
Winsows Server 2022においては、”4.1.628″のバージョンがインストール済みとなります。
アーキテクチャー
- Systems Managerの管理下にするために、EC2はマネージドインスタンスとする。また、OSはWindows Server 2022を利用します。
- 運用者は、フリートマネージャーを利用してEC2に接続します。
- 運用者は、マネジメントコンソールやAPIを利用してS3にアクセスしファイルのやり取りをします。
- プライベートサブネット内のEC2は、VPCエンドポイント経由でS3にアクセスしファイルのやり取りをします。
完成したCloudFormationテンプレート
以下のテンプレートをデプロイしてください。
AWSTemplateFormatVersion: 2010-09-09
Description: CFN template EC2
Parameters:
ResourceName:
Type: String
AMIId:
Type: String
Resources:
# ------------------------------------------------------------#
# S3
# ------------------------------------------------------------#
S3BucketFor:
Type: AWS::S3::Bucket
DeletionPolicy: Delete
Properties:
BucketName: !Sub ${ResourceName}-s3-bucket
AccessControl: Private
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
# ------------------------------------------------------------#
# VPC
# ------------------------------------------------------------#
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub ${ResourceName}-VPC
# ------------------------------------------------------------#
# Private Subnet
# ------------------------------------------------------------#
PrivateSubnet1a:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: ap-northeast-1a
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: !Sub ${ResourceName}-subnet-Private-1a
PrivateSubnet1c:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.11.0/24
AvailabilityZone: ap-northeast-1c
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: !Sub ${ResourceName}-subnet-Private-1c
# ------------------------------------------------------------#
# Route Table and Routes
# ------------------------------------------------------------#
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: PrivateRouteTable
PrivateSubnet1aAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet1a
RouteTableId: !Ref PrivateRouteTable
PrivateSubnet1cAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet1c
RouteTableId: !Ref PrivateRouteTable
# ------------------------------------------------------------#
# VPC Endpoint
# ------------------------------------------------------------#
ssmEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Join
- ''
- - com.amazonaws.
- !Ref 'AWS::Region'
- .ssm
SubnetIds:
- !Ref PrivateSubnet1a
- !Ref PrivateSubnet1c
VpcId: !Ref VPC
VpcEndpointType: Interface
SecurityGroupIds:
- !Ref VPCeSecurityGroup
PrivateDnsEnabled: true
ec2messagesEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Join
- ''
- - com.amazonaws.
- !Ref 'AWS::Region'
- .ec2messages
SubnetIds:
- !Ref PrivateSubnet1a
- !Ref PrivateSubnet1c
VpcId: !Ref VPC
VpcEndpointType: Interface
SecurityGroupIds:
- !Ref VPCeSecurityGroup
PrivateDnsEnabled: true
ssmmessagesEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Join
- ''
- - com.amazonaws.
- !Ref 'AWS::Region'
- .ssmmessages
SubnetIds:
- !Ref PrivateSubnet1a
- !Ref PrivateSubnet1c
VpcId: !Ref VPC
VpcEndpointType: Interface
SecurityGroupIds:
- !Ref VPCeSecurityGroup
PrivateDnsEnabled: true
S3VpcEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Join
- ''
- - com.amazonaws.
- !Ref 'AWS::Region'
- .s3
VpcId: !Ref VPC
VpcEndpointType: Gateway
RouteTableIds:
- !Ref PrivateRouteTable
# ------------------------------------------------------------#
# Security Group
# ------------------------------------------------------------#
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: For EC2
VpcId: !Ref VPC
VPCeSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPC
GroupDescription: For VPCEndpoint
SecurityGroupIngress:
- SourceSecurityGroupId: !Ref SecurityGroup
IpProtocol: tcp
FromPort: 443
ToPort: 443
# ------------------------------------------------------------#
# IAM Role and Instance Profile
# ------------------------------------------------------------#
SSMRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${ResourceName}-ec2-role
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
- arn:aws:iam::aws:policy/AmazonS3FullAccess
InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref SSMRole
# ------------------------------------------------------------#
# EC2 Key Pair
# ------------------------------------------------------------#
KeyPair:
Type: AWS::EC2::KeyPair
Properties:
KeyName: !Sub ${ResourceName}-key
# ------------------------------------------------------------#
# EC2 Instance
# ------------------------------------------------------------#
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref AMIId
SubnetId: !Ref PrivateSubnet1a
IamInstanceProfile: !Ref InstanceProfile
SecurityGroupIds:
- !Ref SecurityGroup
KeyName: !Ref KeyPair
Tags:
- Key: Name
Value: !Sub ${ResourceName}-ec2
AWS Tools for Windows PowerShellを利用したローカル⇒サーバへのファイル共有
まず、ローカルからサーバ(EC2)へのファイル転送手順です。
S3へのアップロード
まずはローカルのファイルをS3にアップロードします。
今回は、AWS-CLIの導入を対象とします。
ローカルPC上でWindows (64 ビット) 用のインストーラをダウンロードします。
対象ファイルをS3に格納しておきます。
キーペアの値を確認し、EC2に接続
下記記事を参考に、同様の手順でEC2にフリートマネージャー経由で接続します。
Read-S3Objectコマンドの実行
PowerShellを開き、コピー&ペーストを使って下記コマンドを実行します。
Read-S3Object -BucketName <Bucket Name> -Key <Object Key> -File <Local File Path>
今回の場合は、以下のようなコマンドとなります。
Read-S3Object -BucketName fukuchi-s3-bucket -Key AWSCLIV2.msi -File C:\Users\Administrator\Downloads\AWSCLIV2.msi
Read-S3Object-BucketName <String>-Key <String>-File <String>-Version <String>-ModifiedSinceDate <DateTime>-UnmodifiedSinceDate <DateTime>-UtcModifiedSinceDate <DateTime>-UtcUnmodifiedSinceDate <DateTime>-ServerSideEncryptionCustomerMethod <ServerSideEncryptionCustomerMethod>-ServerSideEncryptionCustomerProvidedKey <String>-ServerSideEncryptionCustomerProvidedKeyMD5 <String>-ChecksumMode <ChecksumMode>-ClientConfig <AmazonS3Config>-UseAccelerateEndpoint <SwitchParameter>-UseDualstackEndpoint <SwitchParameter>-ForcePathStyleAddressing <Boolean>
サーバ上にダウンロードできれば下記画面が表示されます。
AWS-CLIの導入
インストーラーをダブルクリックし、画面の指示に従って進めます。
“Next”を押下します。
チェックボックスにチェックを付与して、”Next”を押下します。
“Next”を押下します。
“Install”を押下します。
無事にインストールが完了しました。”Finish”を押下すると、画面が閉じます。
コマンドプロンプトを開き、下記のコマンドを実行します。
aws --version
AWS-CLIをインストールすることができました。
AWS Tools for Windows PowerShellを利用したサーバ⇒ローカルへのファイル共有
今度は、サーバ(EC2)からローカルへのファイル転送手順です。
ファイルの作成
サーバ上の任意の場所でファイルを作成してください。
今回は、notepadを利用して”test.txt”ファイルを作成しておきました。
Write-S3Objectコマンドの実行
PowerShellを開き、コピー&ペーストを使って下記コマンドを実行します。
Write-S3Object -BucketName <Bucket Name> -Key <Object Key> -File <Local File Path>
今回の場合は、以下のようなコマンドとなります。
Write-S3Object -BucketName fukuchi-s3-bucket -Key "test.txt" -File "C:\Users\Administrator\Documents\test.txt"
Write-S3Object-BucketName <String>-Key <String>-File <String>-CannedACLName <S3CannedACL>-PublicReadOnly <SwitchParameter>-PublicReadWrite <SwitchParameter>-ContentType <String>-StorageClass <S3StorageClass>-StandardStorage <SwitchParameter>-ReducedRedundancyStorage <SwitchParameter>-ServerSideEncryption <ServerSideEncryptionMethod>-ServerSideEncryptionKeyManagementServiceKeyId <String>-ServerSideEncryptionCustomerMethod <ServerSideEncryptionCustomerMethod>-ServerSideEncryptionCustomerProvidedKey <String>-ServerSideEncryptionCustomerProvidedKeyMD5 <String>-Metadata <Hashtable>-HeaderCollection <Hashtable>-TagSet <Tag[]>-ChecksumAlgorithm <ChecksumAlgorithm>-ConcurrentServiceRequest <Int32>-CalculateContentMD5Header <Boolean>-PartSize <FileSize>-IfNoneMatch <String>-Force <SwitchParameter>-ClientConfig <AmazonS3Config>-UseAccelerateEndpoint <SwitchParameter>-UseDualstackEndpoint <SwitchParameter>-ForcePathStyleAddressing <Boolean>
S3上にアップロードできれば下記画面が表示されます。
S3コンソールを確認し、該当のファイルが格納されていますね。その後は、マネジメントコンソール等を利用してS3内のファイルをローカルにダウンロードすればOKです。
まとめ
- 閉域網環境のEC2(Windows)でも、AWS Tools for Windows PowerShellがインストール済みのため、各種AWSのAPIを利用することができます。
最後に
いかがだったでしょうか。
AWS Tools for Windows PowerShellを利用すれば、閉域網環境でも容易にファイル共有ができました。普段はAWS-CLIを使う機会が多いですが、これを機に積極的に利用してみようと思います。
本記事が皆様のお役にたてば幸いです。
ではサウナラ~🔥