AWS-CloudFormation

CloudFormation-Include CDK Moduleを使ってみる

概要

こんにちは、テクニカルサポートの牛山です。
今回は、AWSのCloudFormationサービスを使用して、スタック情報をAWS CDKへ移行するを実際にやってみたいと思います。

目的

AWSの 「CloudFormationスタックをCDKコードに移行」 することを理解する。

ゴール

「CloudFormationスタックをCDKコードに移行」 できる。

前提条件

  • AWSアカウント
  • IAMユーザに関して理解している
  • AWS EC2作成方法を理解している

手順

AWS CDK CLIのインストール

CloudFormationスタックをCDKコードに移行するためのクラウド開発キット(CDK)を用いる必要があります。
下記、コマンドでインストールされているか確認できます。

[ec2-user@dev ~]$ cdk --version

bash: cdk: コマンドが見つかりません

デフォルト状態のAmazon Linux2にはインストールされていませんのでインストールします。
Node.jsが必要になりますので下記、リンク先にあるNode.jsインストールを参考にセットアップします。
Node.jsのインストール

Node.jsのインストールが完了したら「npm install -g aws-cdk」コマンドで AWS CDK をインストールします。

[ec2-user@dev ~]$ npm install -g aws-cdk

/home/ec2-user/.nvm/versions/node/v14.13.1/bin/cdk -> /home/ec2-user/.nvm/versions/node/v14.13.1/lib/node_modules/aws-cdk/bin/cdk
+ aws-cdk@1.68.0
added 197 packages from 190 contributors in 21.394s

インストールされたことを確認するため「cdk --version」コマンドでCDKバージョンを確認してみます。
今回は、下記バージョン環境で設定をおこないます。

- バージョン
Node.js v14.13.1
AWS CDK 1.68.0 (build a6a3f46)

[ec2-user@dev ~]$ cdk --version

1.68.0 (build a6a3f46)

CloudFormationスタックの作成

CloudFormationテンプレートからAWS CDKへの移行をおこないますので、元となる CloudFormationスタック の作成をおこなっていきます。

[AWS マネジメントコンソール]⇒サービスを検索する欄に[CloudFormation]を入力し、 CloudFormation 画面に遷移します。
 ⇒右上に存在する[スタックの作成]プルダウンを開き、[新しいリソースを使用 (標準)]を選択します。

  • ステップ 1: テンプレートの指定

    • 前提条件 - テンプレートの準備
      デザイナーでテンプレートを作成 を選択。

    • デザイナーでテンプレートを作成
      デザイナーでテンプレートを作成 ボタンを押す。

ボタンを押下後、エディター画面に遷移しますので、下部にある テンプレート タブを選んで入力箇所に、下記Jsonを記述します。

記述後、左上サービス下にある[スタックの作成]ボタンを押します。
{
  "Resources": {
    "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "aws-cdk-test"
      }
    }
  }
}

できあがると、下記、キャプチャ画像のような感じになりますので[次へ]ボタンを押します。

  • ステップ 2: スタックの詳細を指定
    • スタックの名前
      ここでは、 MigrationStack というスタック名にするものとします。

[次へ]ボタンを押します。

  • ステップ 3: スタックオプションの設定

    • なにも入力せず[次へ]ボタンを押す。
  • ステップ 4: レビュー

    • なにも入力せず[スタックの作成]ボタンを押す。

すると、下記、キャプチャ画像のようになります。
イベント項目でMigrationStackがCREATE_COMPLETEとなっていることを確認します。
2020-10-16 10:40:40 UTC+0900 MigrationStack CREATE_COMPLETE
※右側に存在する更新矢印を押すとイベントが更新されます。

プロジェクトフォルダーの作成および初期化

CloudFormationにMigrationStackの作成がおこなえましたので、CDKアプリケーションの作成をおこないます。

[ec2-user@dev ~]$ mkdir my_cicm_proj
[ec2-user@dev ~]$ cd my_cicm_proj/

今回、アプリケーションのビルド環境として TypeScript を用います。
CDKがサポートしている言語として「C#」、「Java」、「Python」等があります。
※C#使ってみましたがエラーでてできませんでした。

「cdk init -l typescript」コマンドで TypeScript のプロジェクトを作成。
無事に完了すると 「All done!」 と出力されます。

npm ERR! Could not resolve dependency: というエラーが出力された場合には、 npm install --save --legacy-peer-deps をプロジェクトフォルダ直下で実行することで解決します。

上記エラーは「インストールするパッケージの最新バージョンが同じでなかったときに発生するエラー」のようです。

[ec2-user@dev my_cicm_proj]$ cdk init -l typescript

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^2.1.2 (node_modules/jest-haste-map/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN my_cicm_proj@0.1.0 No repository field.
npm WARN my_cicm_proj@0.1.0 No license field.

✅ All done!

cloudformation-includeの追加

「package.json」 に対して、 cloudformation-include モジュールを追加します。

package.json の位置

my_cicm_proj
├─ package.json

package.jsonファイル dependencies 項目に「"@aws-cdk/cloudformation-include": "^1.63.0"」を記述します。

[ec2-user@dev my_cicm_proj]$ vi package.json

・
・{略}
・
},
  "dependencies": {
    "@aws-cdk/core": "1.68.0",
    /** ↓↓↓↓ 追加 ここから ↓↓↓↓ */
    "@aws-cdk/cloudformation-include": "^1.63.0",
    /** ↑↑↑↑ 追加 ここまで ↑↑↑↑ */
    "source-map-support": "^0.5.16"
  }
}

[ec2-user@dev my_cicm_proj]$ npm install

npm WARN my_cicm_proj@0.1.0 No repository field.
npm WARN my_cicm_proj@0.1.0 No license field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 147 packages from 9 contributors and audited 997 packages in 41.351s

28 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

前行程でCloudFormationに対して、「記述後、左上サービス下にある[スタックの作成]ボタンを押します。」で記述したJsonコードを 「my_cicm_proj」 直下に 「migrationStackTemplate.json」 ファイルを作成して Json コードを記述します。

これから、編集および参照するファイルの位置

my_cicm_proj
├─ migrationStackTemplate.json
│
├─ bin
│   │
│   ├─ my_cicm_proj.ts
│
├─ lib
│   │
│   ├─ my_cicm_proj-stack.ts

[ec2-user@dev my_cicm_proj]$ vi migrationStackTemplate.json

{
    "Resources": {
      "Bucket": {
        "Type": "AWS::S3::Bucket",
        "Properties": {
          "BucketName": "aws-cdk-test"
        }
      }
    }
}

次に、 「my_cicm_proj-stack.ts」 ファイルを開き、下記のように記述します。

[ec2-user@dev my_cicm_proj]$ vi lib/my_cicm_proj-stack.ts

import * as cdk from '@aws-cdk/core';

/** ↓↓↓↓ 追加 ここから ↓↓↓↓ */
import * as cfn_inc from '@aws-cdk/cloudformation-include';
/** ↑↑↑↑ 追加 ここまで ↑↑↑↑ */

export class MyCicmProjStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    /** ↓↓↓↓ 追加 ここから ↓↓↓↓ */
    const cfnInclude = new cfn_inc.CfnInclude(this, 'Template', {
      templateFile: 'migrationStackTemplate.json',
    });
    /** ↑↑↑↑ 追加 ここまで ↑↑↑↑ */
  }
}

次に、 「my_cicm_proj.ts」 ファイルを開き、下記のような感じになっていることを確認します。

[ec2-user@dev my_cicm_proj]$ cat bin/my_cicm_proj.ts

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { MyCicmProjStack } from '../lib/my_cicm_proj-stack';

const app = new cdk.App();
new MyCicmProjStack(app, 'MyCicmProjStack');

AWS CDK認証情報の設定

「aws configure list」コマンドでAWS CDKに対してAWS認証情報が設定されているか確認をおこないます。
「None」 と出力され設定されていないことが確認できます。

[ec2-user@dev my_cicm_proj]$ aws configure list

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
    region                <not set>             None    None

別記事にはなりますが、Amplifyの記事で、IAMユーザ作成をする下記リンク記事が参考になりますのでこれをもとにIAMユーザを作成します。
IAMユーザには管理者権限が必要になりますので管理者アカウントでログインする必要があります。
Amplifyを設定する
※AWS参考記事
設定ファイルと認証情報ファイルの設定
設定の基本

上記、作成した認証情報をAWS CDKに対して「aws configure」コマンドを使用して設定します。
認証情報は、隠しています。

[ec2-user@dev my_cicm_proj]$ aws configure

AWS Access Key ID [None]: ***************
AWS Secret Access Key [None]: ***************
Default region name [None]: ***************

※一般的に「credentials.csv」に認証情報が記述されています。(IAMユーザ作成の時にダウンロードしておくようにします。)

上記で設定した認証情報が正しく設定されているか「aws configure list」コマンドで確認できます。
下記のように出力されることを確認してください。

[ec2-user@dev my_cicm_proj]$ aws configure list

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ******************** shared-credentials-file    
secret_key     ******************** shared-credentials-file    
    region           ***********      config-file    ~/.aws/config

MigrationStackが持つaws-cdk-testリソースはCDKアプリケーションに含まれているため、diffコマンドにはそれに関連する差分は表示されませんが動作確認のため 「cdk diff」 コマンドを使用して下記画像のようなJsonコードが出力されることを確認します。

出力されたら、「CloudFormationスタックをCDKコードに移行」 が正常におこなえたことになります。

[ec2-user@dev my_cicm_proj]$ cdk diff

まとめ

C#で最初試して見ましたが、エラーが解消せず、TypeScriptで設定してきました。
今回、記事の目的は達成できたので、今度は、CDKコマンド操作で 「テンプレートから取り込んだリソースの変更」 をおこなっていけたら良いかなと思っています。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA