Alibaba Cloud Elastic Container Instance(ECI)の概要とベストプラクティス

2025年4月4日掲載

img-alibaba-cloud-linux-migration-blog-20230519-001

ご覧頂き有難うございます。ソフトバンクのKANGです。

Alibaba Cloud Elastic Container Instance (ECI) とは、Alibaba Cloud が提供するサーバーレスコンテナサービスです。ECI を使用すると、仮想マシンや Kubernetes クラスターを管理せずに、コンテナを直接実行できます。

今回はECIサービスの概要と使い方、ECIを活用したベストプラクティスとしてGitHub Actions + Alibaba Cloud Container Registry(ACR)+ ECI を組み合わせたCI/CDパイプラインを構築する方法を紹介します。

目次

1. ECIとは

Elastic Container Instance(ECI)はサーバーレスでコンテナを直接実行できるサービスです。従来のECS(Elastic Compute Service)とは異なり、インフラ管理が不要で、コンテナを迅速にデプロイできるのが特徴です。

pic-01

2. ECIのメリット

ECIを使うと以下のメリットがあります。

  • コスト削減:使用したリソース分だけ課金され、無駄なコストがかかりません。
  • 高速起動:数秒でコンテナが起動し、スケールアウトが容易です。
  • 運用負担の軽減:サーバー管理が不要で、インフラ運用を意識する必要がありません。
  • Kubernetes対応:Alibaba Cloud Kubernetes(ACK)と統合でき、Kubernetesワークロードをそのまま実行できます。

3. ECIの作成方法

ECIはAlibaba Cloud コンソールまたはAlibaba Cloud CLIを利用して作成できます。

3.1 コンソールでのECI作成手順

  1. Alibaba Cloudコンソールにログインします。

  2. 「弾性コンテナインスタンス」を選択します。

  3. 「インスタンスを作成」ボタンをクリックします。

  4. 基本設定を入力

    • 地域(例:東京)

    • 料金タイプ(従量課金)

    • コンテナイメージ(ACRやDocker Hubのパブリックイメージなどを指定)

    • CPU / メモリ(例:2 vCPU、4GBメモリ)

  5. ネットワーク設定

    • VPCとサブネット(vSwitch)を選択

    • セキュリティグループを設定

  6. ストレージ設定

    • NASやAlibaba Cloud Diskを必要に応じてマウント

  7. 高度な設定(必要に応じて)

    • 環境変数、ログ設定、負荷分散(SLB)の設定

  8. 内容を確認し、「作成」をクリックします。

3.2  CLIを使ったECIの作成方法

Alibaba Cloud CLIを使用するとターミナルからECIインスタンスを素早く作成できます。

aliyun eci CreateContainerGroup \
  --RegionId cn-hangzhou \
  --ContainerGroupName my-eci-app \
  --Container.1.Image nginx:latest \
  --Container.1.Name my-nginx \
  --Container.1.Cpu 0.5 \
  --Container.1.Memory 1 \
  --VSwitchId vsw-xxxxxxx \
  --SecurityGroupId sg-xxxxxxx

このコマンドにより、指定のVPC内でnginx:latestのECIインスタンスを作成できます。

4. GitHub Actionsを活用したECIベースのCI/CD

最近のDevOpsパイプラインでは、ビルド、テスト、デプロイメントには通常CI/CDタスクの実行が必要です。ECIは一時的なビルド環境を構築するために使用しながら、コードの自動取得、コンパイル、パッケージング、最終的にはDockerイメージレジストリやKubernetesクラスターにプッシュすることができます。従来のECSや自前のCI/CDサーバーと比較して、ECIは必要に応じて起動でき、サーバーレス化されており、コスト削減にもつながります。

今回はECIを活用したCI/CDのベストプラクティスとして、GitHub Actions + Alibaba Cloud Container Registry(ACR)+ ECI を組み合わせたCI/CDパイプラインを構築する方法を紹介します。

4.1 CI/CDのワークフロー

  • コードの変更をGitHubにプッシュします。

  • GitHub ActionsがECIを起動し、Dockerイメージ(今回はhttpd)をビルドします。

  • ビルド済みのイメージをContainer Registry(ACR)にプッシュします。

  • 上記のDockerイメージをベースにECIをデプロイします。

4.2 Alibaba Cloudのサービスを準備

予めAlibaba Cloudコンソールで以下のサービスを有効化する必要があります。

  • Elastic Container Instance(ECI)

  • Container Registry(ACR)

  • Virtual Private Cloud(VPC)

4.3 コンテナイメージリポジトリの作成

1. Container Registry(ACR)コンソールにログインします。

2. 新しいリポジトリを作成します。

リージョン:アプリケーションのデプロイ先に近いリージョンを選択します。(例:ap-northeast-1)

リポジトリタイプ:プライベートまたはパブリック(推奨:プライベート)。

リポジトリ名:(例:my-app-repo)

アクセス認証情報:ACRのログインURL、ユーザー名、パスワードを記録しておきます。

pic-07

4.4 GitHub Actionsの設定

4.4.1 GitHub Actions Workflowを作成

GitHubリポジトリの.github/workflows/deploy.ymlに以下の内容を追加


# これはGitHub Actionsを使い始めるための基本的なワークフローです。

name: Deploy to Alibaba Cloud ECI

# ワークフローが実行されるタイミングを制御
on:
  # "main"ブランチへのプッシュリクエスト時にワークフローをトリガー
  push:
    branches: [ "main" ]
    
  # Actionsタブから手動でこのワークフローを実行できるようにする

# ワークフローの実行は、1つ以上のジョブで構成され、順次または並行して実行可能
jobs:
  # このワークフローには "build-and-push" というジョブが含まれる
  build-and-push:
    # ジョブが実行されるランナーのOS
    runs-on: ubuntu-latest
    outputs:
      # ビルドしたイメージのタグを後続のジョブに渡す
      IMAGE_TAG: ${{ steps.set-image-tag.outputs.IMAGE_TAG }}
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4  # リポジトリのコードを取得

      - name: Set Image Tag
        id: set-image-tag
        run: |
          # GitのコミットIDと現在時刻を組み合わせてタグを作成
          IMAGE_TAG=$(git rev-parse --short HEAD)-$(date +%Y%m%d%H%M%S)
          echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV  # 環境変数として設定
          echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_OUTPUT  # 後続のジョブで使うための出力として設定

      - name: Log in to Alibaba Cloud Container Registry
        run: |
          echo "${{ secrets.ACR_PASSWORD }}" | docker login \
            --username=${{ secrets.ACR_USERNAME }} \
            --password-stdin ${{ secrets.ACR_REGISTRY }}

      - name: Build and Push Docker Image
        run: |
          IMAGE_NAME=${{ secrets.ACR_REGISTRY }}:${{ env.IMAGE_TAG }}
          docker build -t "$IMAGE_NAME" .
          docker push "$IMAGE_NAME"
          
  deploy-to-eci:
    needs: build-and-push
    runs-on: ubuntu-latest
    env:
      IMAGE_TAG: ${{ needs.build-and-push.outputs.IMAGE_TAG }}  # 先ほどのビルドジョブからイメージタグを取得
    steps:
      - name: Install Alibaba Cloud CLI
        run: |
          curl -L https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz | tar -xz
          sudo mv aliyun /usr/local/bin/

      - name: Configure Alibaba Cloud CLI
        run: |
          aliyun configure set \
            --access-key-id ${{ secrets.ACCESS_KEY_ID }} \
            --access-key-secret ${{ secrets.ACCESS_KEY_SECRET }} \
            --region ap-northeast-1

      - name: Deploy to Alibaba Cloud ECI
        run: |
          # ポート設定(TCPの80番ポート)
          PORTS=$(jq -c -n '[{"Protocol":"TCP","Port":80}]')
    
          aliyun eci CreateContainerGroup \
            --RegionId ap-northeast-1 \
            --ContainerGroupName container-group-mycontainer \
            --Container.1.Image ${{ secrets.ACR_REGISTRY }}:${{ env.IMAGE_TAG }} \
            --Container.1.Name my-app-container \
            --Container.1.Cpu 1 \
            --Container.1.Memory 2 \
            --VSwitchId ${{ secrets.VSWITCH_ID }} \
            --SecurityGroupId ${{ secrets.SECURITY_GROUP_ID }} \
            --Container.1.Port "$PORTS"

4.4.2 GitHub Secrets情報を追加

GitHub リポジトリの [設定] -> [シークレット] で、次のシークレットを追加します:

  • ACR_USERNAME: ACR ログインユーザー名
  • ACR_PASSWORD: ACR ログインパスワード
  • ACR_REGISTRY: registry.<RegionID>.aliyuncs.com/<NameSpace>/<ACRのRepository Name>
  • VSWITCH_ID: ECI に必要な VPCの vSwitch ID
  • SECURITY_GROUP_ID: ECI に必要なセキュリティ グループ ID
  • ACCESS_KEY_ID: AccessKeyID
  • ACCESS_KEY_SECRET: AccessKeySecret

❊AccessKeyID、AccessKeySecretの確認方法は公式ドキュメントDevelopment preparationsを参照してください。

pic-02

4.5 Dockerfileの作成

Github上に以下のDockerfileを作成します。


# ベースイメージとしてHTTPDを使用
FROM httpd:latest

# 作成者情報
LABEL maintainer="xxxxxxxxxx@gmail.com"

# curlコマンドのインストール
RUN apt update && apt install -y curl

# 作業ディレクトリの設定
WORKDIR /app

# HTTP ポート(80)を開放
EXPOSE 80

# アプリケーションファイルをコンテナにコピー
COPY . /app

pic-05

4.6 GitHub Action を実行

pic-06

4.7 リソースが作成されていることを確認

GithubのDockerfileイメージがACR上にPushされていることを確認します。

pic-08

ECIインスタンスが作成されていることを確認します。

pic-03

4.8 ECIに接続して動作確認

Apacheサーバー(httpd)がECI上で正常に動作されていることを確認します。

pic-04

5. まとめ

Elastic Container Instance(ECI)はサーバーレスなコンテナ実行環境を提供し、運用負担を大幅に軽減します。本記事ではGitHub Actions + ACR + ECI (ACK)と組み合わせることで効率的なCI/CDデプロイ環境の実現方法を紹介させていただきました。興味がある方はぜひお試しください。

おすすめの記事

条件に該当するページがございません