📝

EC2 インスタンスをエンドポイントに指定した AWS Global Accelerator を CDK で作成してみた

に公開

EC2 インスタンスをエンドポイントに指定した AWS Global Accelerator を AWS CLI で作成してみた
上記の CDK 版です。
ただし、今回は EC2 インスタンスを東京リージョンにのみ作成しました。

前提

  • CDK 実行環境は Cloud9

1. CDK プロジェクト作成

$ mkdir -p ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
$ npm install -g typescript
$ tsc -v
Version 5.9.2

$ mkdir global-accelerator-cdk
$ cd global-accelerator-cdk
$ cdk init app --language typescript

2. CDK コード作成

import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as globalaccelerator from 'aws-cdk-lib/aws-globalaccelerator';
import * as ga_endpoints from 'aws-cdk-lib/aws-globalaccelerator-endpoints';
import { Construct } from 'constructs';

export class GlobalAcceleratorCdkStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // VPCの作成
    const vpc = new ec2.Vpc(this, 'GlobalAcceleratorVpc', {
      maxAzs: 2, // 2つのアベイラビリティゾーンを使用
      natGateways: 0, // NATゲートウェイは不要(コスト削減)
    });

    // セキュリティグループの作成
    const securityGroup = new ec2.SecurityGroup(this, 'WebServerSG', {
      vpc,
      description: 'Security group for web server',
      allowAllOutbound: true,
    });

    // HTTP(ポート80)のインバウンドルールを追加
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(80),
      'Allow HTTP traffic'
    );

    // ユーザーデータスクリプト(AWS CLIで使用したものと同じ内容)
    const userData = ec2.UserData.forLinux();
    userData.addCommands(
      'yum update -y',
      'yum install -y httpd',
      'systemctl start httpd',
      'systemctl enable httpd',
      'echo "<h1>Hello from Tokyo Region!</h1>" > /var/www/html/index.html',
      'echo "<p>Server: $(hostname)</p>" >> /var/www/html/index.html',
      'echo "<p>Region: ap-northeast-1 (Tokyo)</p>" >> /var/www/html/index.html'
    );

    // EC2インスタンスの作成
    const webServer = new ec2.Instance(this, 'TokyoWebServer', {
      vpc,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO),
      machineImage: ec2.MachineImage.latestAmazonLinux2(),
      securityGroup,
      userData,
      vpcSubnets: {
        subnetType: ec2.SubnetType.PUBLIC, // パブリックサブネットに配置
      },
    });

    // インスタンスにタグを追加
    cdk.Tags.of(webServer).add('Name', 'GlobalAccelerator-Tokyo');
    
        // Global Acceleratorの作成
    const accelerator = new globalaccelerator.Accelerator(this, 'MyFirstAccelerator', {
      acceleratorName: 'MyFirstAccelerator',
      ipAddressType: globalaccelerator.IpAddressType.IPV4,
      enabled: true,
    });

    // リスナーの作成
    const listener = new globalaccelerator.Listener(this, 'AcceleratorListener', {
      accelerator,
      protocol: globalaccelerator.ConnectionProtocol.TCP,
      portRanges: [
        {
          fromPort: 80,
          toPort: 80,
        },
      ],
    });

    // エンドポイントグループの作成(修正版)
    const endpointGroup = listener.addEndpointGroup('TokyoEndpointGroup', {
      region: 'ap-northeast-1', // 東京リージョン
      endpoints: [
        new ga_endpoints.InstanceEndpoint(webServer, {
          weight: 128,
        }),
      ],
    });

    // Global AcceleratorのDNS名を出力
    new cdk.CfnOutput(this, 'AcceleratorDnsName', {
      value: accelerator.dnsName,
      description: 'Global Accelerator DNS Name',
    });
  }
}

3. デプロイ

$ cdk synth
$ cdk deploy

4. 動作確認

デプロイ完了後、Global Accelerator コンソールから静的 IP アドレスセットにアクセスして EC2 インスタンスのページが表示されれば OK です。

まとめ

今回は EC2 インスタンスをエンドポイントに指定した AWS Global Accelerator を CDK で作成してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion