はじめに
前回の記事では、AWS CDK(Cloud Development Kit)を使って、基本的なインフラリソースをコードで管理する方法をご紹介しました。今回はその続編として、CDKで複数のリソースを連携させてみます。
応用編の概要
今回の応用編では、以下のような内容をカバーします。
複数リソースの連携:CDKを使って、リソース間で依存関係を持つ設定を行います。
複数リソースの連携
CDKの強力な機能の一つは、リソース間の依存関係を自動的に管理してくれる点です。例えば、EC2インスタンスが特定のS3バケットにアクセスできるように設定するには、IAMロールをEC2にアタッチして、S3へのアクセス許可を与える必要があります。
例: EC2インスタンスにS3バケットへのアクセス権限を付与
前回の記事で利用した、lib/aws-cdk-stack.tsを以下のように変更して、cdk synthコマンドとcdk deployコマンドを実行して、各リソースをデプロイしてみましょう。
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class AwsCdkStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// S3バケットの作成
const bucket = new s3.Bucket(this, 'MyAppBucket', {
versioned: true, // バージョニングを有効化
});
// EC2インスタンス用のVPCの作成
const vpc = new ec2.Vpc(this, 'MyAppVpc', {
maxAzs: 2, // 利用するアベイラビリティゾーンの最大数
});
// IAMロールの作成: EC2インスタンスがAWSリソースにアクセスする権限を持つ
const role = new iam.Role(this, 'MyAppEc2Role', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'), // EC2インスタンスがこのロールを引き受ける
});
// IAMロールにS3バケットへの読み書き権限を付与
bucket.grantReadWrite(role);
// セキュリティグループの作成: EC2インスタンスのネットワークアクセスを制御
const securityGroup = new ec2.SecurityGroup(this, 'MyTestSg', {
vpc,
description: 'Allow SSH access to EC2 instance',
allowAllOutbound: true, // インスタンスからのアウトバウンドトラフィックを許可
});
// SSHアクセスを許可 (ポート22)
securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'Allow SSH access');
// EC2インスタンスの作成
new ec2.Instance(this, 'MyAppInstance', {
vpc, // 作成したVPCに関連付け
role, // IAMロールを関連付けて権限を付与
instanceType: new ec2.InstanceType('t2.micro'), // インスタンスタイプを指定
machineImage: ec2.MachineImage.latestAmazonLinux(), // 最新のAmazon Linux AMIを使用
securityGroup, // セキュリティグループを関連付け
});
}
}
上記のコードでは、以下の処理を行っています。
・S3バケットを作成
・EC2インスタンスが配置されるVPCを作成
・EC2インスタンス用のIAMロールを作成し、そのロールにS3への読み書き権限を付与
・そのロールを持つEC2インスタンスを作成
「EC2インスタンスの作成」の部分を見てわかるように、new ec2.Instance()の引数の一部として、連携対象であるvpcのデータやroleのデータを渡すだけで、リソース間の連携をすることができます。どういったメソッドにどんな値を渡すことができるかについてはAWS CDKの公式情報(AWS CDK API Reference)を確認してみると良いでしょう。このようにしてCDKでは、リソース間の依存関係を自動で解決してくれます。実際にデプロイしてAWSコンソールで確認してみましょう。
cdk synth
cdk deploy
そして、出来上がったEC2インスタンスを確認してみましょう。


無事、作製したVPC(MyAppVpc)にEC2が配置され、作成したセキュリティグループとロールが付与されていることが確認できました。
まとめ
今回の記事では、AWS CDKの応用的な使い方として、複数のリソースを連携する例を紹介しました。CDKを使うことで、インフラ構築の柔軟性が大幅に向上し、開発者としてより効率的にクラウド環境を管理できますので、ぜひトライしてみてください。