RareJob Tech Blog

レアジョブテクノロジーズのエンジニア・デザイナーによる技術ブログです

CDK インポート を試してみる

はじめに

こんにちは、DevOps グループの中島です。
弊社では AWS CDK を用いて AWS リソースを管理しています。
過去にコンソールから作成したリソースを CDK に取り込みたいと思い、
CDK インポートを利用する機会があったので紹介します。
使ってみた系記事では触れられてない機能の紹介もあるので参考にしてみてください。

CDK インポートとは

cdk import は CDK 以外の手段で作成した AWS リソースを CDK 管理下に置くことができる機能です。

使い方

CDK インポートの使い方は以下のようになります。
こちらの記事 で詳しく書かれており参考にさせて頂きました。

  1. インポートしたいリソースを用意する
  2. インポート先の Cloudformation スタックを CDK で作成する
  3. インポートしたいリソースの CDK コードを書く
  4. cdk import を実行する

リスナールールをインポートする

CDK インポートを利用したいモチベーションは、現在 100 以上ある ALB のリスナールール (上限緩和済み) を CDK で管理したいというものでした。リスナーの数が多く、コンソールから変更や追加を行うのは苦しいものです。

とはいえ、以下は aws elbv2 describe-rules コマンドで出力されるリスナールール 1 つ分ですが、これ自体を入力とする CDK コードを書いても管理が煩わしいように感じられます。

{
    "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:...",
    "Priority": "200",
    "Conditions": [
        {
            "Field": "path-pattern",
            "Values": [
                "/hogehoge/"
            ],
            "PathPatternConfig": {
                "Values": [
                    "/hogehoge/"
                ]
            }
        },
        {
            "Field": "host-header",
            "Values": [
                "hoge-www.rarejob.com"
            ],
            "HostHeaderConfig": {
                "Values": [
                    "hoge-www.rarejob.com"
                ]
            }
        }
    ],
    "Actions": [
        {
            "Type": "forward",
            "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:...",
            "ForwardConfig": {
                "TargetGroups": [
                    {
                        "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:...",
                        "Weight": 1
                    }
                ],
                "TargetGroupStickinessConfig": {
                    "Enabled": false
                }
            }
        }
    ],
    "IsDefault": false
}

そこで今回は、なるべく見やすい json ファイルを入力にする CDK コードを書きました。
1 ルールにつき 7 〜 8 行です。これくらいなら許容範囲でしょう。
フォーマッターを使うと崩れてしまいますが、見やすさを優先しています。

{
  "targetGroups": {
    "my-web": "my-web ターゲットグループの ARN"
  },
  "rules": [
    {
      "priority": 200,
      "if": {
        "hostHeaders": ["my-web.rarejob.com"],
        "httpHeadersCookie": ["*my_cookie=1*"]
      },
      "then": { "forward": [{"target": "my-web"}] }
    },
    {
      "priority":400,
      "if": {
        "pathPatterns": ["/hogehoge/*"]
      },
      "then": { "redirect": "https://#{host}:443/hoge/?#{query}", "status": 302 }
    }
  ]
}

aws elbv2 describe-rules で出力した結果をパースして、上記の json にするプログラムも別途書いています。
また、例は jsonですが、コメントを入れられるように (json5)https://json5.org/ が読み込めるようにしました。

CDK インポートしてみる

それでは cdk インポートをしてみます。

$ npx cdk import
The 'cdk import' feature is currently in preview.
TestStack
TestStack/rule200/Resource (AWS::ElasticLoadBalancingV2::ListenerRule): enter RuleArn to import (empty to skip):

すると、上記の最終行のように CDK コード上の Construct ID rule200 に対して、AWS 上に存在するどのルールをマッピングするかを聞かれます。
ルールの ARN を入力することになるのですが、これを正確に 100 以上も手入力するのはかなり苦しいです。苦しみから開放されるためにエンジニアしているはずでは?と自問しながら入力してはエラーとなり何度もやりなおしました。

resource-mapping

しかし実はターミナル上で入力しなくても良い機能が実装されています。
-rマッピングのテンプレートを出力して、-m で取り込むことが出来ます。
少し前のバージョンでは -r がうまく動かなかったので、 cdk import がまだプレビューであることを感じられます。

$ cdk import --help
.
.
  -r, --record-resource-mapping  If specified, CDK will generate a mapping of
                                 existing physical resources to CDK resources to
                                 be imported as. The mapping will be written in
                                 the given file path. No actual import operation
                                 will be performed                      [string]
  -m, --resource-mapping         If specified, CDK will use the given file to
                                 map physical resources to CDK resources for
                                 import, instead of interactively asking the
                                 user. Can be run from scripts          [string]
.
.

リスナールールインポートの顛末

ここまでやったのですが、結局リスナールールのインポートはしていません。
対象の ALB は BlueGreen デプロイを CodeDeploy で実装しており、
デプロイ時に CodeDeploy がリスナールールのフォワード先を Blue のターゲットグループから Green のターゲットグループに書き換えてしまうからです。
CDK のコードと AWS 上の設定が異なると都合が悪いので、CDK で管理することは見送りました。

終わりに

CDK インポートを利用してリスナールールを CDK 管理にする試みと、 大量リソースをインポートする際に役立つ機能を紹介しました。
似たようなユースケースで参考になる部分があれば幸いです。

We're hiring!
弊社では、特に DevOps グループでは、一緒に働いてくださるエンジニアを大募集しています。
rarejob-tech.co.jp