Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
---
title: "kroによるリソースの作成"
sidebar_position: 5
tmdTranslationSourceHash: b9394e7175a82507b6f33e051b9ffbe3
tmdTranslationSourceHash: 352f766cfce2da86190272b1db3df91b
---

kroをインストールしたので、WebApplication ResourceGraphDefinitionsを使用して**Carts**コンポーネントをデプロイします。まず、再利用可能なWebApplication APIを定義するResourceGraphDefinitionテンプレートを確認しましょう:
kroをインストールしたので、kro WebApplication ResourceGraphDefinitionsを使用して**Carts**コンポーネントをデプロイします。まず、再利用可能なWebApplication APIを定義するResourceGraphDefinitionテンプレートを確認しましょう:

<details>
<summary>RGDマニフェストの全容を表示</summary>
Expand All @@ -26,7 +26,7 @@ kroをインストールしたので、WebApplication ResourceGraphDefinitions
::yaml{file="manifests/modules/automation/controlplanes/kro/rgds/webapp-rgd.yaml" zoomPath="spec.schema.spec" zoomBefore="0"}

:::info
スキーマがどのようにデフォルト値と型定義を使用して、Kubernetesの複雑さを隠し、開発者に優しいAPIを作成しているかに注目してください。
スキーマがどのようにデフォルト値と型定義を使用して、基礎となるKubernetesの複雑さを隠し、開発者に優しいAPIを作成しているかに注目してください。
:::

このWebApplication ResourceGraphDefinitionを使用して、インメモリデータベースを使用する**Carts**コンポーネントのインスタンスを作成します。まず、既存のcartsデプロイメントをクリーンアップしましょう:
Expand All @@ -44,7 +44,7 @@ deployment.apps "carts-dynamodb" deleted
次に、WebApplication APIを登録するためにResourceGraphDefinitionを適用します:

```bash wait=10
$ kubectl apply -f ~/environment/eks-workshop/modules/automation/controlplanes/kro/rgds/webapp-rgd.yaml
$ cat ~/environment/eks-workshop/modules/automation/controlplanes/kro/rgds/webapp-rgd.yaml | envsubst | kubectl apply -f -
resourcegraphdefinition.kro.run/web-application created
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@
title: "Argo CDのインストール"
sidebar_position: 10
weight: 10
tmdTranslationSourceHash: d56c4f4c50af1ff2a7b63644e2d44aeb
tmdTranslationSourceHash: f21fde74f48eca3eff8ecc25c4231f6e
---

まずはクラスターにArgo CDをインストールしましょう:

```bash
$ helm repo add argo-cd https://argoproj.github.io/argo-helm
$ ESCAPED_CIDRS="${INBOUND_CIDRS//,/\\,}"
$ helm upgrade --install argocd argo-cd/argo-cd --version "${ARGOCD_CHART_VERSION}" \
--namespace "argocd" --create-namespace \
--values ~/environment/eks-workshop/modules/automation/gitops/argocd/values.yaml \
--set "server.service.annotations.service\\.beta\\.kubernetes\\.io/load-balancer-source-ranges=$ESCAPED_CIDRS" \
--wait
NAME: argocd
LAST DEPLOYED: [...]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
---
title: "Gitea のセットアップ"
sidebar_position: 5
tmdTranslationSourceHash: 65f16f55be12d2b448d3eac30d9a4841
tmdTranslationSourceHash: 9a72a1093c545cbb52c730a79ad8fee9
---

GitHub や GitLab の代わりに、迅速で簡単な代替手段として [Gitea](https://gitea.com) を使用します。Gitea は軽量な自己ホスト型 Git サービスで、ユーザーフレンドリーなウェブインターフェースを提供し、独自の Git リポジトリを迅速にセットアップおよび管理することができます。これは、Argo CD で探索する GitOps ワークフローに不可欠な Kubernetes マニフェストの保存とバージョン管理のための信頼できるソースとして機能します。

Helm を使用して Gitea を EKS クラスターにインストールしましょう:

```bash
$ ESCAPED_CIDRS="${INBOUND_CIDRS//,/\\,}"
$ helm upgrade --install gitea oci://docker.gitea.com/charts/gitea \
--version "$GITEA_CHART_VERSION" \
--namespace gitea --create-namespace \
--values ~/environment/eks-workshop/modules/automation/gitops/argocd/gitea/values.yaml \
--set "service.http.annotations.service\\.beta\\.kubernetes\\.io/load-balancer-source-ranges=$ESCAPED_CIDRS" \
--set "service.ssh.annotations.service\\.beta\\.kubernetes\\.io/load-balancer-source-ranges=$ESCAPED_CIDRS" \
--set "gitea.admin.password=${GITEA_PASSWORD}" \
--wait
```
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
---
title: "Gitea のセットアップ"
sidebar_position: 5
tmdTranslationSourceHash: 81a4c85f3ba8bb568bde3044b3cdfecc
tmdTranslationSourceHash: 523a68005935e08654a02d63632128f0
---

GitHubやGitLabの代わりとして、迅速かつ簡単な方法として[Gitea](https://gitea.com)を使用します。Giteaは軽量な自己ホスト型Gitサービスで、ユーザーフレンドリーなウェブインターフェースを提供し、独自のGitリポジトリを迅速に設定および管理することができます。これは、Fluxで探索するGitOpsワークフローに不可欠なKubernetesマニフェストを保存およびバージョン管理するための信頼できるソースとして機能します。

Helmを使用してEKSクラスターにGiteaをインストールしましょう:

```bash
$ ESCAPED_CIDRS="${INBOUND_CIDRS//,/\\,}"
$ helm upgrade --install gitea oci://docker.gitea.com/charts/gitea \
--version "$GITEA_CHART_VERSION" \
--namespace gitea --create-namespace \
--values ~/environment/eks-workshop/modules/automation/gitops/flux/gitea/values.yaml \
--set "service.http.annotations.service\\.beta\\.kubernetes\\.io/load-balancer-source-ranges=$ESCAPED_CIDRS" \
--set "service.ssh.annotations.service\\.beta\\.kubernetes\\.io/load-balancer-source-ranges=$ESCAPED_CIDRS" \
--set "gitea.admin.password=${GITEA_PASSWORD}" \
--wait
```
Expand Down Expand Up @@ -54,3 +57,4 @@ $ git config --global user.name "Your Name"
$ git config --global init.defaultBranch main
$ git config --global core.sshCommand 'ssh -i ~/.ssh/gitops_ssh.pem'
```

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
title: "Platform Engineering on EKS"
sidebar_custom_props: { "explore": "https://catalog.workshops.aws/platform-engineering-on-eks/en-US" }
sidebar_position: 90
tmdTranslationSourceHash: 'f7246371bf12c113a910ff6e18dc0b28'
---

開発チームは、一貫性のないツールや複雑なプロビジョニングプロセスに悩まされることがよくあります。Cloud Native Computing Foundation (CNCF) では、プラットフォームを「プラットフォームのユーザーのニーズに応じて定義され、提示される統合された機能の集合体」と定義しています。つまり、アプリケーションが必要とするサービスやツールを統合し、Web ポータル、テンプレート、API を通じてシンプルな体験を提供する統一レイヤーです。

Platform Engineering on EKS は、開発者のセルフサービスを中核とした内部開発者プラットフォーム (IDP) の構築方法を示すハンズオンワークショップです。Backstage を使用した統合開発者ポータルのセットアップ、ACK と KRO を使用した AWS リソースの標準化された infrastructure-as-code プロビジョニング、そして Amazon EKS 上での namespace-as-a-service ワークフロー、policy-as-code、GitOps の実用的なパターンを探求します。


<LaunchButton url="https://catalog.workshops.aws/platform-engineering-on-eks/en-US" label="Platform Engineering on EKS" />
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
title: "ワークロードからAWS APIへの安全なアクセス"
sidebar_position: 50
description: "EKS Pod Identityを使用して、Amazon Elastic Kubernetes Serviceで実行されているアプリケーションのAWS認証情報を管理します。"
tmdTranslationSourceHash: '77eb8e7949428f93ddc8daaf7676b48e'
---

:::tip 事前にセットアップされている内容
Amazon EKS Auto Modeクラスターには以下が含まれています:

- cartsサービス用のAmazon DynamoDBテーブル
- cartsワークロードがDynamoDBにアクセスするために設定されたIAMロール

:::

Pod内のコンテナで実行されるアプリケーションは、サポートされているAWS SDKまたはAWS CLIを使用して、AWS Identity and Access Management(IAM)権限を使ってAWSサービスにAPIリクエストを行うことができます。例えば、アプリケーションはS3バケットにファイルをアップロードしたり、DynamoDBテーブルにクエリを実行したりする必要がある場合があります。そのためには、AWS APIリクエストにAWS認証情報で署名する必要があります。[EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)は、Amazon EC2インスタンスプロファイルがインスタンスに認証情報を提供するのと同様に、アプリケーションの認証情報を管理する機能を提供します。AWS認証情報を作成してコンテナに配布したり、Amazon EC2インスタンスのロールを使用する代わりに、IAMロールをKubernetes Service Accountに関連付けて、Podがそれを使用するように設定できます。サポートされているSDKバージョンの正確なリストについては、EKSドキュメントを[こちら](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-minimum-sdk.html)で確認してください。

このモジュールでは、サンプルアプリケーションのコンポーネントの1つを再設定してAWS APIを活用し、適切な権限を提供します。

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: "はじめに"
sidebar_position: 31
tmdTranslationSourceHash: '30a2bf69cd7c96a2fc73a4005d5069f1'
---

アーキテクチャの `carts` コンポーネントは、ストレージバックエンドとして Amazon DynamoDB を使用しています。これは、Amazon EKS との非リレーショナルデータベース統合でよく見られるユースケースです。現在、carts API は、EKS クラスタ内のコンテナとして実行されている [Amazon DynamoDB の軽量版](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html) と共にデプロイされています。

次のコマンドを実行すると、これを確認できます:

```bash wait=30
$ kubectl -n carts get pod
NAME READY STATUS RESTARTS AGE
carts-5d7fc9d8f-xm4hs 1/1 Running 0 14m
carts-dynamodb-698674dcc6-hw2bg 1/1 Running 0 14m
```

上記の出力では、Pod `carts-dynamodb-698674dcc6-hw2bg` が軽量版 DynamoDB サービスです。環境変数を確認することで、`carts` アプリケーションがこれを使用していることを検証できます:

```bash timeout=180
$ kubectl wait --for=condition=Ready pods -l app.kubernetes.io/component=service -n carts --timeout=120s
$ kubectl -n carts exec deployment/carts -- env | grep RETAIL_CART_PERSISTENCE_DYNAMODB_ENDPOINT
RETAIL_CART_PERSISTENCE_DYNAMODB_ENDPOINT=http://carts-dynamodb:8000
```

このアプローチはテストには便利ですが、フルマネージドの Amazon DynamoDB サービスが提供するスケールと信頼性を最大限に活用するために、アプリケーションを移行したいと考えています。次のセクションでは、Amazon DynamoDB を使用するようにアプリケーションを再構成し、EKS Pod Identity を実装して AWS サービスへの安全なアクセスを提供します。

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
title: "Pod IAMの理解"
sidebar_position: 33
tmdTranslationSourceHash: '34ff18988cc9f932ada0b0e51dc7e163'
---

問題の最初の確認場所は、`carts`サービスのログです:

```bash hook=pod-logs timeout=480
$ LATEST_POD=$(kubectl get pods -n carts -l app.kubernetes.io/component=service --sort-by=.metadata.creationTimestamp -o jsonpath='{.items[-1:].metadata.name}')
sleep 60
kubectl logs -n carts -p $LATEST_POD
[...]
software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(profileName=default, profileFile=ProfileFile(sections=[])), ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()]) : [SystemPropertyCredentialsProvider(): Unable to load credentials from system settings. Access key must be specified either via environment variable (AWS_ACCESS_KEY_ID) or system property (aws.accessKeyId)., EnvironmentVariableCredentialsProvider(): Unable to load credentials from system settings. Access key must be specified either via environment variable (AWS_ACCESS_KEY_ID) or system property (aws.accessKeyId)., WebIdentityTokenCredentialsProvider(): Either the environment variable AWS_WEB_IDENTITY_TOKEN_FILE or the javaproperty aws.webIdentityTokenFile must be set., ProfileCredentialsProvider(profileName=default, profileFile=ProfileFile(sections=[])): Profile file contained no credentials for profile 'default': ProfileFile(sections=[]), ContainerCredentialsProvider(): Cannot fetch credentials from container - neither AWS_CONTAINER_CREDENTIALS_FULL_URI or AWS_CONTAINER_CREDENTIALS_RELATIVE_URI environment variables are set., InstanceProfileCredentialsProvider(): Failed to load credentials from IMDS.]
```

アプリケーションはエラーを生成しており、PodがDynamoDBにアクセスするためのAWS認証情報を読み込めないことを示しています。これは、EKS Pod IdentityによってIAM roleやpolicyがPodにリンクされていない場合、アプリケーションがAWS API呼び出しを行うための認証情報を取得できないためです。

一つのアプローチとして、ノードのIAM roleの権限を拡張することが考えられますが、これではそれらのインスタンス上で実行されているすべてのPodがDynamoDBテーブルにアクセスできるようになってしまいます。これは最小権限の原則に違反し、セキュリティのベストプラクティスではありません。代わりに、EKS Pod Identityを使用して、`carts`アプリケーションが必要とする特定の権限をPodレベルで提供し、きめ細かいアクセス制御を確保します。

Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
---
title: "EKS Pod Identityの使用"
sidebar_position: 34
hide_table_of_contents: true
tmdTranslationSourceHash: 'c2ccba1ccd0c6f8192e1325cbaff51bc'
---

Amazon EKS Auto Modeでは、EKS Pod Identity Agentがすでに含まれており、AWSによってコントロールプレーンで管理されています。既存のPod Identityアソシエーションを確認することで、Pod Identityが利用可能であることを確認できます:

```bash
$ aws eks list-pod-identity-associations --cluster-name $EKS_CLUSTER_AUTO_NAME --namespace carts
{
"associations": []
}
```

`carts`サービスがDynamoDBテーブルへの読み書きに必要な権限を提供するIAM roleは、Auto Modeクラスターのセットアップ時に作成されました。以下のようにポリシーを表示できます:

```bash
$ aws iam get-policy-version \
--version-id v1 --policy-arn \
--query 'PolicyVersion.Document' \
arn:aws:iam::${AWS_ACCOUNT_ID}:policy/${EKS_CLUSTER_AUTO_NAME}-carts-dynamo | jq .
{
"Statement": [
{
"Action": "dynamodb:*",
"Effect": "Allow",
"Resource": [
"arn:aws:dynamodb:us-west-2:267912352941:table/eks-workshop-auto-carts",
"arn:aws:dynamodb:us-west-2:267912352941:table/eks-workshop-auto-carts/index/*"
],
"Sid": "AllAPIActionsOnCart"
}
],
"Version": "2012-10-17"
}
```

また、このroleには適切な信頼関係が設定されており、EKS Service PrincipalがPod Identityのためにこのroleをassumeできるようになっています。以下のコマンドで確認できます:

```bash
$ aws iam get-role \
--query 'Role.AssumeRolePolicyDocument' \
--role-name ${EKS_CLUSTER_AUTO_NAME}-carts-dynamo | jq .
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
```

次に、Amazon EKS Pod Identity機能を使用して、Deploymentによって使用されるKubernetes Service AccountとAWS IAM roleを関連付けます。アソシエーションを作成するには、以下のコマンドを実行します:

```bash wait=30
$ aws eks create-pod-identity-association --cluster-name ${EKS_CLUSTER_AUTO_NAME} \
--role-arn arn:aws:iam::${AWS_ACCOUNT_ID}:role/${EKS_CLUSTER_AUTO_NAME}-carts-dynamo \
--namespace carts --service-account carts | jq .
{
"association": {
"clusterName": "eks-workshop-auto",
"namespace": "carts",
"serviceAccount": "carts",
"roleArn": "arn:aws:iam::267912352941:role/eks-workshop-auto-carts-dynamo",
"associationArn": "arn:aws:eks:us-west-2:267912352941:podidentityassociation/eks-workshop-auto/a-yg5uoymvtfgdg5tcj",
"associationId": "a-yg5uoymvtfgdg5tcj",
"tags": {},
"createdAt": "2025-10-11T01:13:27.763000+00:00",
"modifiedAt": "2025-10-11T01:13:27.763000+00:00",
"disableSessionTags": false
}
}
```

残りは、`carts` Deploymentが`carts` Service Accountを使用していることを確認することです:

```bash
$ kubectl -n carts describe deployment carts | grep 'Service Account'
Service Account: carts
```

Service Accountが確認できたので、`carts` Podをリサイクルしましょう:

```bash hook=enable-pod-identity hookTimeout=430
$ kubectl -n carts rollout restart deployment/carts
deployment.apps/carts restarted
```

Podのステータスを確認して、正常にロールアウトされたかを確認しましょう:

```bash timeout=360
$ kubectl -n carts rollout status deployment/carts --timeout=300s
Waiting for deployment "carts" rollout to finish: 1 old replicas are pending termination...
deployment "carts" successfully rolled out
```

それでは、次のセクションで、cartsアプリケーションで発生していたDynamoDB権限の問題が解決されたかどうかを確認しましょう。

Loading