Direkt zum Inhalt

Wie übergebe ich mit CodeBuild temporäre Anmeldeinformationen für AssumeRole an die Docker-Laufzeit?

Lesedauer: 3 Minute
0

Ich möchte temporäre Anmeldeinformationen für AssumeRole mit AWS CodeBuild an die Docker-Laufzeit übergeben.

Kurze Beschreibung

CodeBuild verwendet die CodeBuild-Servicerolle als standardmäßige AWS-Anmeldeinformationen im Build-Container. Die Docker-Laufzeit, die im Build-Container ausgeführt wird, erhält keine AWS-Anmeldeinformationen und muss explizit konfiguriert werden.

Exportiere die AssumeRole-Anmeldeinformationen als Umgebungsvariablen. Übergib diese Variablen dann an die Docker-Laufzeit, indem du den Parameter**--build-arg ** für** Docker-Build** verwendest. Weitere Informationen findest du unter Docker-Build auf der Docker Docs-Website.

Lösung

1.Erstelle eine neue Rolle für die Docker-Laufzeit. Zum Beispiel: Secretassumerole

2.Aktualisiere die Vertrauensverhältnis-Richtlinie von Secretassumerole und füge deine CodeBuild-Servicerolle hinzu, um die Rolle zu übernehmen. Zum Beispiel:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::$account_id:role/service-role/codebuild-service-role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.Verwende die neue Rolle, um den geheimen AWSExampleSecret-Wert vom AWS Secrets Manager abzurufen. Zum Beispiel:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecretVersionIds"
      ],
      "Resource": [
        "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/AWSExampleSecret-EHWYme"
      ]
    }
  ]
}

**Hinweis:**Ersetze $account_id durch deine Konto-ID. Du kannst während der Docker-Laufzeit jede Operationsgenehmigung erteilen.

4.Füge deiner CodeBuild-Servicerolle die Berechtigungen sts:assumeRole hinzu, um AssumeRole-Operationen zuzulassen. Zum Beispiel:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole"
    }
  ]
}

5.Verwende eine Build-Spezifikation, um die AssumeRole-Anmeldeinformationen in eine Umgebungsvariable zu exportieren. Verwende dann den Befehl docker build, um die Anmeldeinformationen an deine Docker-Laufzeit zu übergeben. Zum Beispiel:

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 16
    commands:
      - ASSUME_ROLE_ARN="arn:aws:iam::$account_id:role/Secretassumerole"
      - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name test)
      - export TEMP_ROLE
      - export AWS_ACCESS_KEY_ID=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.AccessKeyId')
      - export AWS_SECRET_ACCESS_KEY=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SecretAccessKey')
      - export AWS_SESSION_TOKEN=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SessionToken')

  pre_build:
    commands:
      - echo Build started on 'date'
      - echo Building the Docker image...
      - docker build . --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY --build-arg AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN

Hinweis: Du kannst --duration-seconds verwenden, um die maximale Sitzungsdauer für die übernommene Rolle festzulegen. Da dieser Prozess die Verkettung von Rollen beinhaltet, akzeptiert die Option --duration-seconds einen Maximalwert von 3600 Sekunden. Wenn du einen Wert über 3600 Sekunden festlegst, schlägt der Vorgang fehl. Weitere Informationen findest du im Abschnitt Rollenverkettung unter Begriffe und Konzepte von Rollen.

6.Rufe in deinem Dockerfile die AssumeRole-Anmeldeinformationen ab, wenn du ein Image erstellst. Zum Beispiel:

FROM amazonlinux:latest
RUN yum -y install aws-cli
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_SESSION_TOKEN
RUN echo $AWS_ACCESS_KEY_ID
RUN echo $AWS_SECRET_ACCESS_KEY
RUN echo $AWS_SESSION_TOKEN
RUN aws sts get-caller-identity
RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1

**Hinweis:**Du kannst RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret in DOCKERFILE hinzufügen, um die Geheimnisse im Build abzurufen. Warnung: Auf diese Weise kannst du deine Geheimnisse in den Build-Protokollen preisgeben.

Ausgabe:

Step 8/11 : RUN echo $AWS_ACCESS_KEY_ID
 ---> Running in 1a1b1c1d1e1f
AKIAIOSFODNN7EXAMPLE
Removing intermediate container 2a3b4c5d6e7f
 ---> 32a8170f9697
Step 9/11 : RUN echo $AWS_SECRET_ACCESS_KEY
 ---> Running in 3a3b3c3d3e3f
KJq+JNqmnNq1JirNUBkxc+kRVavgZwhpFFIJjxD6
Removing intermediate container 3a3b3c3d3e3f
 ---> 4a4b4c4d4e4f
Step 10/11 : RUN echo $AWS_SESSION_TOKEN
 ---> Running in 5a5b5c5d5e5f
FQoGZXIvYXdzEJP//////////wEaDPTjooaOAaU8NDj5oyKkAjVwT4uQHTZJdCtfOZxa6wTZVOy0Zkw+laN1RRVZhvhdPOWhU8VgK2d7ZgTlqaXn4NSrdWlnub6g5JobP4o509t3VLdMUR5ZJJcpnSlJAY5YM7vlPndroGcV+Y689ztVzQ1uVxdtpjQK1qh87fw6m0dHt7Q8Y8TferRNVvCM4kOroxPzovTbO6IkLDcBp8PhOVgtVtxEpON6nZrN990zzUmhXjT0vrtpDtAi339hhs7fzDOrnllQHSAmSerT0NhMOYVqBH1HJOq3FYnG+TUbHENpSq3kwTiPL2uoTw7/Ufrrgz4i3ENHm3rIWlbD8VuleDl5yhooKifmKDPjQAHs5HbVjD9lnxQFrCIuyvZdmsqzgoIjPt6z5H8lzugLHAAmbgiOwDoo+Oba7QU=
Removing intermediate container 5a5b5c5d5e5f
 ---> 0cc838f3c865
Step 11/11 : RUN aws sts get-caller-identity
 ---> Running in 6a6b6c6d6e6f
{
    "Account": "xxxxxxxxx",
    "UserId": "AIDACKCEVSQ6C2EXAMPLE:test",
    "Arn": "arn:aws:sts::$account_id:assumed-role/Secretassumerole/test"
}
Removing intermediate container 6d525393d667
 ---> 2da2f38adc77
Step 12/12 : RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1
 ---> Running in 7a7b7c7d7e7f
{
    "Name": "tutorials/AWSExampleSecret",
    "VersionId": "1a23bb45-679c-1d2e-fg34-567891234hi5",
    "SecretString": "{\"username\":\"myserviceusername\",\"password\":\"yourPassword\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1558616482.926,
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/M-EHWYme"
}
Removing intermediate container 8a8b8c8d8e8f
 ---> 9a9b9c9d9e9f
Successfully built 9a9b9c9d9e9f
AWS OFFICIALAktualisiert vor einem Jahr