aws
===

TPAは、AWS
EC2での本番クラスターのプロビジョニングを完全にサポートしています。

APIアクセス設定
---------------

AWS APIを使用するには、以下を行う必要があります。

-  `Obtain an access keypair <https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html>`_ 

-  `Add it to your configuration <https://boto.readthedocs.org/en/latest/boto_config_tut.html>`_ 

たとえば、

.. code:: bash

   [tpa]$ cat > ~/.aws/credentials
   [default]
   aws_access_key_id = AKIAIOSFODNN7EXAMPLE
   aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

AMIユーザーには、
tpaexecがそれを使用してec2リソースをプロビジョニングできるように、少なくとも次の一連のアクセス許可が必要です。

::

   ec2:AssociateRouteTable
   ec2:AttachInternetGateway
   ec2:AuthorizeSecurityGroupIngress
   ec2:CreateInternetGateway
   ec2:CreateRoute
   ec2:CreateRouteTable
   ec2:CreateSecurityGroup
   ec2:CreateSubnet
   ec2:CreateTags
   ec2:CreateVpc
   ec2:DeleteKeyPair
   ec2:DeleteRouteTable
   ec2:DeleteSecurityGroup
   ec2:DeleteSubnet
   ec2:DeleteVpc
   ec2:DescribeImages
   ec2:DescribeInstanceStatus
   ec2:DescribeInstances
   ec2:DescribeInternetGateways
   ec2:DescribeKeyPairs
   ec2:DescribeRouteTables
   ec2:DescribeSecurityGroups
   ec2:DescribeSubnets
   ec2:DescribeTags
   ec2:DescribeVolumes
   ec2:DescribeVpcAttribute
   ec2:DescribeVpcClassicLink
   ec2:DescribeVpcClassicLinkDnsSupport
   ec2:DescribeVpcs
   ec2:DisassociateRouteTable
   ec2:ImportKeyPair
   ec2:ModifyVpcAttribute
   ec2:RunInstances
   ec2:TerminateInstances
   iam:AddRoleToInstanceProfile
   iam:CreateInstanceProfile
   iam:CreateRole
   iam:DeleteInstanceProfile
   iam:DeleteRole
   iam:DeleteRolePolicy
   iam:GetInstanceProfile
   iam:GetRole
   iam:GetRolePolicy:
   iam:ListGroups
   iam:ListInstanceProfiles
   iam:ListInstanceProfilesForRole
   iam:ListRolePolicies
   iam:ListRoles
   iam:ListUsers
   iam:PassRole
   iam:PutRolePolicy
   iam:RemoveRoleFromInstanceProfile
   kms:CreateGrant
   kms:GenerateDataKeyWithoutPlaintext
   s3:GetObject
   s3:ListAllMyBuckets
   s3:ListBucket
   s3:PutObject
   s3:PutObjectAcl

はじめに
--------

サービスは物理的に `regions and availability zones <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html>`_ 
に分割されます。アベイラビリティーゾーンは、リージョンコードとそれに続く単一の文字で表されます（例：eu-west-1a）（ただし、その名前は異なるAWSアカウントの異なる場所を指す場合があり、アカウント間の解釈を調整する方法はありません）。

AWS
リージョンは互いに完全に分離されており、リソースを共有しません。リージョン内のアベイラビリティーゾーンは物理的に分離され、論理的にはほとんど分離されていますが、低レイテンシーのリンクで接続されており、特定のネットワーキングリソースを共有できます。

ネットワーキング
^^^^^^^^^^^^^^^^

AWSのすべてのネットワーキング構成は、
 `Virtual Private Cloud <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-vpc.html>`_ のコンテキストで発生します

地域内。 VPC内で、 `subnets <https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html>`_ を作成できます

これは、インターネットゲートウェイ、ルーティングテーブルなどとともに、特定のアベイラビリティーゾーンに関連付けられています。

 `Security Groups <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#vpc-security-groups>`_ はいくつでも作成できます

インスタンスに許可されるインバウンドおよびアウトバウンドトラフィックのルールを構成します（プロトコル、宛先ポート範囲、およびソースまたは宛先IPアドレス範囲の観点から）。

インスタンス
^^^^^^^^^^^^

AWS EC2はさまざまな `instance types <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html>`_ を提供しています

さまざまな価格/パフォーマンスポイントでさまざまなハードウェア構成を使用できます。特定のアベイラビリティーゾーンのサブネット内で、
 `EC2 instances <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Instances.html>`_ を作成できます

 `AMI <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html>`_ として知られる配布画像に基づいて、1つ以上の `EBS volumes <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html>`_ を添付します

インスタンスに永続ストレージを提供します。 `SSH public key <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html>`_ 
を登録することにより、インスタンスにSSHで接続できます。

インスタンスには、常にサブネット内のプライベートIPアドレスが割り当てられます。サブネット構成によっては、
 `ephemeral public IP address <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-public-addresses>`_ が割り当てられる場合もあります

（インスタンスがシャットダウンされると失われ、再度起動すると別のエフェメラルIPが割り当てられます）。代わりに、
 `Elastic IP <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html>`_ と呼ばれる静的リージョン固有のルーティング可能なIPアドレスを割り当てることができます

任意のインスタンスに。

インスタンスが外部から到達可能であるには、ルーティング可能なIPアドレスが必要であるだけでなく、VPCのネットワーキング構成（インターネットゲートウェイ、ルーティングテーブル、セキュリティグループ）もアクセスを許可するように調整する必要があります。

構成
----

``tpaexec configure`` を介して指定するか、
config.ymlで直接定義できるAWS固有の設定の簡単な説明を次に示します。

地域
^^^^

``--region`` または\ ``--regions``
で使用するクラスターの1つ以上の領域を指定できます。
TPAは、それぞれに関連付けられた必要なvpcエントリーを生成し、可能な限り異なるアベイラビリティーゾーンを使用して、これらのリージョンに場所を均等に配布します。

``regions`` は\ ``locations``
とは異なり、各場所はリージョン（およびこのリージョン内のアベイラビリティーゾーン）に属します。
``regions`` はAWS固有のオブジェクト、 ``locations``
はクラスターオブジェクトです。

注：複数のリージョンを指定する場合、ネットワーク構成を手動で編集する必要があります。

-  ``ec2_vpc`` エントリには、AWS
   vpcピアリングの使用を許可する非重複cidrネットワークが必要です。デフォルトでは、TPAはすべてのcidrを\ ``10.33.0.0/16``
   に設定します。詳細については、 :ref:`VPC（必須） <VPC（必須）>` を参照してください。

-  各\ ``location`` は、それらが属する\ ``ec2_vpc`` ``cidr``
   と一致する\ ``subnet``
   で更新する必要があります。詳細については、 :ref:`サブネット（オプション） <サブネット（オプション）>` を参照してください。

-  TPAは、\ ``cluster_rules``
   の下に基本ルールを持つセキュリティグループを作成します。それらは、各\ ``subnet``
   cidrの\ ``ec2_vpc``
   cidrに一致するように更新する必要があります。詳細については、 :ref:`セキュリティグループ（オプション） <セキュリティグループ（オプション）>` を参照してください。

-  VPCピアリングは、\ ``tpaexec deploy``
   の前に手動でセットアップする必要があります。 ``tpaexec configure``
   を実行し、 config.ymlで\ ``vpc-id``
   を使用する前に、VPCと必要なVPCピアリングを作成することをお勧めします。詳細については、 :ref:`VPC（必須） <VPC（必須）>` を参照してください。

VPC（必須）
^^^^^^^^^^^

使用するVPCを指定する必要があります。

::

   ec2_vpc:
     Name: Test
     cidr: 10.33.0.0/16

これはデフォルトの設定で、存在しない場合は指定されたCIDRでTestという名前のVPCを作成し、存在しない場合は既存のVPCを使用します。

VPCを作成するには、 Nameとcidrの両方を指定する必要があります。
VPC名のみを指定した場合、一致するVPCが存在しないとTPAは失敗します。

TPAがVPCを作成する場合、 ``tpaexec deprovision``
はそれを削除しようとしますが、既存のVPCはそのままにします。
（AWSにはアカウントあたりのVPCの数に1桁のデフォルト制限があるため、新しいVPCを作成する前によく考えてください。）

よりきめ細かなマッチングが必要な場合、または異なるリージョンで異なるVPCを指定する場合は、展開されたフォームを使用できます。

::

   ec2_vpc:
     eu-west-1:
       Name: Test
       cidr: 172.16.0.0/16
     us-east-1:
       filters:
         vpc-id: vpc-nnn
     us-east-2:
       Name: Example
       filters:
         [filter expressions]

AMI（必須）
^^^^^^^^^^^

使用するAMIを指定する必要があります。

::

   ec2_ami:
     Name: xxx
     Owner: self

より正確なマッチングのためにフィルター仕様を追加できます。

::

   ec2_ami:
     Name: xxx
     Owner: self
     filters:
       architecture: x86_64
       [more key/value filters]

（デフォルトでは、 ``tpaexec configure`` は ``--distribution``
引数に基づいて適切な\ ``ec2_ami`` を選択します。）

このプラットフォームは、Debian 9（ストレッチ）、RedHat Enterprise Linux
7、Rocky 8、Ubuntu 16.04（Xenial）、およびSUSE Linux Enterprise Server
15をサポートしています。

サブネット（オプション）
^^^^^^^^^^^^^^^^^^^^^^^^

すべてのインスタンスは、そのサブネットを指定する必要があります（
CIDR形式、またはsubnet-xxx
idとして）。オプションで、作成するサブネットごとに名前とアベイラビリティーゾーンを指定できます。

::

   ec2_vpc_subnets:
     us-east-1:
       192.0.2.0/27:
         az: us-east-1b
         Name: example1
       192.0.2.100/27:
         az: us-east-1b
         Name: example2

セキュリティグループ（オプション）
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

デフォルトでは、クラスターのセキュリティグループを作成します。
1つ以上の既存のセキュリティグループを使用するには、次を設定します。

::

   ec2_groups:
     us-east-1:
       group-name:
         - foo

デフォルトのセキュリティグループのルールをカスタマイズする場合は、\ ``cluster_rules``
を設定します。

::

   cluster_rules:

   - cidr_ip: 0.0.0.0/0
     from_port: 22
     proto: tcp
     to_port: 22

   - cidr_ip: 192.0.2.0/27
     from_port: 0
     proto: tcp
     to_port: 65535

   - cidr_ip: 192.0.2.100/27
     from_port: 0
     proto: tcp
     to_port: 65535

この例では、任意のアドレスからのssh（ポート22）、および特定のIP範囲からの任意のポートでのTCP接続を許可します。
（注：from_portとto_portは、ソースと宛先ではなく、ポートの数値範囲を定義します。）

カスタムルールを設定するか、既存のセキュリティグループを使用する場合は、クラスター内のインスタンスが必要に応じて相互に通信できることを確認する必要があります（たとえば、Postgresのtcp/5432を許可します）。

インターネットゲートウェイ（オプション）
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

デフォルトでは、以下を設定しない限り、すべてのVPCにインターネットゲートウェイを作成します。

::

   ec2_instance_reachability: private

よりきめ細かな制御を行うには、次を設定できます。

::

   ec2_vpc_igw:
     eu-west-1: yes
     eu-central-1: yes
     us-east-1: no

SSHキー（オプション）
^^^^^^^^^^^^^^^^^^^^^

::

   #  Set this to change the name under which we register our SSH key.

   #  ec2_key_name: tpa_cluster_name

   # 
   #  Set this to use an already-registered key.

   #  ec2_instance_key: xxx

S3バケット（オプション）
^^^^^^^^^^^^^^^^^^^^^^^^

TPAでは、AWSクラスターをプロビジョニングするためにS3バケットへのアクセスが必要です。このバケットは、SSHホストキーなどのファイルを一時的に保存するために使用されますが、他のクラスターデータ（バックアップなど）にも使用される場合があります。

デフォルトでは、TPAはプロビジョニングするクラスターに\ ``edb-tpa-<aws-account-user-id>``
という名前のS3バケットを使用します。
（バケットが存在しない場合、TPAで作成することを確認するように求められます。）

代わりに既存のS3バケットを使用するには、設定します

::

   cluster_bucket: name-of-bucket

（確認プロンプトなしでデフォルトのバケット名を受け入れるように\ ``cluster_bucket: auto``
を設定することもできます。）

クラスターのプロビジョニングを解除しても、TPAはS3バケットを削除しません。バケットを自分で削除するには、次を実行します。

::

   aws s3 rb s3://<bucket> --force

インスタンスのプロビジョニングに使用しているIAMユーザーには、このバケットへの読み取りおよび書き込みアクセス権が必要です。プロビジョニング中に、
tpaexecは、インスタンスプロファイルを介してcluster_bucketへの読み取り専用アクセスをインスタンスに提供します。

インスタンスプロファイル（オプション）
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

::

   #  Set this to change the name of the instance profile role we create.

   #  cluster_profile: cluster_name_profile

   # 
   #  Set this to use an existing instance profile (which must have all the

   #  required permissions assigned to it).

   #  instance_profile_name: xxx
