検索

18.13. チュートリアル: AWS サービスとの統合

download PDF

OSToy アプリケーションは独立して機能しますが、実際のアプリケーションの多くは、データベース、オブジェクトストア、メッセージングサービスなどの外部サービスを必要とします。

目的

  • OSToy アプリケーションを、他の Amazon Web Services (AWS) サービス、具体的には AWS S3 Storage と統合する方法を説明します。このセクションを完了すると、アプリケーションが AWS S3 Storage からオブジェクトをセキュアに作成して読み取るようになります。
  • Amazon Controller for Kubernetes (ACK) を使用して、Kubernetes からアプリケーションに必要なサービスを直接作成します。
  • アクセスと認証の管理のために、サービスアカウントの Identity and Access Management (IAM) ロールを使用します。
  • OSToy を使用して基本的なテキストファイルを作成し、S3 バケットに保存します。
  • ファイルが正常に追加されたこと、およびバケットからファイルを読み取れることを確認します。

18.13.1. Amazon Controller for Kubernetes (ACK)

ACK を使用して、Kubernetes から直接 AWS サービスを作成して使用します。よく知られた構造を使用して S3 バケットや Relational Database Service (RDS) データベースなどの AWS サービスを宣言的に定義および作成することで、Kubernetes フレームワークにアプリケーションを直接デプロイできます。

ACK を使用すると、S3 バケットを作成し、それを OSToy アプリケーションと統合し、そのバケットにファイルをアップロードして、アプリケーションでファイルを表示できます。

18.13.2. サービスアカウントの IAM ロール

サービスアカウントの IAM ロールを使用すると、Kubernetes サービスアカウントに IAM ロールを直接割り当てることができます。これを使用して、ACK コントローラーの認証情報を付与し、AWS アカウントにサービスをデプロイできます。サービスアカウントの IAM ロール は、一時的な認証情報の管理とローテーションの自動化に使用します。

Pod は、有効な OpenID Connect (OIDC) JSON Web トークン (JWT) を受け取り、それを AWS STS AssumeRoleWithWebIdentity API の操作に渡して、IAM の一時的なロール認証情報を受け取ります。このプロセスは、AWS IAM アクセスを必要とする Pod を変更する EKS Pod アイデンティティー変更 Webhook に依存しています。

サービスアカウントの IAM ロールは、次のベストプラクティスに準拠しています。

  • 最小権限の原則: 制限付きのアクセスだけを許可する AWS ロールの IAM 権限を作成できます。この権限は、ロールに関連付けられたサービスアカウントに制限されており、そのサービスアカウントを使用する Pod からのみアクセスできます。
  • 認証情報の分離: Pod が取得できるのは、Pod が使用しているサービスアカウントに関連付けられた IAM ロールの認証情報だけです。
  • 監査: すべての AWS リソースアクセスを CloudTrail で確認できます。

18.13.3. ACK コントローラーのインストール

バケットの Kubernetes カスタムリソースを使用して S3 サービスでバケットを作成および削除するために、ACK コントローラーをインストールします。コントローラーをインストールすると、必要な namespace とサービスアカウントが作成されます。

簡素化のために、Operator を使用します。Operator をインストールすると、ack-system namespace とサービスアカウント ack-s3-controller が作成されます。

  1. クラスターコンソールにログインします。
  2. 左側のメニューで、Operator をクリックし、OperatorHub をクリックします。
  3. フィルターボックスに "S3" と入力し、AWS Controller for Kubernetes - Amazon S3 を選択します。

    cloud experts deploying integrating ack operator

  4. コミュニティー Operator に関するポップアップが表示された場合は、Continue をクリックします。
  5. Install をクリックします。
  6. "Installation mode" で All namespaces on the cluster を選択します。
  7. "Installed Namespace" で ack-system を選択します。
  8. "Update approval" で Manual を選択します。

    重要

    サービスアカウントへの変更が Operator 自動更新によって上書きされないように、必ず Manual Mode を選択してください。

  9. Install をクリックします。

    設定は以下の画像のようになるはずです。

    cloud experts deployment integrating ack install

  10. Approve をクリックします。
  11. インストールが開始しますが、ACK コントローラー用の IAM ロールとポリシーを作成するまで完了しません。

18.13.4. ACK コントローラー用の IAM ロールとポリシーの作成

  1. 次のいずれかのスクリプトを実行して、ACK コントローラー用の AWS IAM ロールを作成し、S3 ポリシーを割り当てます。

    • setup-s3-ack-controller.sh スクリプトを自動的にダウンロードします。このスクリプトはプロセスを自動化するものです。
    • コマンドラインインターフェイス (CLI) で次のスクリプトを実行します。

      $ curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/setup-s3-ack-controller.sh | bash
  2. スクリプトが完了すると、デプロイメントが再起動し、サービスアカウント環境変数の IAM ロールを使用してサービスコントローラー Pod が更新されます。
  3. 次のコマンドを実行して、環境変数が設定されていることを確認します。

    $ oc describe pod ack-s3-controller -n ack-system | grep "^\s*AWS_"

    出力例

    AWS_ROLE_ARN:                 arn:aws:iam::000000000000:role/ack-s3-controller
    AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token

  4. Web コンソールで OperatorInstalled Operators の順にクリックして、ACK コントローラーが正常にセットアップされたことを確認します。

    cloud experts deployment installing ack oper installed

  5. Operator のインストールと環境変数が正常に表示されない場合は、次のコマンドを実行して手動でデプロイメントを再起動します。

    $ oc rollout restart deployment ack-s3-controller -n ack-system

18.13.5. アプリケーションへのアクセスの設定

OSToy が S3 バケットのオブジェクトを読み書きできるように、AWS IAM ロールとサービスアカウントを作成できます。

  1. 次のコマンドを実行して、OSToy 用の新しい一意のプロジェクトを作成します。

    $ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
  2. 次のコマンドを実行して、namespace とプロジェクトの名前を環境変数に保存します。

    $ export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')

18.13.6. AWS IAM ロールの作成

  1. 次のコマンドを実行して AWS アカウント ID を取得します。

    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
  2. 次のコマンドを実行して OIDC プロバイダーを取得します (<cluster-name> はクラスターの名前に置き換えます)。

    $ export OIDC_PROVIDER=$(rosa describe cluster -c <cluster-name> -o yaml | awk '/oidc_endpoint_url/ {print $2}' | cut -d '/' -f 3,4)
  3. 次のコマンドを実行して、信頼ポリシーファイルを作成します。

    $ cat <<EOF > ./ostoy-sa-trust.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "${OIDC_PROVIDER}:sub": "system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa"
            }
          }
        }
      ]
    }
    EOF
  4. 次のコマンドを実行して、サービスアカウントで使用する AWS IAM ロールを作成します。

    $ aws iam create-role --role-name "ostoy-sa-role" --assume-role-policy-document file://ostoy-sa-trust.json

18.13.7. IAM ロールへの S3 ポリシーの割り当て

  1. 次のコマンドを実行して、S3 フルアクセスポリシー ARN を取得します。

    $ export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)
  2. 次のコマンドを実行して、ポリシーを AWS IAM ロールに割り当てます。

    $ aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"

18.13.8. Pod 用のサービスアカウントの作成

  1. 次のコマンドを実行して、作成した AWS IAM ロールの ARN を取得し、サービスアカウントを作成するときにアノテーションとして追加されるようにします。

    $ export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)
  2. 次のコマンドを実行してサービスアカウントを作成します。

    $ cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ostoy-sa
      namespace: ${OSTOY_NAMESPACE}
      annotations:
        eks.amazonaws.com/role-arn: "$APP_IAM_ROLE_ARN"
    EOF
    重要

    サービスアカウントの名前を "ostoy-sa" から変更しないでください。変更すると、AWS IAM ロールの信頼関係を変更する必要があります。

  3. 次のコマンドを実行して、サービスアカウントに restricted ロールを付与します。

    $ oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa
  4. 次のコマンドを実行して、アノテーションが正常に追加されていることを確認します。

    $ oc describe serviceaccount ostoy-sa -n ${OSTOY_NAMESPACE}

    出力例

    Name:                ostoy-sa
    Namespace:           ostoy
    Labels:              <none>
    Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::000000000000:role/ostoy-sa-role
    Image pull secrets:  ostoy-sa-dockercfg-b2l94
    Mountable secrets:   ostoy-sa-dockercfg-b2l94
    Tokens:              ostoy-sa-token-jlc6d
    Events:              <none>

18.13.9. S3 バケットの作成

  1. 次のコマンドを実行して、マニフェストファイルを使用して S3 バケットを作成します。

    $ cat <<EOF | oc apply -f -
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
      name: ${OSTOY_NAMESPACE}-bucket
      namespace: ${OSTOY_NAMESPACE}
    spec:
      name: ${OSTOY_NAMESPACE}-bucket
    EOF
    重要

    OSToy アプリケーションは、<namespace>-bucket という名前のバケットが検出されることを想定しています。OSToy プロジェクトの namespace 以外を使用すると、この機能が動作しません。たとえば、プロジェクトが "ostoy" の場合、name の値を ostoy-bucket にする必要があります。

  2. 次のコマンドを実行して、バケットが作成されたことを確認します。

    $ aws s3 ls | grep ${OSTOY_NAMESPACE}-bucket

18.13.10. 新しいサービスアカウントを使用した OSToy アプリケーションの再デプロイ

  1. 作成したサービスアカウントを使用して Pod を実行します。
  2. 次のコマンドを実行してマイクロサービスをデプロイします。

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
  3. 次のコマンドを実行して ostoy-frontend をデプロイします。

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
  4. 次のコマンドを実行して、ostoy-frontend デプロイメントにパッチを適用します。

    $ oc patch deploy ostoy-frontend -n ${OSTOY_NAMESPACE} --type=merge --patch '{"spec": {"template": {"spec":{"serviceAccount":"ostoy-sa"}}}}'

    出力例

    spec:
      # Uncomment to use with ACK portion of the workshop
      # If you chose a different service account name please replace it.
      serviceAccount: ostoy-sa
      containers:
      - name: ostoy-frontend
        image: quay.io/ostoylab/ostoy-frontend:1.6.0
        imagePullPolicy: IfNotPresent
    [...]

  5. Pod が更新されるまで待ちます。

18.13.11. 環境変数の確認

  • 次のコマンドを使用して Pod を describe し、アプリケーションに AWS_WEB_IDENTITY_TOKEN_FILE および AWS_ROLE_ARN 環境変数が存在することを確認します。

    $ oc describe pod ostoy-frontend -n ${OSTOY_NAMESPACE} | grep "^\s*AWS_"

    出力例

    AWS_ROLE_ARN:                 arn:aws:iam::000000000000:role/ostoy-sa
    AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token

18.13.12. OSToy を使用したバケットの内容の表示

アプリケーションを使用して S3 バケットの内容を表示します。

  1. 次のコマンドを実行して、新しくデプロイされたアプリケーションのルートを取得します。

    $ oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'
  2. 新しいブラウザータブを開き、前のステップで取得したルートを入力します。

    重要

    https:// ではなく http:// を必ず使用してください。

  3. OSToy の左側のメニューで ACK S3 をクリックします。
  4. 新しいバケットであるため、バケットは空であるはずです。

    cloud expert deploying integrating ack views3contents

18.13.13. S3 バケットへのファイル作成

OStoy を使用してファイルを作成し、S3 バケットにアップロードします。S3 はあらゆる種類のファイルを受け入れることができますが、このチュートリアルでは、コンテンツをブラウザーで簡単にレンダリングできるようにテキストファイルを使用します。

  1. OSToy の左側のメニューで ACK S3 をクリックします。
  2. 下にスクロールして、Upload a text file to S3 に移動します。
  3. ファイルのファイル名を入力します。
  4. ファイルの内容を入力します。
  5. Create file をクリックします。

    cloud expert deploying integrating ack creates3obj

  6. 上部にある既存ファイルのセクションまでスクロールし、作成したファイルがそこにあることを確認します。
  7. ファイル名をクリックしてファイルを表示します。

    cloud experts deploying integrating ack viewobj

  8. AWS CLI で次のコマンドを実行して、バケットの内容をリスト表示して確認します。

    $ aws s3 ls s3://${OSTOY_NAMESPACE}-bucket

    出力例

    $ aws s3 ls s3://ostoy-bucket
    2023-05-04 22:20:51         51 OSToy.txt

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.