📝
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