Wie kann ich von meinen Amazon ECS-Aufgaben aus auf andere AWS-Services auf Fargate zugreifen?
Ich möchte von meinen Amazon Elastic Container Service (Amazon ECS)-Aufgaben aus auf andere AWS-Services auf AWS Fargate zugreifen.
Kurzbeschreibung
Wenn Sie AWS-APIs aufrufen, müssen containerisierte Anwendungen AWS-API-Anforderungen mit AWS-Anmeldeinformationen signieren. Verwenden Sie für eine Amazon ECS-Aufgabe die Aufgabenrolle AWS Identity and Access Management (IAM), um API-Anforderungen mit AWS-Anmeldeinformationen zu signieren. Ordnen Sie dann eine IAM-Rolle einer Amazon ECS-Aufgabendefinition oder einem RunTask-API-Vorgang zu. Nachdem Sie dies getan haben, können Ihre Container das AWS-SDK oder die AWS Command Line Interface (AWS CLI) verwenden, um API-Anforderungen an autorisierte AWS-Services zu stellen.
Hinweis: Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.
In diesem Artikel bezieht sich die Beispiellösung auf eine Anwendung, die auf Fargate läuft und auf Amazon Simple Storage Service (Amazon S3) zugreifen muss.
Lösung
Voraussetzungen
- Identifizieren Sie den AWS-Service, auf den Ihre Fargate-Aufgaben zugreifen müssen. Erstellen Sie dann eine IAM-Rolle und geben Sie die Richtlinie mit den erforderlichen Aktionen an, um die API-Aufrufe innerhalb der Container durchzuführen.
- Erstellen Sie eine Aufgabendefinition für Ihre Anwendungscontainer, und verwenden Sie dann den IAM-Parameter taskRoleArn, um die IAM-Rolle für Ihre Aufgaben anzugeben.
Erstellen einer IAM-Richtlinie und Rolle für Ihre Aufgaben
1. Erstellen Sie einen Amazon S3-Bucket zum Speichern Ihrer Daten. Der Bucket-Name muss eindeutig sein und den Amazon S3-Bucket-Anforderungen für Bucket-Namen entsprechen. Weitere Informationen finden Sie unter Benennungsregeln für Buckets.
2. Erstellen Sie eine IAM-Richtlinie und Rolle für Ihre Aufgaben. In diesem Beispiel muss die Anwendung Objekte in einen S3-Bucket legen und diese Objekte dann auflisten:
{ "Version": "2012-10-17", "Statement": [{ "Sid": "S3PutGEList", "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:ListBucket", "s3:ListMultipartUploadParts"], "Resource": ["arn:aws:s3:::*/*", "arn:aws:s3:::kc-test-fargate-app-bucket"] }] }
**Hinweis:**Ersetzen Sie fargate-app-bucket durch den Namen Ihres S3-Buckets.
Erstellen einer Aufgabendefinition für Ihre Anwendung und Angeben der IAM-Rolle für Ihre Aufgaben
Verwenden Sie den Abschnitt taskRoleArn, um die Rolle zuzuweisen, wenn Sie eine Aufgabendefinition erstellen:
{ "containerDefinitions": [{ "name": "sample-s3-access", "image": "public.ecr.aws/aws-cli/aws-cli:latest", "memory": 1024, "cpu": 512, "command": ["s3api", "put-object", "--bucket", "fargate-app-bucket", "--key", "/usr/local/bin/aws"], "essential": true }], "memory": "1024", "cpu": "512", "requiresCompatibilities": ["FARGATE"], "networkMode": "awsvpc", "runtimePlatform": { "operatingSystemFamily": "LINUX" }, "family": "s3_access-WITH-ROLE", "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role" }
Hinweis: Da das Basis-Image die aws-cli-Installation (public.ecr.aws/aws-cli/aws-cli:latest) enthält, kann diese Anwendung den API-Aufruf tätigen.
Speichern Sie die Konfigurationsinformationen in einer Datei, und verwenden Sie dann den Befehl register-task-definition, um die Aufgabendefinition zu registrieren:
aws ecs register-task-definition --cli-input-json file://task-def1.json --region eu-west-1
Erstellen und Ausführen einer eigenständigen Aufgabe
Verwenden Sie einen Fargate-Starttyp, um eine eigenständige Aufgabe auszuführen. In diesem Beispiel wird der Container mit Befehlen ausgeführt und beendet.
Nachdem der Container den Befehl ausgeführt hat, gibt die Aufgabe einen ExitCode=0 zurück, wenn taskRoleArn über die erforderlichen Berechtigungen zum Ausführen der API-Aufrufe verfügt. Wenn taskRoleArn fehlt oder nicht über unzureichende Berechtigungen verfügt, gibt die Aufgabe einenExit-Code ohne 0 zurück.
Erstellen eines Services
**Hinweis:**Damit der Service einen stabilen Zustand erreicht, kann Ihr Aufgabenprozess bei der Eingabe nicht beendet werden. Im vorherigen Beispiel wird der Container nach Abschluss des Befehls beendet. Dies macht das Beispiel für die Ausführung als Teil des Services ungeeignet.
1. Erstellen Sie ein Bash-Skript, das eine Schleife ausführt und das Erstellungsdatum und den Hostnamen der Datei in eine Datei druckt. Verschieben Sie dann die Datei in den Amazon S3-Bucket.
Im folgenden Beispiel heißt das Bash-Skript „run-s3-script.sh“.
#!/bin/bash while true; do TODAY=$(date) echo "-----------------------------------------------------" echo "Date: $TODAY Host:$HOST" echo "File was added and active on these Dates: $TODAY" from Host:$HOSTNAME>> checkfile.txt echo "--------------------Add to S3------------------------" aws s3 cp checkfile.txt s3://kc-test-fargate-app-bucket status_code=$? echo "------------Get upload StatusCode=$status_code ([ $status_code -eq 0 ] means failed)---------------" #echo "------------Get upload StatusCode=$status_code and exit if upload failed.---------------" #[ $status_code -eq 0 ] || exit 1 echo "------------Also list the files in the S3 bucket---------------" aws s3 ls s3://kc-test-fargate-app-bucket status_code=$? echo "------------Get the status_code=$status_code after listing objects in bucket---------------" #[ $status_code -eq 0 ] || exit 1 #uncomment this is you want the task to stop upon failed attempt echo "=============================================================================" sleep 5 #check the user or role that made the call aws sts get-caller-identity echo "*****End of loop, restarting" sleep 10 done
2. Um ein neues Image zu erstellen, das das Skript hinzufügt und ausführt, erstellen Sie ein Docker-Datei:
FROM public.ecr.aws/amazonlinux/amazonlinux:latest Run yum -y install unzip RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip RUN /aws/install RUN rm -rf aws* COPY run-s3-test.sh / CMD ./run-s3-test.sh
3. Führen Sie den folgenden Befehl aus, um das Image lokal zu erstellen:
$ docker build -t test-awscli:amz-build-scripts
4. Übertragen Sie das Image in die Amazon Elastic Container Registry (Amazon ECR). Fügen Sie das Image der Aufgabendefinition hinzu, die Sie zum Erstellen des Services verwenden. Weitere Informationen finden Sie unter Übertragen eins Images.
{ "containerDefinitions": [{ "name": "add-files-to-s3", "image": "aws_account_id.dkr.ecr.eu-central-1.amazonaws.com/test-s3-ecs:amzlin-build-scripts", "memory": 1024, "cpu": 512, "healthCheck": { "retries": 3, "command": ["CMD-SHELL", "aws s3 ls s3://kc-test-fargate-app-bucket || exit 1"], "timeout": 5, "interval": 10, "startPeriod": 5 }, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/test-s3-script", "awslogs-region": "eu-central-1", "awslogs-create-group": "true", "awslogs-stream-prefix": "ecs" } }, "essential": true }], "memory": "1024", "cpu": "512", "requiresCompatibilities": ["FARGATE"], "networkMode": "awsvpc", "runtimePlatform": { "operatingSystemFamily": "LINUX" }, "family": "test-s3-script", "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role", "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole" }
**Hinweis:**Möglicherweise erhalten Sie die Fehlermeldung „Zugriff verweigert“, wenn Sie IAM-Aufgabenrollen für Ihre Container verwenden. Weitere Informationen finden Sie unter Wie kann ich IAM-Aufgabenrollen in Amazon ECS konfigurieren, um Fehler wie „Zugriff verweigert“ zu vermeiden?
Verwandte Informationen
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 3 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 6 Monaten