GS2-CDK を使用したセットアップ

GS2-CDK を使用して GS2-Deploy のテンプレートを作成する

GS2-Deploy は環境構築のために素晴らしい成果をあげています。 しかし、テンプレートの記述方法にはまだ課題がありました。それは、テンプレートファイルを記述するのに入力支援が得られないことです。

GS2-Deploy を設計するのに AWS の Cloud Formation を参考にしたのはすでに説明した通りですが、 2019年に AWS が発表したのが AWS CDK(Cloud Development Kit)です。

これは、従来のJSONやYAMLでのテンプレートファイルを記述するのに入力支援を得られない という問題の解決策として、各種プログラミング言語でテンプレートを記述できるようにしよう という成果です。

2019年のサービス開始から、GS2 はずっと JSON/YAML によるテンプレートのデプロイ機能を提供してきましたが、2022年11月に GS2 も CDK のサポートを開始しました。 CDK は現在 Go / Java / PHP / Python / TypeScript をサポートしています。

それぞれのプログラミング言語で、GS2-Inventory の GS2-Deploy 用のテンプレートを生成するコードを記述した例が以下です。

    stack := core.NewStack()

    inventory.NewNamespace(
        &stack,
        "test",
        inventory.NamespaceOptions{
        },
    ).MasterData(
        []inventory.InventoryModel{
            inventory.NewInventoryModel(
                "inventory",
                5,
                10,
                []inventory.ItemModel{
                    inventory.NewItemModel(
                        "Potion",
                        99,
                        true,
                        1,
                        inventory.ItemModelOptions{},
                    ),
                },
                inventory.InventoryModelOptions{},
            ),
        },
    )

    stack.Yaml();
    class SampleStack extends Stack {

        public SampleStack() {
            new io.gs2.cdk.inventory.model.Namespace(
                    this,
                    "test",
                    new io.gs2.cdk.inventory.model.options.NamespaceOptions()
            ).masterData(
                    Arrays.asList(
                            new io.gs2.cdk.inventory.model.InventoryModel(
                                    "inventory",
                                    5,
                                    10,
                                    Arrays.asList(
                                            new io.gs2.cdk.inventory.model.ItemModel(
                                                    "Potion",
                                                    99L,
                                                    true,
                                                    1
                                            )
                                    )
                            )
                    )
            );
        }
    }

    new SampleStack().yaml();
    class SampleStack extends Stack {

        function __construct() {
            parent::__construct();

            (new \Gs2Cdk\Inventory\Model\Namespace_(
                stack: $this,
                name: "test",
            ))->masterData(
                [
                    new \Gs2Cdk\Inventory\Model\InventoryModel(
                        name: "inventory",
                        initialCapacity: 5,
                        maxCapacity: 10,
                        itemModels: [
                            new \Gs2Cdk\Inventory\Model\ItemModel(
                                name: "Potion",
                                stackingLimit: 99,
                                allowMultipleStacks: true,
                                sortValue: 1,
                            )
                        ],
                    ),
                ],
            );
        }
    }

    (new SampleStack())->yaml();
    class SampleStack(gs2_cdk.Stack):

        def __init__(self):
            super().__init__()

            inventory.Namespace(
                stack=self,
                name="test",
            ).master_data(
                [
                    inventory.InventoryModel(
                        name="inventory",
                        initial_capacity=5,
                        max_capacity=10,
                        item_models=[
                            inventory.ItemModel(
                                name="Potion",
                                stacking_limit=99,
                                allow_multiple_stacks=True,
                                sort_value=1,
                            ),
                        ],
                    ),
                ]
            )

    SampleStack().yaml()
    class SampleStack extends core.Stack {

        public constructor() {
            super();

            new inventory.model.Namespace(
                this,
                "test",
            ).masterData(
                [
                    new inventory.model.InventoryModel(
                        "inventory",
                        5,
                        10,
                        [
                            new inventory.model.ItemModel(
                                "Potion",
                                99,
                                true,
                                1,
                            )
                        ],
                    ),
                ]
            );
        }
    }

    new SampleStack().yaml();

生成したテンプレートファイルを GS2-SDK を使用してマスターデータとして反映するところまで繋げば、GS2 のリソースメンテナンスを全てプログラミング言語上で完結することが可能となります。