AWS CDKでEC2のキーペアを作成してみた

先日、EC2のキーペアに新しい管理機能が追加されて、CloudFormationでキーペアが作成できるようになりました。 cdkでもv2.25.0でキーペアが作成できるようになったので試してみました。
2022.06.13

先日、EC2のキーペアに新しい管理機能が追加されて、CloudFormationでキーペアが作成できるようになりました。

CloudFormationでキーペアが作成できるようになったんだから、そのうちcdkでもキーペアが作成できるようになるだろうと待っていました。 v2.25.0 でできるようになったので試してみました。

前提条件

AWS CDKはv2.25.0以上を使用します。

$ cdk --version
2.25.0 (build ae1cb4b)

構成図

ざっくりこんな感じの環境を作ります。

AWS CDKのサンプルプログラム

TypeScriptのサンプルプログラムは次のとおりです。

cdk.ts

#!/usr/bin/env node
import "source-map-support/register"
import {Construct} from 'constructs'
import {App, CfnOutput, RemovalPolicy, Stack, StackProps, Token} from 'aws-cdk-lib'
import * as ec2 from 'aws-cdk-lib/aws-ec2'

class TestStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // VPC作成
    const vpc = new ec2.Vpc(this, 'VPC', {
      maxAzs: 2,
      natGateways: 0,
      subnetConfiguration: [{
        name: 'PublicSubnet',
        subnetType: ec2.SubnetType.PUBLIC,
      }],
    })

    // キーペア作成
    const cfnKeyPair = new ec2.CfnKeyPair(this, 'CfnKeyPair', {
      keyName: 'test-key-pair',
    })
    cfnKeyPair.applyRemovalPolicy(RemovalPolicy.DESTROY)

    // キーペア取得コマンドアウトプット
    new CfnOutput(this, 'GetSSHKeyCommand', {
      value: `aws ssm get-parameter --name /ec2/keypair/${cfnKeyPair.getAtt('KeyPairId')} --region ${this.region} --with-decryption --query Parameter.Value --output text`,
    })

    // EC2作成
    const instance = new ec2.Instance(this, 'Instance', {
      vpc,
      instanceType: ec2.InstanceType.of(
          ec2.InstanceClass.T3,
          ec2.InstanceSize.NANO,
      ),
      machineImage: new ec2.AmazonLinuxImage({
        generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      }),
      keyName: Token.asString(cfnKeyPair.ref),
    })
    instance.connections.allowFromAnyIpv4(ec2.Port.tcp(22))
  }
}

const app = new App()
new TestStack(app, 'TestStack',)

CDKでEC2のキーペアを作成する

上記の cdk.ts を次のコマンドを実行してデプロイすると、EC2とキーペアが構築できます。

$ cdk deploy TestStack

キーペアの秘密鍵はSystems Managerのパラメータストアに保存されています。

秘密鍵はAWS CLIで取得することもできます。 取得するためのコマンドを TestStack のOutputに出力するようにしているので、これを実行して出力結果を保存すれば秘密鍵になります。

この出力結果を適当なファイル(例:cdk-key-pair-sample)に保存して、次のようにパーミッション設定をすればSSH接続できます。

$ chmod 600 cdk-key-pair-sample
$ ssh -i cdk-key-pair-sample ec2-user@<<EC2のパブリックIP>>

参考URL