フォーム読み込み中
ご覧頂き有難うございます。ソフトバンクのKANGです。
Alibaba Cloud Elastic Container Instance (ECI) とは、Alibaba Cloud が提供するサーバーレスコンテナサービスです。ECI を使用すると、仮想マシンや Kubernetes クラスターを管理せずに、コンテナを直接実行できます。
今回はECIサービスの概要と使い方、ECIを活用したベストプラクティスとしてGitHub Actions + Alibaba Cloud Container Registry(ACR)+ ECI を組み合わせたCI/CDパイプラインを構築する方法を紹介します。
Elastic Container Instance(ECI)はサーバーレスでコンテナを直接実行できるサービスです。従来のECS(Elastic Compute Service)とは異なり、インフラ管理が不要で、コンテナを迅速にデプロイできるのが特徴です。
ECIを使うと以下のメリットがあります。
ECIはAlibaba Cloud コンソールまたはAlibaba Cloud CLIを利用して作成できます。
Alibaba Cloudコンソールにログインします。
「弾性コンテナインスタンス」を選択します。
「インスタンスを作成」ボタンをクリックします。
基本設定を入力
地域(例:東京)
料金タイプ(従量課金)
コンテナイメージ(ACRやDocker Hubのパブリックイメージなどを指定)
CPU / メモリ(例:2 vCPU、4GBメモリ)
ネットワーク設定
VPCとサブネット(vSwitch)を選択
セキュリティグループを設定
ストレージ設定
NASやAlibaba Cloud Diskを必要に応じてマウント
高度な設定(必要に応じて)
環境変数、ログ設定、負荷分散(SLB)の設定
内容を確認し、「作成」をクリックします。
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インスタンスを作成できます。
最近のDevOpsパイプラインでは、ビルド、テスト、デプロイメントには通常CI/CDタスクの実行が必要です。ECIは一時的なビルド環境を構築するために使用しながら、コードの自動取得、コンパイル、パッケージング、最終的にはDockerイメージレジストリやKubernetesクラスターにプッシュすることができます。従来のECSや自前のCI/CDサーバーと比較して、ECIは必要に応じて起動でき、サーバーレス化されており、コスト削減にもつながります。
今回はECIを活用したCI/CDのベストプラクティスとして、GitHub Actions + Alibaba Cloud Container Registry(ACR)+ ECI を組み合わせたCI/CDパイプラインを構築する方法を紹介します。
コードの変更をGitHubにプッシュします。
GitHub ActionsがECIを起動し、Dockerイメージ(今回はhttpd)をビルドします。
ビルド済みのイメージをContainer Registry(ACR)にプッシュします。
上記のDockerイメージをベースにECIをデプロイします。
予めAlibaba Cloudコンソールで以下のサービスを有効化する必要があります。
Elastic Container Instance(ECI)
Container Registry(ACR)
Virtual Private Cloud(VPC)
1. Container Registry(ACR)コンソールにログインします。
2. 新しいリポジトリを作成します。
・リージョン:アプリケーションのデプロイ先に近いリージョンを選択します。(例:ap-northeast-1)
・リポジトリタイプ:プライベートまたはパブリック(推奨:プライベート)。
・リポジトリ名:(例:my-app-repo)
・アクセス認証情報:ACRのログインURL、ユーザー名、パスワードを記録しておきます。
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"
GitHub リポジトリの [設定] -> [シークレット] で、次のシークレットを追加します:
❊AccessKeyID、AccessKeySecretの確認方法は公式ドキュメントDevelopment preparationsを参照してください。
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
GithubのDockerfileイメージがACR上にPushされていることを確認します。
ECIインスタンスが作成されていることを確認します。
Apacheサーバー(httpd)がECI上で正常に動作されていることを確認します。
Elastic Container Instance(ECI)はサーバーレスなコンテナ実行環境を提供し、運用負担を大幅に軽減します。本記事ではGitHub Actions + ACR + ECI (ACK)と組み合わせることで効率的なCI/CDデプロイ環境の実現方法を紹介させていただきました。興味がある方はぜひお試しください。
条件に該当するページがございません