この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
先日、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>>