LoginSignup
15
6

初心者のためのAWS CDKを使った環境構築

Last updated at Posted at 2024-01-24

はじめに

深い知識のない人でも比較的簡単に環境構築できるAWS CDKを紹介します。
初心者向けの内容となっていますので、少しでも皆さんの参考になれば幸いです。

こんな人に読んで欲しい

  • AWS CDKを使ってみたい
  • もっと簡単に環境構築したい
  • 手動で環境構築したことがある

目次

  • CDKとは
  • 本記事のゴール
  • リソース定義
  • CDKデプロイ
  • おまけ(bootstrapやデプロイに失敗した場合)
  • まとめ

CDKとは

AWS CDK(AWS Cloud Development Kit)とは、プログラミング言語(使用可能言語については後述)を使用してAWS上のリソースを定義できるツールです。
一度定義さえしてしまえば、デプロイや破棄が簡単に可能な点がメリットであると感じます。
また、立ち上げたリソースにはそれぞれ料金がかかりますが、CDKの利用自体は料金がかかりませんので安心してください。

対応言語

  • TypeScript
  • JavaScript
  • Python
  • Java
  • C#
  • Go

本記事のゴール

今回はTypeScriptを使ってS3+CloudFrontの環境を構築します。
複雑な定義は行いませんので、構築後はぜひみなさんの開発に役立ててください。

リソース定義

既に複数アカウントをお持ちの場合は、どのユーザで実行するかを明示するため各コマンドにprofileを指定しましょう。
profile作成が必要な場合はこちらを参考にしてください。

CDK init

はじめにCDKのインストールをしましょう。
作業ディレクトリに移動し、以下コマンドを実行してください。

npm install -g aws-cdk

次のコマンドでバージョンが表示されれば成功です。
私の環境では2.111.0です。

cdk --version

インストール方法はこちらを参照しました。

次にCDKアプリの初回作成です。
以下コマンドを実行しましょう。

cdk init app --language typescript

All done!が表示されれば成功です。

cdk-init.png

いくつかのファイル、ディレクトリが作成されます。

dir.png

S3+CloudFrontのリソース定義

cdk-stack.tsの中に各リソースを定義していきます。

定義している各項目の説明は省きますが、公式ドキュメントに詳細が記載されているので、目的に合わせてカスタマイズしてください。

cdk-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { RemovalPolicy, StackProps } from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as cf from 'aws-cdk-lib/aws-cloudfront';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as cf_origins from 'aws-cdk-lib/aws-cloudfront-origins';

export class CdkStack extends cdk.Stack {

  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // create S3 Bucket
    const s3Bucket = new s3.Bucket(this, 'WebsiteBucket', {
      objectOwnership: s3.ObjectOwnership.BUCKET_OWNER_ENFORCED,
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      encryption: s3.BucketEncryption.S3_MANAGED,
      removalPolicy: RemovalPolicy.DESTROY,
    });
    // set OAI
    const oai = new cf.OriginAccessIdentity(this, 'OriginAccessIdentity', {
      comment: 'website-distribution-originAccessIdentity',
    });

    // set Bucket Policy
    const frontWebBucketPolicyStatement = new iam.PolicyStatement({
      actions: ['s3:GetObject'],
      effect: iam.Effect.ALLOW,
      principals: [new iam.CanonicalUserPrincipal(oai.cloudFrontOriginAccessIdentityS3CanonicalUserId)],
      resources: [`${s3Bucket.bucketArn}/*`],
    });
    s3Bucket.addToResourcePolicy(frontWebBucketPolicyStatement);

    const distribution = new cf.Distribution(this, 'WebsiteDistribution', {
      comment: 'website_distribution',
      defaultRootObject: 'index.html',
      priceClass: cf.PriceClass.PRICE_CLASS_200,
      defaultBehavior: {
        allowedMethods: cf.AllowedMethods.ALLOW_GET_HEAD,
        cachedMethods: cf.CachedMethods.CACHE_GET_HEAD,
        cachePolicy: cf.CachePolicy.CACHING_DISABLED,
        viewerProtocolPolicy: cf.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
        origin: new cf_origins.S3Origin(s3Bucket, {
          originAccessIdentity: oai,
        }),
      },
      minimumProtocolVersion: cf.SecurityPolicyProtocol.TLS_V1_2_2021,
    });
  }
}

CDKデプロイ

bootstrap

初回はbootstrapを実行しましょう。
これはCDKを使用するプロジェクトを初期化し、CDKのスタックをデプロイするための準備作業をしてくれます。
少し時間がかかるので、慌てず待ちましょう。

cdk bootstrap --profile {profile}

エラーが出なければbootstrap完了です!

deploy

それでは最後にデプロイしていきましょう。
デプロイしても良いか聞かれるのでyを入力して次に進んでください。

cdk deploy --profile {profile}

エラーが出なければデプロイ完了です!

確認すると、S3とCloudFrontが作成されています。
それぞれ指定した設定が反映されていることがわかります。

スクリーンショット 2024-01-24 8.43.47.png
スクリーンショット 2024-01-24 8.41.57.png

おまけ(bootstrapやデプロイに失敗した場合)

何らかの理由で失敗した場合、まずはコンソールに出力されるログを確認しましょう。
私の場合リソース定義に誤りがあり、CloudFormationスタックがUPDATE_ROLLBACK_FAILED状態になり、手動削除する必要がありました。
手動削除または手動更新手順

また作成したリソース一式を削除してくれる便利なコマンドがあるので、こちらを実行してみるのも手かなと思います。

cdk destroy --profile {profile}

まとめ

今回はAWS CDKを紹介しました。
リソース定義の書き方については勉強コストがかかりますが、2回目以降の構築が格段に早く、簡単になると思います。
私自身CDKを使い始めたばかりですので、お気づきの点があればぜひコメントください。
ここまで読んでくださりありがとうございました!

15
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6