aws

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

APIアクセス設定

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

たとえば、

[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 に分割されます。アベイラビリティーゾーンは、リージョンコードとそれに続く単一の文字で表されます(例:eu-west-1a)(ただし、その名前は異なるAWSアカウントの異なる場所を指す場合があり、アカウント間の解釈を調整する方法はありません)。

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

ネットワーキング

AWSのすべてのネットワーキング構成は、

Virtual Private Cloud のコンテキストで発生します

地域内。 VPC内で、 subnets を作成できます

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

Security Groups はいくつでも作成できます

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

インスタンス

AWS EC2はさまざまな instance types を提供しています

さまざまな価格/パフォーマンスポイントでさまざまなハードウェア構成を使用できます。特定のアベイラビリティーゾーンのサブネット内で、

EC2 instances を作成できます

AMI として知られる配布画像に基づいて、1つ以上の EBS volumes を添付します

インスタンスに永続ストレージを提供します。 SSH public key を登録することにより、インスタンスにSSHで接続できます。

インスタンスには、常にサブネット内のプライベートIPアドレスが割り当てられます。サブネット構成によっては、

ephemeral public IP address が割り当てられる場合もあります

(インスタンスがシャットダウンされると失われ、再度起動すると別のエフェメラルIPが割り当てられます)。代わりに、

Elastic IP と呼ばれる静的リージョン固有のルーティング可能な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 に設定します。詳細については、 VPC(必須) を参照してください。

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

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

  • VPCピアリングは、tpaexec deploy の前に手動でセットアップする必要があります。 tpaexec configure を実行し、 config.ymlでvpc-id を使用する前に、VPCと必要な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