閉域網環境のEC2(Windows)においてファイル共有する方法

こんにちは。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を使う機会が多いですが、これを機に積極的に利用してみようと思います。

本記事が皆様のお役にたてば幸いです。

ではサウナラ~🔥

著者について
ふくちーぬ(福地孝哉)

◆所属:クラウドサービス部
◆経歴:
 2022 ANGEL Dojo ANGEL賞 2位
 2023 Japan AWS All Certifications Engineers
 2024 Japan AWS All Certifications Engineers
 2024 Japan AWS Jr. Champions
◆資格:
 熱波師,サウナ・スパ健康アドバイザー,Azure,Terraform,情報処理安全確保支援士合格
◆好きなAWSサービス:Amazon EventBridge
◆好きなサウナの温度:120℃
◆好きな水風呂の温度:16.5℃

ふくちーぬ(福地孝哉)をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWS運用・監視
シェアする
タイトルとURLをコピーしました