すべてのプロダクト
Search
ドキュメントセンター

Compute Nest:コンテナアプリケーションと ApsaraDB RDS データベースを含むサービスを作成する

最終更新日:Jun 08, 2025

このトピックでは、Compute Nest でコンテナアプリケーションと ApsaraDB RDS データベースを含むサービスを作成する方法について説明します。

前提条件

Container Service for Kubernetes (ACK) クラスターが作成されていること。詳細については、「ACK マネージドクラスターを作成する」をご参照ください。

手順

この例では、プリセットデータベース初期化スクリプトを含む基本コンテナイメージを使用します。サービスインスタンスの作成中に、データベースが自動的に初期化され、次に「ComputeNest」を含むデータエントリがデータベースに挿入されます。サービスインスタンスの作成後、API 操作を呼び出してデータベースをクエリします。Hello ComputeNest が返されます。この手順には、次のステップが含まれます。

ステップ 1: コンテナイメージを準備する

サービスを作成する前に、コンテナイメージを準備し、サービスプロバイダーがイメージを管理する Compute Nest のプライベートイメージリポジトリにコンテナイメージをアップロードする必要があります。

  1. コンテナイメージを準備します。

    次のいずれかの方法を使用して、ローカルコンテナイメージを準備します。

    • Alibaba Cloud が提供するコンテナイメージを使用します。

      docker pull compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/bestpractice/springboot-demo:demo
    • ソースコードを書き直して、コンテナイメージを作成します。

      1. イメージのソースコード を取得し、ビジネス要件に基づいてコードを書き直します。

      2. ソースコードのルートディレクトリ(pom.xml があるディレクトリ)で、Maven を使用してプログラムを JAR パッケージにパッケージ化します。JAR パッケージは、自動的に target ディレクトリに保存されます。

        mvn install
      3. イメージをビルドします。

        イメージがビルドされると、イメージは自動的にコンピューターにダウンロードされます。

        docker build --build-arg JAR_FILE=target/\*.jar -t <your-image-tag> .
  2. コンテナイメージを Compute Nest イメージリポジトリにアップロードします。

    1. イメージリポジトリにログインし、イメージにタグを追加し、イメージをイメージリポジトリにプッシュするために使用される docker コマンドを取得します。

      1. Compute Nest コンソール にログインします。

      2. 左側のナビゲーションウィンドウで、[サービスデプロイメントパッケージ] をクリックします。「パッケージ」タブで、[デプロイメントパッケージの作成] をクリックします。

      3. 「デプロイメントパッケージの作成」ページで、[デプロイメントパッケージタイプ] パラメーターを「コンテナイメージ」に設定し、[アクセス認証情報の取得] をクリックします。イメージリポジトリにログインし、イメージにタグを追加し、イメージをイメージリポジトリにプッシュするために使用されるコマンドをコピーします。

      4. Docker を実行し、コピーしたコマンドを CLI ターミナルで実行します。运行命令

ステップ 2: コンテナイメージタイプのデプロイメントパッケージを作成する

サービスを作成する前に、コンテナイメージタイプのデプロイメントパッケージを作成して配布する必要があります。

  1. Compute Nest コンソール にログインします。

  2. 左側のナビゲーションウィンドウで、[サービスデプロイメントパッケージ] をクリックします。「パッケージ」タブで、[デプロイメントパッケージの作成] をクリックします。

  3. [基本情報][デプロイメントパッケージの内容][配布設定] セクションのパラメーターを「デプロイメントパッケージの作成」ページで設定します。

    パラメーター

    名前

    Spring Boot コンテナデプロイメント

    バージョン名

    Spring Boot コンテナデプロイメントバージョン 1

    説明

    コンテナイメージタイプの Spring Boot デプロイメントパッケージ

    デプロイメントパッケージタイプ

    コンテナイメージ

    製品を選択

    • 最初のドロップダウンリストから springbootdemo を選択します。

    • 2 番目のドロップダウンリストから最新バージョンを選択します。

  4. [デプロイメントパッケージの公開] をクリックします。

    [デプロイメントパッケージの公開] をクリックすると、[パッケージ] タブでデプロイメントパッケージを見つけることができます。デプロイメントパッケージをクリックして詳細ページに移動し、デプロイメントパッケージのステータスを表示します。

    デプロイメントパッケージが「使用可能」状態になると、デプロイメントパッケージは公開されます。

ステップ 3: サービスを作成する

  1. Compute Nest コンソール にログインします。

  2. 左側のナビゲーションウィンドウで、[マイサービス] をクリックします。[マイサービス] ページの [作成済みサービス] タブで、[サービスの作成] をクリックします。

  3. [サービスの作成] ページで、ビジネス要件に基づいてパラメーターを設定します。

    次のセクションでは、コンテナイメージの関連付けに関連するパラメーターのみについて説明します。詳細については、「プライベートサービスを作成する」をご参照ください。

    • [テンプレートの内容] フィールドに、テンプレートの内容を入力します。 次のテンプレートの内容では、コンテナイメージの関連付けに関連するパラメーターのみについて説明します。テンプレートの完全なサンプルコードについては、このトピックのサンプルテンプレートセクションを参照してください。

      • コンテナがデプロイされると、コンテナイメージは Compute Nest のプライベートイメージリポジトリからプルされます。ACK クラスターは、Compute Nest のプライベートイメージリポジトリにアクセスできる必要があります。そのため、テンプレートには dockerconfigjson タイプのシークレットが定義されており、Compute Nest 識別子 {{ computenest::acr::dockerconfigjson }} が使用されます。

        ClusterApplication:
          DependsOn: Database
          Type: ALIYUN::CS::ClusterApplication
          Properties:
            ClusterId:
              Ref: ClusterId
            YamlContent:
              Fn::Sub:
                - |
                # 省略されたコンテンツ。
                  apiVersion: v1
                  data:
                    .dockerconfigjson: {{ computenest::acr::dockerconfigjson }}
                  kind: Secret
                  metadata:
                    name: computenestrepo
                    namespace: ${NameSpace}
                  type: kubernetes.io/dockerconfigjson
                # 省略されたコンテンツ。
      • テンプレートで、{{ computenest:: acriimage::springbootdemo }} 識別子を使用して、テンプレート内のイメージを作成したデプロイメントパッケージに関連付けます。

        ClusterApplication:
          DependsOn: Database
          Type: ALIYUN::CS::ClusterApplication
          Properties:
            ClusterId:
              Ref: ClusterId
            YamlContent:
              Fn::Sub:
                - |
                # 省略されたコンテンツ。
                  apiVersion: apps/v1
                  kind: Deployment
                  metadata:
                    labels:
                      app: springboot-demo-deployment
                    name: springboot-demo-deployment
                    namespace: ${NameSpace}
                  spec:
                    progressDeadlineSeconds: 600
                    replicas: 2
                    revisionHistoryLimit: 10
                    selector:
                      matchLabels:
                        app: springboot-demo-pod
                    template:
                      metadata:
                        labels:
                          app: springboot-demo-pod
                      spec:
                        containers:
                          - env:
                              - name: DB_HOST
                                value: ${RdsConnectString}
                              - name: DB_USER
                                value: ${DbUser}
                              - name: DB_PASSWORD
                                value: ${DbPassword}
                            image: {{ computenest::acrimage::springbootdemo }}
                            imagePullPolicy: Always
                            name: springboot-demo-container
                            ports:
                              - containerPort: 8080
                                protocol: TCP
                        imagePullSecrets:
                          - name: computenestrepo
                        restartPolicy: Always
                # 省略されたコンテンツ。
    • [デプロイメントパッケージの関連付け] セクションの [コンテナイメージの関連付けの設定] セクションで、作成したコンテナイメージタイプのデプロイメントパッケージを選択し、バージョンを選択します。

  4. [サービスの作成] をクリックします。

  5. サービスをテストします。

    サービスを作成したら、サービスをテストして正しく動作することを確認する必要があります。詳細については、「サービスをテストする」をご参照ください。

  6. サービスを公開します。

    サービステストに合格したら、サービスをレビューに提出します。レビューに合格したら、サービスを公開します。詳細については、「サービスを公開する」をご参照ください。

ステップ 4: サービスインスタンスを作成し、データベースをクエリする

顧客としてサービスインスタンスを作成して、サービスに設定されたコンテナイメージが正しくデプロイされるかどうかを確認できます。

  1. サービスインスタンスを作成します。

    詳細については、「プライベートサービスインスタンスを作成する」をご参照ください。

    サービスインスタンスが正常にデプロイされると、コンテナイメージタイプのデプロイメントパッケージもサービスインスタンスに正常にデプロイされます。

  2. データベースをクエリします。

    kubectl CLI を使用して LoadBalancer エンドポイントをクエリし、取得したパブリック IP アドレスを使用してアプリケーションにアクセスし、返された結果を表示します。返回结果

サンプルテンプレート

このシナリオで必要な Resource Orchestration Service (ROS) リソースと関数については、次のトピックを参照してください。

次のサンプルコードは、このシナリオに固有の完全なテンプレートの内容を示しています。

ROSTemplateFormatVersion: '2015-09-01'
Description:
  en: A simple demo that deploys a RDS instance and a container-base app into ack. The app use RDS instance as a persistence storage.
  zh-cn: 新建一个RDS实例并向ACK中部署容器应用。 容器应用使用RDS实例作为数据库。 
Parameters:
  ZoneId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance:ZoneId
    Description:
      en: Availability zone ID,<br><b>note: <font color='blue'>Before selecting, please confirm that the Availability Zone supports the specification of creating ECS resources</font></b>
      zh-cn: 可用区ID
    Label:
      en: VSwitch Available Zone
      zh-cn: 可用区
  VpcId:
    Type: String
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
  VSwitchId:
    Type: String
    AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      VpcId: ${VpcId}
      ZoneId: ${ZoneId}
  PayType:
    AssociationProperty: ChargeType
    Type: String
    Label:
      en: ECS Instance Charge Type
      zh-cn: 付费类型
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
  PayPeriod:
    Type: Number
    Description:
      en: The subscription period. Unit is months.
      zh-cn: 购买时长,单位(月)
    Label:
      en: The subscription period. Unit is months.
      zh-cn: 购买时长,单位(月)
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      - 12
      - 24
      - 36
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Or:
            - Fn::Equals:
                - ${PayType}
                - PrePaid
            - Fn::Equals:
                - ${PayType}
                - undefined
  RdsInstanceClass:
    Label: MySQL インスタンス仕様
    Type: String
    Description:
      zh-cn: 根据数据库引擎的类型和可用的区域支持选择实例规格
      en: 'Select the instance specification based on the type of database engine and the available area support'
    Default: rds.mysql.s2.large
  RdsInstanceStorage:
    Label: ディスクサイズ
    Type: Number
    Description:
      zh-cn: RDS 实例大小,范围为 20 - 2000,每 5 个增量,单位为 GB
      en: The size range of RDS instances is 20 - 2000, Incrementing in every 5, unit GB
    MinValue: 20
    MaxValue: 2000
    ConstraintDescription: The size range of RDS instances is 20 - 2000, Incrementing in every 5, unit GB
    Default: 30
  RdsAccountName:
    Type: String
    Label:
      zh-cn: ユーザー名
      en: Account Name
    Description:
      zh-cn: MySQL 管理ユーザー名
      en: Account Name
    Default: db_root
  RdsAccountPassword:
    Type: String
    NoEcho: true
    Label:
      zh-cn: ユーザーパスワード
      en: DB アカウントパスワード
    Description:
      zh-cn: |-
        長さは 8 ~ 32 文字です。大文字、小文字、数字、特殊文字の任意の 3 種類で構成されます。サポートされている特殊文字は次のとおりです。
        !@#$&amp;%^*()_+-= 。 
      en: |-
        The length is 8 ~ 32 characters. It is composed of uppercase English letters, lowercase English letters, numbers and special characters. The special characters supported are as follows:
        !@#$& amp;%^* ()_+-=  .
  ClusterId:
    Type: String
    Description:
      en: >-
        The ID of Kubernetes ClusterId in which application deployed.
      zh-cn: >-
        アプリケーションがデプロイされている Kubernetes ClusterId の ID
    AllowedPattern: '[0-9a-z]+$'
    Label:
      en: Kubernetes ClusterId
      zh-cn: K8s クラスター ID
    AssociationProperty: ALIYUN::CS::Cluster::ClusterId
    ConstraintDescription:
      en: >-
        must be lowercase letters or numbers
      zh-cn: 'クラスター ID は小文字または数字で構成する必要があります'
  NameSpace:
    Type: String
    Description:
      en: >-
        The NameSpace in which application deployed.
      zh-cn: >-
        アプリケーションがデプロイされている名前空間
Resources:
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      SecurityGroupIngress:
        - PortRange: '-1/-1'
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: all
          NicType: intranet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet
  DBInstance:
    Type: ALIYUN::RDS::DBInstance
    Properties:
      ZoneId:
        Ref: ZoneId
      VPCId:
        Ref: VpcId
      VSwitchId:
        Ref: VSwitchId
      Engine: MySQL
      EngineVersion: "5.7"
      DBInstanceClass:
        Ref: RdsInstanceClass
      DBInstanceStorage:
        Ref: RdsInstanceStorage
      PayType:
        Ref: PayType
      PeriodType: Month
      Period:
        Ref: PayPeriod
      SecurityIPList: '0.0.0.0/0'
  RdsAccount:
    DependsOn: DBInstance
    Type: ALIYUN::RDS::Account
    Properties:
      DBInstanceId:
        Ref: DBInstance
      AccountType: Super
      AccountName:
        Ref: RdsAccountName
      AccountPassword:
        Ref: RdsAccountPassword
  RdsParameter:
    Type: ALIYUN::RDS::DBInstanceParameterGroup
    Properties:
      DBInstanceId:
        Ref: DBInstance
      Parameters:
        - Key: innodb_large_prefix
          Value: 'ON'
        - Key: innodb_adaptive_flushing_lwm
          Value: '10'
  Database:
    Type: ALIYUN::RDS::Database
    Properties:
      CharacterSetName: UTF8
      DBInstanceId:
        Ref: DBInstance
      DBName: springboot_demo
    DependsOn:
      - DBInstance
  ClusterApplication:
    DependsOn: Database
    Type: ALIYUN::CS::ClusterApplication
    Properties:
      ClusterId:
        Ref: ClusterId
      YamlContent:
        Fn::Sub:
          - |
            apiVersion: v1
            kind: Namespace
            metadata:
              name: ${NameSpace}
            ---
            apiVersion: v1
            data:
              .dockerconfigjson: {{ computenest::acr::dockerconfigjson }}
            kind: Secret
            metadata:
              name: computenestrepo
              namespace: ${NameSpace}
            type: kubernetes.io/dockerconfigjson
            ---
            apiVersion: apps/v1
            kind: Deployment
            metadata:
              labels:
                app: springboot-demo-deployment
              name: springboot-demo-deployment
              namespace: ${NameSpace}
            spec:
              progressDeadlineSeconds: 600
              replicas: 2
              revisionHistoryLimit: 10
              selector:
                matchLabels:
                  app: springboot-demo-pod
              template:
                metadata:
                  labels:
                    app: springboot-demo-pod
                spec:
                  containers:
                    - env:
                        - name: DB_HOST
                          value: ${RdsConnectString}
                        - name: DB_USER
                          value: ${DbUser}
                        - name: DB_PASSWORD
                          value: ${DbPassword}
                      image: {{ computenest::acrimage::springbootdemo }}  # コンテナイメージの指定
                      imagePullPolicy: Always
                      name: springboot-demo-container
                      ports:
                        - containerPort: 8080
                          protocol: TCP
                  imagePullSecrets:
                    - name: computenestrepo  # imagePullSecrets の                  restartPolicy: Always
            ---
            apiVersion: v1
            kind: Service
            metadata:
              labels:
                app: springboot-demo-svc
              name: springboot-demo-svc
              namespace: ${NameSpace}
            spec:
              ports:
                - name: http
                  port: 80
                  protocol: TCP
                  targetPort: 8080
              selector:
                app: springboot-demo-pod
              type: LoadBalancer
          - NameSpace:
              Ref: NameSpace
            DbUser:
              Ref: RdsAccountName
            DbPassword:
              Ref: RdsAccountPassword
            RdsConnectString:
              Fn::GetAtt:
                - DBInstance
                - InnerConnectionString
  AppExternalIp:
    Type: DATASOURCE::CS::ClusterApplicationResources
    Properties:
      Kind: Service
      Name: springboot-demo-svc
      ClusterId:
        Ref: ClusterApplication
      Namespace:
        Ref: NameSpace
      JsonPath: $.status.loadBalancer.ingress
      FirstMatch: true
    DependsOn: ClusterApplication
Outputs:
  ExternalIp:
    Value:
      Ref: AppExternalIp
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VpcId
          - ZoneId
          - VSwitchId
        Label:
          en: Network Configuration
          zh-cn: ネットワーク設定
      - Parameters:
          - ClusterId
          - NameSpace
        Label:
          en: ACK Configuration
          zh-cn: ACK 設定
      - Parameters:
          - RdsInstanceClass
          - RdsInstanceStorage
          - RdsAccountName
          - RdsAccountPassword
        Label:
          en: Database Configuration
          zh-cn: データベース設定
      - Parameters:
          - PayType
          - PayPeriod
        Label:
          en: Payment Configuration
          zh-cn: 支払い設定