数分でアプリがデプロイできるコンテナ環境！IBM Cloud Code Engine


「手元にあるアプリを簡単にデプロイできたらいいのいのに」と思ったことはありませんか？
コンテナアプリを動かしたいが、インフラやKubernetesクラスタの構築・運用などアプリ開発以外に時間が多くかかってしまう。なんてことをよく聞きます。
今回はそんなときに活躍するサーバーレスプラットフォームのCode Engineの特徴や使い方について紹介していきます。

## Code Engineって？

IBM Cloud上で提供しているフルマネージド・ランタイムサービスです。Webアプリやバッチジョブ、ファンクションといった様々なアプリをコンテナ化し、サーバーレスで稼働させることができます。サーバーレスのため、インフラ管理・クラスタ管理をすることなく、使いたい分を使いたいときだけ利用することが可能です。もちろん支払いも使った分だけ（秒単位）での課金です。

**特徴**

- Webアプリ、バッチジョブ、ファンクションが１つのサービスで動かせる！
- アプリコードを自動的に分析し、開発言語を特定。その結果をもとに自動的にコンテナイメージの作成とデプロイが可能なCICDが組み込まれている
- ゼロスケール（アクセスがないときはインスタンスを自動停止）することも可能でアプリが本当の意味で稼働している分だけの課金も可能
- マネージド・サービスとしてKubernetes, Knativeベースのコンテナ実行環境を提供
- サーバーレスのためインフラ管理・クラスタ管理不要、動かしたいときに動かしたい分利用できる
- 無償利用枠があるので、手軽に試せる
- アプリをプライベートネットワーク上で公開可能

## Code Engineを使うために必要な条件は？

1. IBM Cloud 従量課金アカウント (またはサブスクリプション契約)
    
    **従量課金アカウントが必要ですが無償枠を使って試すことができます！**
    
2. （オプション）Container Registry
    
    Code Engineの機能を使ってアプリのビルドを行う場合に、コンテナイメージの保管先が必要です
    
    これも無償枠を使って試すことができます
    
## Code Engineにデプロイする方法は３つから選べる

Code EngineにはCICD機能が組み込まれており、Code Engine上でアプリをビルド＋デプロイするのか、それともビルド済みのコンテナイメージを使ってデプロイするのか使いたい方を選べます

1. 一番簡単！アプリコードだけ用意してビルド＋デプロイする方法
2. 独自のDockerfileベースでビルド＋デプロイする方法
3. すでにあるコンテナイメージをそのままデプロイする方法

## 一番簡単！アプリコードだけ用意してビルド＋デプロイしてみる

今回はパターン１のアプリコードだけ用意してビルド＋デプロイを試してみたいと思います。

Dockerfileの作成やコンテナイメージのビルドは不要です。Code Engine に組み込まれたCICDを利用すると、ソースコードを自動的に分析し、開発言語を特定。その結果をもとに自動的にコンテナイメージの作成とデプロイを行ってくれます。

今回はとてもシンプルなNode.jsのHello Worldアプリを用意したのでこちらを使っていきたいと思います
[https://github.com/kota661/ce-helloworld](https://github.com/kota661/ce-helloworld)

JavaやPHP, Goなど他の言語もサポートしているので、他の言語で試したい方はこちらからサンプルコードが取得できます
[https://cloud.ibm.com/docs/codeengine?topic=codeengine-plan-build#build-buildpack-strat](https://cloud.ibm.com/docs/codeengine?topic=codeengine-plan-build#build-buildpack-strat)


**流れ**

1. Container Image保管用のContainer Registryの名前空間を作成
2. Code Engineのプロジェクトを作成
3. Code Engineにアプリをデプロイ
4. サンプルアプリへのアクセス
5. 最後にお片付け

### 1. Container Image保管用のContainer Registryの名前空間を作成

最初に前準備としてContainer Imageの保管用のレジストリを作成します

[こちらのURL](https://cloud.ibm.com/registry/namespaces)からアクセスいただくか、画面左上のナビゲーションメニューから **「Container Registry」＞ 「名前空間」** を選択して名前空間一覧ページを開きます

**「名前空間」** ページが表示されたら **「作成」** ボタンをクリックして、コンテナレジストリの名前空間を作成します
  ![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/096765a1-9013-a126-4c72-b1275f71576d.png)

**「名前空間の作成」** ページで必要項目を入力し、**「作成」** ボタンをクリックします

- リソース・グループ: Default
- 名前: ユニークな名前

![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/5380b275-5a8e-e858-c796-c32ef4e70493.png)

### 2. Code Engineのプロジェクトを作成

次にCode Engineでプロジェクトを作成していきます

[こちらのURL](https://cloud.ibm.com/codeengine/projects)からアクセスいただくか、画面左上のナビゲーションメニューから **「Code Engine」 ＞ 「プロジェクト」** を選択してプロジェクト一覧を開きます

**「プロジェクト」** ページが表示されたら **「作成」** ボタンをクリックして、プロジェクトを作成します
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/269a10fe-7e7c-f4ec-af8a-ca2801e31d64.png)


**「プロジェクトの作成」** ページで必要項目を入力し、**「作成」** ボタンをクリックします

- ロケーション: 東京(jp-tok)
- 名前: ユニークな名前
- リソース・グループ: Default

![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/dd4445f9-8855-1919-fc83-64cdb4829f59.png)

**「プロジェクト」** ページにて、作成したプロジェクト名が表示されており、**状態** が**アクティブ** となれば完了です
![2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/00d5630c-1b06-0b6e-a7f3-ae5939d4eb7e.png)

### 3. Code Engineにアプリをデプロイ

最後に実際のアプリ作成を行っていきます

**「プロジェクト」** ページから先程作成したプロジェクトをクリックし、プロジェクトの概要ページに移動します

作成直後のプロジェクトのため当然何もアプリがないので、早速 **「アプリケーションの作成」** をクリックします
![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/289c682b-89bb-8929-f481-4272136443b0.png)

「アプリケーションの作成」ページにて必要事項を入力していきます

- 名前：お好きな名前（私はhelloworldと入力しています）
- 実行するコードの選択：ソース・コード
- ソース・コードURL：[https://github.com/kota661/ce-helloworld.git](https://github.com/kota661/ce-helloworld.git)

![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/9b25324a-8e94-2928-2619-3896c503c127.png)

次にブランチ名やビルド方法を設定するために **「ビルド詳細の設定」** をクリックし必要事項を入力していきます

最初は **「ソース」** です。**プライベートリポジトリへのアクセス設定** や、ビルドする **ブランチの指定** 、ソースコードが配置されている **コンテキスト・ディレクトリ** の設定が可能です

今回はパブリックリポジトリで、ブランチ名はmain, コンテキスト・ディレクトリの変更の必要はないため、そのまま **「次へ」** をクリックします
![3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/01164d16-6041-37e3-6852-d87fad3db15b.png)

次は「戦略」です。ここではビルドの方法を設定します

今回はアプリコードだけで自動ビルド（自分でDockerfileを用意しない方法）でのビルドを行うため **「Cloud Native Buildpack」** を選択し、**「次へ」** をクリックします
![3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/39c0af43-e86b-a743-48a8-aa1bfecccd3e.png)

最後に **「出力」** です。ここではビルド後のコンテナイメージの名前や保管場所などを設定します

必要事項を入力し、**完了** をクリックします

- 名前空間：最初のステップで作成したContainer Registryの名前空間名
- リポジトリー（イメージ名）：helloworld

![3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/9977b3eb-6ebc-d106-990c-eb910a2c4521.png)

以上でアプリ作成の設定は完了です！最後に作成ボタンをクリックします

![3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/045c71cd-242f-749d-a921-d2c3d676f93f.png)

作成ボタンをクリック後、すぐにアプリのビルドとデプロイが実行されます。 **「ビルド実行の状況」** が **成功** に、そして **「アプリ」** と、 **「選択されたリビジョン」** のステータスが **準備完了** になればアプリのデプロイが成功しています

![3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/5c64e288-8536-c18f-64ba-b344c4ac4a8c.png)

### 4. サンプルアプリへのアクセス

ステータスが準備完了となったため、早速アプリにアクセスしましょう

**「アプリケーションのテスト」＞「アプリケーションのURL」** の順にクリックしクリックしアプリにアクセスします
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/1839e6ea-936e-02be-819f-af1224b26283.png)

以下のようなHelloworldアプリが表示されればデプロイ成功です！
![4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/36ac129c-fb07-9f97-cc4f-acd1780efa34.png)

あっという間にアプリケーションをデプロイすることができました！今回の方法を使うとDockerfileを作成したりコンテナイメージをビルドしたりする必要はありません。Code Engineが自動的にソースコードを解析し、開発言語を特定、自動的に適切な方法でコンテナイメージを作成＋デプロイします

Code Engineを使うとアプリ開発に注力することができるので、新しいアプリの稼働環境をお探しの場合は一度試してみるのはありだと思います

### 5. 最後にお片付け

今回作成したリソースの削除をしていきます

**Code Engineのプロジェクトの削除**

[こちらのURL](https://cloud.ibm.com/codeengine/projects)からアクセスいただくか、画面左上のナビゲーションメニューから **「Code Engine」＞「プロジェクト」** を選択してプロジェクト一覧を開きます

プロジェクト一覧から今回作成したプロジェクトの削除をクリックします
![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/3ed0f452-e073-afcc-99be-a173559dbaff.png)

**Container Registryの名前空間の削除**

[こちらのURL](https://cloud.ibm.com/registry/namespaces)からアクセスいただくか、画面左上のナビゲーションメニューから **「Container Registry」＞「名前空間」** を選択して名前空間一覧ページを開きます

名前空間の一覧から今回作成した名前空間の削除をクリックします
![5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/37650012-1fcc-f126-79fe-1c4f801a3fdf.png)

## さらなる活用

実アプリをデプロイしていく上で気になりそうなところをまとめてみました

- サンプルコード、チュートリアルがもっとみたい！
    - github(サンプルコード): [https://github.com/IBM/CodeEngine](https://github.com/IBM/CodeEngine)
    - doc(チュートリアル): [https://cloud.ibm.com/docs/solution-tutorials?topic=solution-tutorials-mean-stack](https://cloud.ibm.com/docs/solution-tutorials?topic=solution-tutorials-mean-stack)
- [マネージドデータベースとの連携方法](https://cloud.ibm.com/docs/solution-tutorials?topic=solution-tutorials-mean-stack)
- アプリのログ・モニタリングの収集・分析・確認するには
    - IBM Cloud Log AnalysisとIBM Cloud Monitoringを連携させて利用することができます
    - [ログの表示 | IBM Cloud 資料](https://cloud.ibm.com/docs/codeengine?topic=codeengine-view-logs)
    - [Code Engine のモニタリング | IBM Cloud 資料](https://cloud.ibm.com/docs/codeengine?topic=codeengine-monitor)
- [選択できるメモリとCPUの組み合わせ - Runtime](https://cloud.ibm.com/docs/codeengine?topic=codeengine-mem-cpu-combo)
- [選択できるメモリとCPUの組み合わせ - Build](https://cloud.ibm.com/docs/codeengine?topic=codeengine-plan-build#build-size)
- [アカウントごとの利用上限](https://cloud.ibm.com/docs/codeengine?topic=codeengine-limits)
- カスタムドメインを使ったアプリ公開
    - doc: [https://cloud.ibm.com/docs/codeengine?topic=codeengine-deploy-multiple-regions](https://cloud.ibm.com/docs/codeengine?topic=codeengine-deploy-multiple-regions)
    - blog: [Configuring a Custom Domain for Your IBM Cloud Code Engine Application | IBM](https://www.ibm.com/cloud/blog/configuring-a-custom-domain-for-your-ibm-cloud-code-engine-application)
- [プライベートGitリポジトリとの連携](https://cloud.ibm.com/docs/codeengine?topic=codeengine-code-repositories)
- アプリをプライベートネットワーク上に公開したい
    - qiita: [IBM Cloud：Code EngineのVPE利用方法 - Qiita](https://qiita.com/takason/items/d92119233bff00b26837)
    - doc: [Using Virtual Private Endpoints with Code Engine | IBM Cloud Docs](https://cloud.ibm.com/docs/codeengine?topic=codeengine-vpe)
- Cloud Foundryからの移行に関する質問
    - doc: [Migrating Cloud Foundry applications to Code Engine FAQ | IBM Cloud Docs](https://cloud.ibm.com/docs/codeengine?topic=codeengine-migrate-cf-ce-faq)