18.13. チュートリアル: AWS サービスとの統合
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
が作成されます。
- クラスターコンソールにログインします。
- 左側のメニューで、Operator をクリックし、OperatorHub をクリックします。
フィルターボックスに "S3" と入力し、AWS Controller for Kubernetes - Amazon S3 を選択します。
- コミュニティー Operator に関するポップアップが表示された場合は、Continue をクリックします。
- Install をクリックします。
- "Installation mode" で All namespaces on the cluster を選択します。
- "Installed Namespace" で ack-system を選択します。
"Update approval" で Manual を選択します。
重要サービスアカウントへの変更が Operator 自動更新によって上書きされないように、必ず Manual Mode を選択してください。
Install をクリックします。
設定は以下の画像のようになるはずです。
- Approve をクリックします。
- インストールが開始しますが、ACK コントローラー用の IAM ロールとポリシーを作成するまで完了しません。
18.13.4. ACK コントローラー用の IAM ロールとポリシーの作成
次のいずれかのスクリプトを実行して、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
- スクリプトが完了すると、デプロイメントが再起動し、サービスアカウント環境変数の IAM ロールを使用してサービスコントローラー Pod が更新されます。
次のコマンドを実行して、環境変数が設定されていることを確認します。
$ 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
Web コンソールで Operator、Installed Operators の順にクリックして、ACK コントローラーが正常にセットアップされたことを確認します。
Operator のインストールと環境変数が正常に表示されない場合は、次のコマンドを実行して手動でデプロイメントを再起動します。
$ oc rollout restart deployment ack-s3-controller -n ack-system
18.13.5. アプリケーションへのアクセスの設定
OSToy が S3 バケットのオブジェクトを読み書きできるように、AWS IAM ロールとサービスアカウントを作成できます。
次のコマンドを実行して、OSToy 用の新しい一意のプロジェクトを作成します。
$ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
次のコマンドを実行して、namespace とプロジェクトの名前を環境変数に保存します。
$ export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')
18.13.6. AWS IAM ロールの作成
次のコマンドを実行して AWS アカウント ID を取得します。
$ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
次のコマンドを実行して 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)
次のコマンドを実行して、信頼ポリシーファイルを作成します。
$ 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
次のコマンドを実行して、サービスアカウントで使用する 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 ポリシーの割り当て
次のコマンドを実行して、S3 フルアクセスポリシー ARN を取得します。
$ export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)
次のコマンドを実行して、ポリシーを AWS IAM ロールに割り当てます。
$ aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"
18.13.8. Pod 用のサービスアカウントの作成
次のコマンドを実行して、作成した AWS IAM ロールの ARN を取得し、サービスアカウントを作成するときにアノテーションとして追加されるようにします。
$ export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)
次のコマンドを実行してサービスアカウントを作成します。
$ 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 ロールの信頼関係を変更する必要があります。
次のコマンドを実行して、サービスアカウントに
restricted
ロールを付与します。$ oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa
次のコマンドを実行して、アノテーションが正常に追加されていることを確認します。
$ 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 バケットの作成
次のコマンドを実行して、マニフェストファイルを使用して 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
にする必要があります。次のコマンドを実行して、バケットが作成されたことを確認します。
$ aws s3 ls | grep ${OSTOY_NAMESPACE}-bucket
18.13.10. 新しいサービスアカウントを使用した OSToy アプリケーションの再デプロイ
- 作成したサービスアカウントを使用して Pod を実行します。
次のコマンドを実行してマイクロサービスをデプロイします。
$ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
次のコマンドを実行して
ostoy-frontend
をデプロイします。$ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
次のコマンドを実行して、
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 [...]
- 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 バケットの内容を表示します。
次のコマンドを実行して、新しくデプロイされたアプリケーションのルートを取得します。
$ oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'
新しいブラウザータブを開き、前のステップで取得したルートを入力します。
重要https://
ではなくhttp://
を必ず使用してください。- OSToy の左側のメニューで ACK S3 をクリックします。
新しいバケットであるため、バケットは空であるはずです。
18.13.13. S3 バケットへのファイル作成
OStoy を使用してファイルを作成し、S3 バケットにアップロードします。S3 はあらゆる種類のファイルを受け入れることができますが、このチュートリアルでは、コンテンツをブラウザーで簡単にレンダリングできるようにテキストファイルを使用します。
- OSToy の左側のメニューで ACK S3 をクリックします。
- 下にスクロールして、Upload a text file to S3 に移動します。
- ファイルのファイル名を入力します。
- ファイルの内容を入力します。
Create file をクリックします。
- 上部にある既存ファイルのセクションまでスクロールし、作成したファイルがそこにあることを確認します。
ファイル名をクリックしてファイルを表示します。
AWS CLI で次のコマンドを実行して、バケットの内容をリスト表示して確認します。
$ aws s3 ls s3://${OSTOY_NAMESPACE}-bucket
出力例
$ aws s3 ls s3://ostoy-bucket 2023-05-04 22:20:51 51 OSToy.txt