🧑‍💻

#117 AWS CDKを使ってIaCしてみた② - リソース連携

に公開

はじめに

前回の記事では、AWS CDK(Cloud Development Kit)を使って、基本的なインフラリソースをコードで管理する方法をご紹介しました。今回はその続編として、CDKで複数のリソースを連携させてみます。

応用編の概要

今回の応用編では、以下のような内容をカバーします。
複数リソースの連携:CDKを使って、リソース間で依存関係を持つ設定を行います。

複数リソースの連携

CDKの強力な機能の一つは、リソース間の依存関係を自動的に管理してくれる点です。例えば、EC2インスタンスが特定のS3バケットにアクセスできるように設定するには、IAMロールをEC2にアタッチして、S3へのアクセス許可を与える必要があります。

例: EC2インスタンスにS3バケットへのアクセス権限を付与

前回の記事で利用した、lib/aws-cdk-stack.tsを以下のように変更して、cdk synthコマンドとcdk deployコマンドを実行して、各リソースをデプロイしてみましょう。

Terminal
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コンソールで確認してみましょう。

Terminal
cdk synth
cdk deploy

そして、出来上がったEC2インスタンスを確認してみましょう。


無事、作製したVPC(MyAppVpc)にEC2が配置され、作成したセキュリティグループとロールが付与されていることが確認できました。

まとめ

今回の記事では、AWS CDKの応用的な使い方として、複数のリソースを連携する例を紹介しました。CDKを使うことで、インフラ構築の柔軟性が大幅に向上し、開発者としてより効率的にクラウド環境を管理できますので、ぜひトライしてみてください。

参考

AWS CDK API Reference

Discussion