IBM Cloud Code Engineでアプリケーションを動かす

2023年12月11日掲載

nested-virtualization

この記事はソフトバンクアドベントカレンダー2023の11日目の記事です。

IBM Cloud Code Engineは、IBM Cloudで稼働する、フルマネージドのコンテナ実行環境サービスです。開発者はバックエンドのインフラストラクチャの管理や設定について心配することなく、ソースコードの作成に集中できます。

本記事では、Code Engineの基本的な使い方を実際のWebアプリケーションを作るステップに合わせて解説していきます。

目次

要件

Code Engineで稼働させるアプリケーションは、Webアプリケーションとし、その要件を決めましょう。

(要件)

  • WebサーバとApplicationサーバの2段構成
  • WebサーバとしてNginxを配置
  • Nginxはhtpasswdファイルを利用した、簡易的な認証を実施
  • Nginxの後段に、プロキシ先として、インターネット公開されないプライベートなApplicationサーバを配置
  • Applicationサーバは静的なHello World文字列を返却

後段のApplicationサーバはインターネット非公開であるところがポイントです。

IBMのGitHubのレポジトリに、目的に合致しているサンプルがありました。こちらを利用させてもらいましょう。authというフォルダ内のアプリケーションです。他にも用途に合わせたサンプルが多数あるのでのぞいてみて下さい。
https://github.com/IBM/CodeEngine

設定ファイルとサンプルコード解説

ファイル構成を実際に目にした方が早く理解できると思います。

まずは利用するファイルリストです。

Webレイヤーのファイル群

  • Dockerfile.nginx
  • nginx.conf 
  • call-nginx
  • htpasswd 

Applicationレイヤーのファイル群

  • Dockerfile.app
  • app.go

この中から、仕組みを理解する上で必要なDockerfileとWebの設定ファイル、また、名称から想像しにくいファイルに絞って見ていきましょう。

Dockerやプログラムの詳細な解説が目的ではないため、最低限の説明にとどめています。

Dockerfile.nginx
FROM icr.io/codeengine/nginx

# call-ngninx is just a script that'll replace "NS" in the config file with
# the proper project ID
COPY call-nginx /

# htpasswd contains the user/password info - for auth
COPY htpasswd /etc/apache2/.htpasswd

# Use our custom nginx config file
COPY nginx.conf /etc/nginx/conf.d/default.conf

# At runtime, call the wrapper script to do the "NS" substitutions
CMD ["/call-nginx"]

nginx.conf
-snip-
    listen 8080 ;
    server_name *.codeengine.appdomain.cloud ;
-snip-
        proxy_pass http://auth-app.NS.svc.cluster.local ;
-snip-

 

次の、call-nginxというスクリプトの目的が分かりにくいでしょうか。現時点では、Nginxのプロキシ先はまだ未定です。Applicationサーバをデプロイ後、Code Engineがサブドメインを払い出すため、それを確認して、Nginxのプロキシ先として暫定値を本設定値に書き換えるための簡易スクリプトです。そこだけ注意して見てください。

call-nginx
#!/bin/bash

set -ex

# Replace all "NS" in the config file with the Code Engine subdomain (k8s ns)
sed -i "s/NS/$CE_SUBDOMAIN/g" /etc/nginx/conf.d/default.conf

# Now run nginx
nginx-debug -g "daemon off;"

Dockerfile.app
FROM icr.io/codeengine/golang:alpine
COPY app.go /
RUN go build -o /app /app.go

# Copy the exe into a smaller base image
FROM icr.io/codeengine/alpine
COPY --from=0 /app /app
CMD /app

app.go
-snip-
Hello World
-snip-

Dockerイメージの構築とレジストリへの登録

まだCode Engine固有の話ではありません。コンテナ一般の操作の解説が中心となります。

ただし、Dockerイメージの管理はIBM Cloudのプライベートコンテナレジストリを使いましょう。

IBM CloudをCLIで操作するため、コマンドによるIBM Cloudへのログインは済ませておきます。

$ ibmcloud login

IBM Cloud内のリソースグループの指定もしておきます。

$ ibmcloud target -g [リソースグループ名]

最後にIBM Cloud Container Registryへもログインします。crオプションは、container registryの略です。crオプションが使えるように必要なプラグインもインストールしておきます。

$ ibmcloud plugin install container-registry
$ ibmcloud cr login

IBMの日本リージョンのコンテナレジストリはjp.icr.ioドメインにあります。IBM Cloud上で立ち上げたコンテナレジストリサービス名として、ここではmy-container-registoryを作成済みとし、手順内で使っていきます。

$ docker build -t auth-app -f Dockerfile.app .
$ docker tag auth-app jp.icr.io/my-container-registory/auth-app
$ docker push jp.icr.io/my-container-registory/auth-app


$ docker build -t auth-nginx -f Dockerfile.nginx .
$ docker tag auth-nginx jp.icr.io/my-container-registory/auth-nginx
$ docker push jp.icr.io/my-container-registory/auth-nginx

Code Engineでのコンテナ稼働

ここまでは、コンテナのレポジトリがIBM Cloudであった点を除けば、コンテナ一般の手順でした。
ここからがいよいよCode Engine固有の操作になります

ceオプションが使えるように必要なプラグインをインストールしておきます。ceオプションは、code engineの略です。

$ ibmcloud plugin install code-engine

次に、プロジェクト名を決めます。プロジェクトとは、Code Engine内のアプリケーションやジョブを管理する論理単位です。そのプロジェクト名を、以後の操作で作成し、指定します。

$ project_name='myProject'
$ ibmcloud ce project create --name ${project_name}
$ ibmcloud ce project select -n ${project_name}

 

次の手順が少し分かりにくいため少し説明を加えます。先ほどpushしたコンテナレポジトリからイメージを取得し、Code Engine内で起動させるには、その認証情報である、アクセスシークレットキーが必要になります。

Code EngineのGUIからの操作でも作成できます。今回はコマンドで操作するため、先にIAM経由でCode Engine用のAPIキーを発行し、そのAPIキーを使いアクセスシークレットキーを作ります。

$ ibmcloud iam api-key-create myApiKey -d "code engine"
$ apikey='xxx'
$ registrysecret='myregistrysecret'
$ ibmcloud ce registry create --name ${registrysecret} --server jp.icr.io --password ${apikey}

Code Engineが、アクセスシークレットキーによりコンテナレポジトリとつながります。あとはレポジトリから取得したイメージを起動をさせれば終わります。

# Applicationサーバ
$ image='jp.icr.io/my-container-registory/auth-app'
$ ibmcloud ce app create --name auth-app --image ${image} --registry-secret ${registrysecret} --cluster-local

$ NS=`ibmcloud ce app get -n auth-app -o url | cut -d '.' -f 2`
1234abcd
# 例)http://auth-app.1234abcd.svc.cluster.local

–cluster-localオプションを付与していることに注目してください。このオプションを使うと、インターネットへは公開されない、Code Engineプロジェクト内だけで疎通ができるURLが発行されます。
発行されたURLを取得します。Nginxへのプロキシ先に指定するためです。1234abcdの部分がアプリケーションごとに変わってきます。

続いてWebサーバを稼働させます。

# Webサーバ
$ image='jp.icr.io/my-container-registory/auth-nginx'

$ ibmcloud ce app create --name auth-proxy --image ${image} --registry-secret ${registrysecret} --env NS=${NS}

$ ibmcloud ce application get -n auth-proxy
https://auth-proxy.1234abcd.jp-tok.codeengine.appdomain.cloud

上記のURLへアクセスしてください。
Nginxが簡易認証ダイアログを表示し、htpassword内のユーザ名とパスワードを通すと、後段のAppサーバがHello Worldを返してくれるはずです。

以上となります。

 

その他利用頻度が高そうな操作コマンドを紹介しておきます。

ログの見方
アプリケーション・インスタンスのシステムイベントを取得

$ ibmcloud ce application events -n auth-proxy
$ ibmcloud ce application events -n auth-app

アプリケーション・インスタンスのログを取得

$ ibmcloud ce application logs -f -n auth-proxy
$ ibmcloud ce application logs -f -n auth-app

アプリケーションの削除

$ ibmcloud ce app delete -n auth-app -f
$ ibmcloud ce app delete -n auth-proxy -f

まとめ

Code Engineが、アプリケーション開発における煩雑なタスクを解放し、生産性を向上させてくれる便利なサービスであることをイメージいただけたかと思います。ぜひ、Code Engineをアプリケーションの稼働環境として気軽に試してみて下さい。手間のかかるインフラ構築に時間を費やすことなく、アイデアを形にする作業に集中できます。積極的な採用によって、開発チーム全体の生産性向上とスムーズなアプリケーション展開を実現しましょう。

Code Engineにはまだまだ紹介しきれていない多くの機能があります。たとえば、コンテナイメージの自動ビルドやデプロイ、負荷にあわせたスケーリング設定、監視・ログ管理など、アプリケーションを効果的に管理するための多彩な機能が揃っています。ぜひそれらもお試しください。

それでは12日にバトンを渡します

関連サービス

IBM Cloud

IBM Cloudは、IBMが提供するビジネスのためのクラウドサービスです。AIプラットフォームのIBM Watsonをはじめとする幅広い製品・サービスを提供。ビジネス活用だけでなく、既存システムからのセキュアなクラウド移行や、クラウドネィティブ・アプリケーションの開発の両方に対応できるクラウドサービスです。

IBM Cloud Watson

IBM Watsonの導入は、ソフトバンクにご相談ください。お客さまと共に課題を明確にしIBM Watsonの最適な活用方法をご提案します。

おすすめの記事

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