VPC S3 엔드포인트를 사용하여 프라이빗 서브넷에서 S3에 연결

이번, S3 엔드 포인트를 시험하려고 생각하고 있으므로 사용해 보았습니다. 확인을 위해 프라이빗 서브넷에 배치한 EC2에서 S3에 액세스할 수 있는지 확인합니다.

전제


  • AWS CLI 환경 구축

  • 참고


  • Amazon S3 VPC 엔드포인트
  • 【신기능】S3가 VPC의 프라이빗 서브넷으로부터 액세스 가능하게 되었습니다!

  • VPC 만들기



    VPC와 서브넷(퍼블릭, 프라이빗)을 만듭니다.
    번거롭기 때문에 CloudFormation을 사용합니다.

    MyStack.json
    {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Description" : "A simple stack that launches an instance.",
      "Resources" : {
        "VPC" : {
          "Type" : "AWS::EC2::VPC",
          "Properties" : {
            "CidrBlock" : "10.1.0.0/16",
            "EnableDnsHostnames" : "true"
          }
        },
    
        "PublicSubnetAZa" : {
          "Type" : "AWS::EC2::Subnet",
          "Properties" : {
            "AvailabilityZone" : "ap-northeast-1a",
            "CidrBlock" : "10.1.11.0/24",
            "VpcId" : { "Ref" : "VPC" }
          }
        },
    
        "PrivateSubnetAZa" : {
          "Type" : "AWS::EC2::Subnet",
          "Properties" : {
            "AvailabilityZone" : "ap-northeast-1a",
            "CidrBlock" : "10.1.15.0/24",
            "VpcId" : { "Ref" : "VPC" }
          }
        },
    
        "InternetGateway" : {
          "Type" : "AWS::EC2::InternetGateway"
        },
    
        "InternetGatewayAttach" : {
          "Type" : "AWS::EC2::VPCGatewayAttachment",
          "Properties" : {
            "VpcId" : { "Ref" : "VPC" },
            "InternetGatewayId" : { "Ref" : "InternetGateway" }
          }
        },
    
        "DHCPOptions" : {
          "Type" : "AWS::EC2::DHCPOptions",
          "Properties" : {
            "DomainName" : "ap-northeast-1.compute.internal",
            "DomainNameServers" : [ "AmazonProvidedDNS" ]
          }
        },
    
        "VPCDHCPOptionsAssociation" : {
          "Type" : "AWS::EC2::VPCDHCPOptionsAssociation",
          "Properties" : {
            "VpcId" : { "Ref" : "VPC" },
            "DhcpOptionsId" : { "Ref" : "DHCPOptions" }
          }
        },
    
        "RouteTable" : {
          "Type" : "AWS::EC2::RouteTable",
          "Properties" : {
            "VpcId" : { "Ref" : "VPC" }
          }
        },
    
        "Route1" : {
          "Type" : "AWS::EC2::Route",
          "Properties" : {
            "DestinationCidrBlock" : "0.0.0.0/0",
            "RouteTableId" : { "Ref" : "RouteTable" },
            "GatewayId" : { "Ref" : "InternetGateway" }
          },
          "DependsOn" : "InternetGatewayAttach"
        },
    
        "SubnetRoute1" : {
          "Type" : "AWS::EC2::SubnetRouteTableAssociation",
          "Properties" : {
            "RouteTableId" : { "Ref" : "RouteTable" },
            "SubnetId" : { "Ref" : "PublicSubnetAZa" }
          }
        }
      }
    }
    

    위 파일을 로컬로 만든 후 다음 명령을 실행합니다.
    $aws cloudformation create-stack --template-body file://Mystack.json --stack-name MyFirstStack
    

    S3 엔드포인트 생성



    현재 CloudFormation에서 S3 엔드포인트를 만들 수 없었기 때문에 별도의 관리 콘솔에서 실시합니다.
  • VPC->Endpoints
  • Create Endpoint

  • 첫 번째 화면에서는 CIDR이 "10.1.0.0/16"인 이전에 만든 VPC를 설정합니다.



    다음 화면에서는 프라이빗 서브넷을 선택합니다. 프라이빗 서브넷의 CIDR은 10.1.15.0/24인 것을 선택합니다.



    이제 프라이빗 서브넷에 S3 엔드포인트를 만들 수 있습니다.

    EC2 만들기



    확인을 위해 프라이빗 서브넷에 EC2를 설치하여 인터넷에 연결할 수 없는 상태에서 S3에 액세스할 수 있는지 확인합니다.

    관리 콘솔 등에서 퍼블릭 서브넷(프라이빗 서브넷에 SSH 연결용)과 프라이빗 서브넷에 EC2를 각각 1대씩 세웁니다. 이번 예에서는 AmazonLinux를 이용했습니다. 또한, 기동하는 EC2에는 S3에 액세스 가능한 IAM 롤을 부여해 두어 주세요.

    부팅 후 퍼블릭 서브넷의 퍼블릭 IP와 프라이빗 서브넷에 대한 프라이빗 IP를 확인합니다.

    자신의 시스템에서 프라이빗 서브넷의 EC2에 액세스하기 위해 sshconfig 설정을 변경합니다. 52.69.163.180은 퍼블릭 서브넷의 EC2의 퍼블릭 IP, 10.1.15.140은 프라이빗 서브넷의 EC2의 프라이빗 IP, ~/.ssh/hogefuga.pem은 설정한 SSH 인증 키를 자신의 환경에 맞추어 변경합니다. 제발.

    ~/.ssh/conf
    Host FumidaiServer
      HostName 52.69.163.180
      User ec2-user
      Port 22
      IdentityFile ~/.ssh/hogefuga.pem
    
    Host TargetServer
      HostName 10.1.15.140
      User ec2-user
      port 22
      IdentityFile ~/.ssh/hogefuga.pem
      ProxyCommand ssh -W %h:%p FumidaiServer
    

    위의 설정을 통해 자신의 컴퓨터에서 다음 명령을 사용하여 프라이빗 서브넷 EC2에 로그인할 수 있습니다.
    $ssh TargetServer
    

    시험에 인터넷에 연결되는지 시도합니다.
    $wget -T 10 http://google.co.jp
    --2015-06-30 01:35:23--  http://google.co.jp/
    google.co.jp (google.co.jp) をDNSに問いあわせています... 173.194.117.159, 173.194.117.143, 173.194.117.151, ...
    google.co.jp (google.co.jp)|173.194.117.159|:80 に接続しています... 失敗しました: 接続がタイムアウトしました.
    

    프라이빗 서브넷에서 NAT 설정 등도 하지 않으므로 인터넷에 액세스할 수 없습니다.

    프라이빗 서브넷에서 S3에 액세스



    사전에 IAM 역할로 S3에 대한 액세스 권한을 부여하고 있기 때문에 계정 설정은 실시하지 않고, S3에의 액세스를 실시해 보겠습니다.
    $aws s3 --region ap-northeast-1 ls
    2015-05-29 07:58:18 toshihiro-elb-test
    2015-05-31 13:09:57 toshihirock-cloudtrail
    2015-06-04 23:39:22 toshihirock-cognito
    

    위와 같이 프라이빗 서브넷에서도 S3에 액세스할 수 있었습니다!

    좋은 웹페이지 즐겨찾기