OKEへのサインイン・アプリケーションのデプロイ

GitHubからコードをダウンロードし、コードをカスタマイズしてデプロイします。

サンプル・コードはGitHubにあります。

  1. GitHubに移動します。
  2. リポジトリをクローニングまたはダウンロードします。
  3. READMEドキュメントの手順に従います。

次のステップに従って、アプリケーションをOKEにデプロイします:

  1. GitHubリポジトリをフォークしてクローニングします。
  2. Dockerfileを作成し、イメージを作成します。
  3. DockerイメージをOCIレジストリにプッシュします。
  4. 環境変数を設定します。
  5. アプリケーションをアイデンティティ・ドメインに登録します。
  6. OKEクラスタにDockerイメージをデプロイします。
  7. 作業サンプル・アプリケーションでカスタム・サインイン・エクスペリエンスをテストします。

GitHubリポジトリのフォークおよびクローニング

GitHubリポジトリをフォークして、開発マシンにリポジトリのコピーを作成します。

次に、次のコマンドを使用して、開発マシンでフォークされたリポジトリをクローニングします。

git clone https://github.com:USERNAME/YOUR-FORKED-REPO

Dockerfileの作成

クローニングされたリポジトリに新しいファイル名Dockerfileを作成します。

カスタム・サインイン・アプリケーションは、Node JSアプリケーションです。Dockerfileは、Node JSアプリケーションと似ています。
次のサンプルDockerfileを開始点として使用します。
FROM node:alpine

# Create app directory WORKDIR /usr/src/app # Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm install --only=production
# Bundle app source
COPY . .

EXPOSE 3000# "npm start" is how this would normally be startedCMD [ "npm", "start" ]
alpineのかわりに、組織で許可されているLinuxディストリビューションを使用できます。

Dockerイメージの構築

次のコマンドを使用して、DockerfileからDockerイメージを構築し、イメージ名を指定します。

docker build -t $IMAGE_NAME $PATH_TO_DOCKERFILE

次のコマンドを使用して、イメージをリストし、Dockerイメージを確認します。

docker images

DockerイメージをOCIレジストリにプッシュ

DockerイメージをOCIレジストリにプッシュするには、次のステップに従います:

  1. OCIコンソールにログインします。
  2. 「プロファイル」メニューを開き、「ユーザー設定」をクリックして詳細を表示します。
  3. 「認証トークン」ページで、「トークンの生成」をクリックして新しいトークンを作成します。

    注意:

    認証トークンをコピーして安全な場所に保存し、後で取得します。後でコンソールに認証トークンを表示することはできません。
  4. 「トークンの生成」ダイアログを開きます。
  5. コマンドdocker login <region-key>.ocir.ioを実行して、OCIレジストリ(OCIR)にサインインします。たとえば、アッシュバーン・リージョンの場合は、docker login iad.ocir.ioを実行します。

    ユーザーがデフォルト・ドメイン<tenancy-namespace>/<username>にある場合は、認証トークンを含むユーザー名をこの形式で入力します。

    デフォルト以外のIAMドメイン・ユーザーには、<tenancy-namespace>/<domain_name>/<username>の形式を使用します。

    パスワードの入力を求められたら、ユーザーのOracle Cloud Infrastructure認証トークンを入力します。

  6. 前のステップで作成したdockerイメージをOCIRにタグ付けしてプッシュします。

    OCIコンテナ・レジストリに新しいリポジトリを作成するか、既存のリポジトリを使用できます。タグの形式は<region-key>.ocir.io/<tenancy-namespace>/<repo-name>:<version>である必要があります。

    docker tag idcslogin:latest iad.ocir.io/mytenancy/myrepo/idcslogin:latest docker push iad.ocir.io/mytenancy/myrepo/idcslogin:latest

    Kubernetesマニフェスト・ファイルは、ポッドのデプロイ時にこのイメージを使用します。

  7. または、次の詳細な手順に従って、DockerイメージをOCIレジストリにプッシュすることもできます。
DockerイメージがOCIレジストリにプルされ、デプロイメントの準備ができています。

環境変数の設定

  • 必須: IDCS_CLIENT_IDIDCS_CLIENT_IDおよびIDCS_SECRET
  • オプション: 自己登録プロファイルをサインイン・アプリケーションに渡す場合はIDCS_SELFREGPROFILESNodeJSでデバッグ・ロギングを有効にする場合はDEBUG_LOGIN=true
  • 本番: NODE_ENV= 本番変数

Kubernetesシークレットを使用してこれらの値を格納し、マニフェスト・ファイルに渡します。

アプリケーションを登録

カスタム・サインイン・アプリケーションがOracle Identity Cloud Service認証REST APIをコールしてユーザーがサインインできるように、クライアント資格証明アプリケーションをIDCSまたはアイデンティティ・ドメインに登録します。

  1. Oracle Identity Cloud Serviceコンソールで、ナビゲーション・ドロワーを開き、「アプリケーション」をクリックします。
  2. アプリケーション・ページで、「追加」をクリックします。
  3. 「アプリケーションの追加」ダイアログで、「信頼できるアプリケーション」または「機密アプリケーション」をクリックします。
  4. 「詳細」ペインで、次の値を入力します。
    • 名前: 自分のサインイン・アプリケーション
    • 説明: 自分のサインイン・アプリケーション
  5. 「次へ」をクリックしてください。
  6. 「Client」ペインで、「Configure this application as a client now」を選択し、「Allowed Grant Types」として「Client Credentials」を選択します。
  7. 「クライアント」ペインで、「Identity Cloud Service管理APIへのクライアント・アクセス権を付与する」の後、下にスクロールして「追加」をクリックします。
  8. 「アプリケーション・ロールの追加」ダイアログで、リストで「サインイン」「電子メールの検証」「パスワードのリセット」「パスワードを忘れた場合」および「自己登録」を選択し、「追加」をクリックします。
  9. 「クライアント」ペインおよび次のペインで、最後のペインになるまで「次」をクリックします。
  10. 「終了」をクリックします。
  11. 「アプリケーションが追加されました」ダイアログで、「クライアントID」および「クライアント・シークレット」の値をメモし、「閉じる」をクリックします。
  12. アプリケーションをアクティブ化するには、「アクティブ化」をクリックします。
  13. 「アプリケーションをアクティブ化しますか」ダイアログで、「アプリケーションのアクティブ化」をクリックします。
    成功メッセージが表示されます。

OKEクラスタの作成

  1. 手順に従って、OKEクラスタを作成します(まだ作成していない場合)。
  2. kubectlを使用して新しいクラスタにアクセスできることを確認します。「クイック・スタート」セクションのステップに従って、クラスタにアクセスします。

OKEクラスタへのアプリケーションのデプロイ

Kubernetesデプロイメント・マニフェスト・ファイルを作成し、アプリケーションをOKEにデプロイするには、次のステップに従います:

  1. Kubernetes Secretを作成して、すべての構成パラメータをOKEクラスタで使用できるようにします。
    1. OCI IAM構成パラメータを設定します。
      $ kubectl create secret generic idcs_config --from-literal=url=https://<domain instanceid>.identity.oraclecloud.com --from-literal=client-id=<client_id_of_sign_in_app> --from-literal=client-secret=<client_secret_of_sign_in_app>
    2. OCIレジストリ・トークンを作成します。
      $ kubectl create secret generic idcs_config --from-literal=url=https://<domain instanceid>.identity.oraclecloud.com --from-literal=client-id=<client_id_of_sign_in_app> --from-literal=client-secret=<client_secret_of_sign_in_app>
    3. ロード・バランサを使用してカスタム・アプリケーションにアクセスするためのHTTPSエンドポイントを設定するには、ロード・バランサ・サービスのSSLキーおよび証明書が必要です。ロード・バランサの新しいキー・ペアを作成します。
    4. Kubernetesシークレットを作成して、OKEクラスタで使用できるようにします。
      $ kubectl create secret tls ssl-certificate-secret --key your.key --cert your.crt

      ノート:

      Oracleでは、開発用またはクイック・テスト用でないかぎり、SSLポートを使用してロード・バランサ・サービスを設定することをお薦めします。
  2. Kubernetesデプロイメント・マニフェスト・ファイルを作成します。

    このファイルには、カスタム・アプリケーションのポッド仕様とロード・バランサのサービス仕様が含まれています。

    OCIRトークンやOCI IAM構成などの構成パラメータは環境変数として渡され、前述のステップで作成したKubernetesシークレットから値が取得されます。

    アプリケーションのDockerコンテナ・イメージ・パスは、イメージへのOCIRパスである必要があります。

    次に、customlogin.yamlという名前のYAMLファイルのサンプルを示します。
    apiVersion: v1
    kind: Pod
    metadata:
      name: login-app
      labels:
        app: customlogin
    spec:
      containers:
        - name: idcslogin
          image: iad.ocir.io/<tenancy namespace>/idcslogin:latest
          imagePullPolicy: Always
          ports:
          - name: httpport
            containerPort: 3000
            protocol: TCP
          env:
          - name: IDCS_URL
            valueFrom:
              secretKeyRef:
                name: idcs-config
                key: url
          - name: IDCS_CLIENT_ID
            valueFrom:
              secretKeyRef:
                name: idcs-config
                key: client-id
          - name: IDCS_CLIENT_SECRET
            valueFrom:
              secretKeyRef:
                name: idcs-config
                key: client-secret
    
      imagePullSecrets:
        - name: ocirsecret
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name:
     loginlb
      annotations:
        service.beta.kubernetes.io/oci-load-balancer-ssl-ports: "443"
        service.beta.kubernetes.io/oci-load-balancer-tls-secret: ssl-certificate-secret
      labels:
        app: loginlb
    spec:
      selector:
        app: customlogin
      type: LoadBalancer
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 3000
      - name: https
        port: 443
        protocol: TCP
        targetPort: 3000

    ノート:

    現在のテナンシのテナント・ネームスペースを確認するには、「プロファイル」メニューを開き、「テナンシ」をクリックします。テナンシ・ネームスペースが「オブジェクト・ストレージ・ネームスペース」フィールドに表示されます。
  3. カスタム・アプリケーション・ポッドおよびロード・バランサ・サービスをOKEクラスタにデプロイします。
    $ kubectl apply -f ./customlogin.yaml
    $ kubectl get all
    名前 準備完了 ステータス 再起動 Age
    pod/login-app 1/1 Running 0 12d
    名前 タイプ クラスタ-IP 外部IP ポート Age
    service/kubernetes ClusterIP 10.96.0.1 None 443/TCP 109d
    service/loginlb LoadBalancer 10.96.45.133 10.1.1.1 80:31420/TCP, 443:30563/TCP 12d

カスタム・サインイン・エクスペリエンスのテスト

テスト用に準備した作業サンプル・アプリケーションを使用してサインイン・エクスペリエンスをテストするには、次のステップを実行します。

  1. 新しくデプロイされたカスタム・アプリケーションのロード・バランサURLを使用するようにサンプル・アプリケーションを更新します。
  2. サンプル・アプリケーションで、「カスタム・ログインURL」フィールドにロード・バランサのURLを入力します。このURLは、ロード・バランサのパブリックIPアドレスまたはDNSエントリに基づくFQDNのいずれかです。
  3. ブラウザでサンプル・アプリケーションURLにアクセスします。

    カスタム・サインイン・アプリケーション・ページに移動します。