Menggunakan workload identity dengan AWS

Workload identity memungkinkan Anda menetapkan identitas dan otorisasi yang berbeda dan terperinci untuk setiap aplikasi di cluster. Workload Identity adalah cara yang direkomendasikan bagi aplikasi yang berjalan dalam GKE di AWS untuk mengakses layanan AWS dan Google Cloud. Untuk mengetahui informasi selengkapnya, lihat Identitas workload.

Topik ini menjelaskan cara membuat penyedia OIDC, menyediakan akun layanan, dan menguji contoh beban kerja menggunakan identitas workload.

Membuat penyedia IAM OIDC AWS untuk cluster Anda

Untuk menggunakan identitas workload dengan cluster, pertama-tama buat penyedia OIDC IAM AWS yang mereferensikan cluster Anda. Jika sudah memiliki penyedia IAM OIDC untuk cluster, Anda dapat melewati bagian ini.

Untuk membuat penyedia, ikuti langkah-langkah berikut:

  1. Tentukan URI penerbit OIDC untuk cluster Anda:

    gcloud container aws clusters describe CLUSTER_NAME \
         --location=GOOGLE_CLOUD_LOCATION \
         --format='value(workloadIdentityConfig.issuerUri)'
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda
    • GOOGLE_CLOUD_LOCATION: nama lokasi Google Cloud tempat kumpulan node ini akan dikelola, seperti yang ditentukan di region pengelolaan Google Cloud

    Outputnya mencakup URI penerbit OIDC cluster Anda. Simpan nilai ini untuk langkah berikut.

  2. Selanjutnya, buat penyedia OIDC IAM AWS yang mereferensikan cluster Anda dengan perintah berikut:

    aws iam create-open-id-connect-provider \
        --url ISSUER_URI \
        --client-id-list sts.amazonaws.com \
        --thumbprint-list 08745487e891c19e3078c1f2a07e452950ef36f6
    

    Ganti ISSUER_URI dengan URI penerbit Anda dari langkah sebelumnya.

    thumbprint layanan Google Cloud yang menyalurkan URI penerbit selalu 08745487e891c19e3078c1f2a07e452950ef36f6.

Mengonfigurasi peran IAM AWS dengan kebijakan IAM terlampir

Untuk mengonfigurasi peran IAM AWS dan melampirkan kebijakan ke peran tersebut, ikuti langkah-langkah berikut:

  1. Tentukan host penerbit dengan menghapus awalan https:// dari URI penerbit. Misalnya, jika URI Anda adalah https://oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster, host-nya adalah oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster. Simpan nilai ini. Anda nanti akan membutuhkannya.

  2. Tentukan Amazon Resource Name (ARN) penyedia dengan menjalankan:

    aws iam list-open-id-connect-providers --output=text \
        --query 'OpenIDConnectProviderList[?ends_with(Arn, `ISSUER_HOST`) == `true`].Arn'
    

    Ganti ISSUER_HOST dengan nama host dari URI penerbit untuk cluster.

  3. Selanjutnya, buat kebijakan kepercayaan untuk memberikan kredensial OIDC ke akun layanan Kubernetes. Buat file bernama trust-policy.json dengan konten berikut:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "PROVIDER_ARN"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "ISSUER_HOST:sub": "system:serviceaccount:NAMESPACE:KSA_NAME"
            }
          }
        }
      ]
    }
    

    Ganti kode berikut:

    • PROVIDER_ARN: ARN penyedia IAM OIDC cluster
    • ISSUER_HOST: nama host dari URI penerbit untuk cluster.
    • NAMESPACE: namespace Kubernetes tempat aplikasi berjalan
    • KSA_NAME: akun layanan Kubernetes (KSA) yang akan digunakan untuk aplikasi
  4. Membuat peran IAM AWS:

    aws iam create-role --role-name=AWS_ROLE_NAME \
        --assume-role-policy-document file://trust-policy.json
    

    Ganti AWS_ROLE_NAME dengan nama peran IAM AWS untuk aplikasi.

  5. Lampirkan kebijakan IAM AWS ke peran tersebut:

    aws iam attach-role-policy --role-name=AWS_ROLE_NAME \
        --policy-arn=AWS_POLICY_ARN
    

    Ganti kode berikut:

    • AWS_ROLE_NAME: nama peran IAM AWS untuk aplikasi

    Misalnya, untuk membuat peran bernama ec2-readonly, dengan kebijakan arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess, jalankan perintah berikut:

    aws iam attach-role-policy --role-name=ec2-readonly \
        --policy-arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

Menerapkan aplikasi sampel

Untuk menguji identitas workload, ikuti langkah-langkah berikut untuk men-deploy aplikasi contoh:

  1. Tentukan ARN peran:

    aws iam get-role --role-name=AWS_ROLE_NAME --query 'Role.Arn'
    

    Ganti AWS_ROLE_NAME.

  2. Membuat manifes untuk Kubernetes Namespace, KSA, dan Pod. Salin manifes berikut ke dalam file bernama workload-identity-test.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: aws-cli-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: aws-cli
        image: amazon/aws-cli:latest
        command:
        - /bin/bash
        - -c
        - "set -eu -o pipefail; while true; do aws ec2 describe-availability-zones; sleep 5; done"
        env:
        - name: AWS_ROLE_ARN
          value: AWS_ROLE_ARN
        - name: AWS_WEB_IDENTITY_TOKEN_FILE
          value: /var/run/secrets/aws-iam-token/serviceaccount/token
        - name: AWS_REGION
          value: AWS_REGION
        volumeMounts:
        - mountPath: /var/run/secrets/aws-iam-token/serviceaccount
          name: aws-iam-token
          readOnly: true
      volumes:
      - name: aws-iam-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: sts.amazonaws.com
              expirationSeconds: 86400
              path: token
    

    Ganti kode berikut:

    • NAMESPACE
    • KSA_NAME
    • AWS_ROLE_ARN: ARN peran IAM AWS untuk aplikasi
    • AWS_REGION: region AWS cluster
  3. Terapkan manifes:

    kubectl apply -f workload-identity-test.yaml
    

    Tunggu beberapa menit hingga Pod dimulai, lalu lanjutkan ke bagian berikut.

Memastikan aplikasi contoh berfungsi

Untuk memastikan bahwa aplikasi contoh dapat mengakses EC2 API, lihat log pod:

kubectl logs -f aws-cli-example -n NAMESPACE

Jika Pod dapat mengakses EC2 API, output-nya akan menyertakan informasi tentang zona ketersediaan EC2 dan terlihat mirip dengan berikut ini:

-------------------------------------------------
|           DescribeAvailabilityZones           |
+-----------------------------------------------+
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az1             ||
||  ZoneName           |  us-west-2a           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az2             ||
||  ZoneName           |  us-west-2b           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az3             ||
||  ZoneName           |  us-west-2c           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az4             ||
||  ZoneName           |  us-west-2d           ||
|+---------------------+-----------------------+|

Pembersihan

Untuk menghapus aplikasi contoh ini, ikuti langkah-langkah berikut:

  1. Hapus manifes aplikasi contoh dari cluster Anda:

    kubectl delete -f workload-identity-test.yaml
    
  2. Lepaskan kebijakan IAM AWS dari peran:

    aws iam detach-role-policy --role-name AWS_ROLE_NAME \
        --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

    Ganti AWS_ROLE_NAME dengan nama peran IAM AWS untuk aplikasi.

  3. Hapus peran IAM AWS:

    aws iam delete-role --role-name AWS_ROLE_NAME
    

    Ganti AWS_ROLE_NAME dengan nama peran IAM AWS untuk aplikasi.

  4. Hapus penyedia OIDC IAM AWS:

    aws iam delete-open-id-connect-provider --open-id-connect-provider-arn PROVIDER_ARN
    

    Ganti PROVIDER_ARN dengan ARN dari penyedia IAM OIDC untuk cluster.

Langkah selanjutnya