アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

AWS CDKでALBを作成する

こんにちは!!こんにちは!!インフラエンジニアのyamamotoです。

今日もAWS CDKでクラウドインフラを構築するよー!!

今回はCDKでALBを作ってみました。
コードはこちら!!

※当ブログのコードはTypeScriptで記載しています。

import { Construct, Duration, Stack } from '@aws-cdk/core';
import {
  Peer,
  Port,
  SecurityGroup,
  Vpc,
} from '@aws-cdk/aws-ec2';
import {
  ApplicationLoadBalancer,
  ApplicationProtocol,
  ApplicationTargetGroup,
} from '@aws-cdk/aws-elasticloadbalancingv2';

const env = {
  region: process.env.CDK_INTEG_REGION || process.env.CDK_DEFAULT_REGION,
  account: process.env.CDK_INTEG_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT,
};

/**
 * ALBを作るスタック
 */
export default class AlbStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id, { env });

    // 既存のVPCを調べる
    const vpc = Vpc.fromLookup(this, 'vpc', { vpcName: 'vpc' });

    // 自動生成されるセキュリティグループには問題があるため
    // セキュリティグループを作成する
    const albSecurityGroup = new SecurityGroup(this, 'albSecurityGroup', {
      allowAllOutbound: true,
      securityGroupName: 'alb-sg',
      vpc,
    });
    albSecurityGroup.addIngressRule(Peer.anyIpv4(), Port.tcp(80));
    albSecurityGroup.addIngressRule(Peer.anyIpv4(), Port.tcp(443));

    // ALBを作成する
    const alb = new ApplicationLoadBalancer(this, 'alb', {
      internetFacing: true,
      loadBalancerName: 'alb',
      securityGroup: albSecurityGroup,
      vpc,
      vpcSubnets: { subnets: vpc.publicSubnets },
    });

    // ALBのターゲットグループを作成する
    const targetGroup = new ApplicationTargetGroup(this, 'targetGroup', {
      healthCheck: {
        healthyHttpCodes: '200',
        healthyThresholdCount: 2,
        interval: Duration.seconds(30),
        path: '/',
        timeout: Duration.seconds(5),
        unhealthyThresholdCount: 2,
      },
      port: 80,
      protocol: ApplicationProtocol.HTTP,
      targetGroupName: 'alb-tg',
      vpc,
    });

    // ALBのリスナーを作成する
    alb.addListener('Listener80', {
      defaultTargetGroups: [targetGroup],
      open: true,
      port: 80,
    });
    alb.addListener('Listener443', {
      certificateArns: ['certificate-arn'],
      defaultTargetGroups: [targetGroup],
      open: true,
      port: 443,
    });
  }
}

ALBを作成するとき、特に指定しないとセキュリティグループを自動的に作ってくれるのですが、これが残念ながらうまく動きませんでした。
そのためこちらであらかじめ用意しています。

また、AWS CDKのリファレンスには、AutoScalingGroupからALBを作るケースが載っていますが、諸事情によりここではALBのTargetGroupを作っています。
ただ、AutoScalingGroupとのアタッチはしていないので、そこは手作業なり他のスクリプトでやる必要があります。

こういう事例がいっぱいあると、CDKももっと書きやすくて身近になっていくんじゃないかと思っています!
CloudFormationのYAMLやJSONより簡単に書けますよー、TerraFormと比べると……どうだろう?

さいごに

アクトインディではインフラエンジニアを募集しています!
クラウドやりたいクラウドエンジニアはぜひ! actindi.net