Menggunakan Amazon ECS Exec untuk debugging - Amazon ECS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan Amazon ECS Exec untuk debugging

Dengan Amazon ECS Exec, Anda dapat berinteraksi secara langsung dengan kontainer tanpa perlu terlebih dahulu berinteraksi dengan sistem operasi kontainer host, membuka port masuk masuk, atau mengelola kunci SSH. Anda dapat menggunakan ECS Exec untuk menjalankan perintah atau membawa shell ke kontainer yang berjalan pada instans Amazon EC2 atau aktifAWS Fargate. Hal tersebut mempermudah pengumpulan informasi diagnostik dan memecahkan masalah kesalahan dengan cepat. Misalnya, dalam konteks pengembangan, Anda dapat menggunakan ECS Exec untuk berinteraksi dengan berbagai proses dalam kontainer Anda dengan mudah dan memecahkan masalah aplikasi Anda. Dan, dalam skenario produksi, Anda dapat menggunakannya untuk mendapatkan akses break-glass ke kontainer Anda untuk men-debug masalah.

Anda dapat menjalankan perintah dalam kontainer Linux atau Windows yang berjalan menggunakan ECS Exec dari Amazon ECS API,AWS Command Line Interface (AWS CLI),AWS SDK, atauAWS Copilot CLI. Untuk detail tentang penggunaan ECS Exec, serta panduan video, menggunakanAWS Copilot CLI, lihat dokumentasi Copilot Github.

Anda juga dapat menggunakan ECS Exec untuk mempertahankan kebijakan kontrol akses yang lebih ketat dan akses kontainer audit yang lebih ketat. Dengan mengaktifkan fitur ini secara selektif, Anda dapat mengendalikan siapa yang dapat menjalankan perintah dan ditugas mana mereka dapat menjalankan perintah tersebut. Dengan log dari setiap perintah dan outputnya, Anda dapat menggunakan ECS Exec untuk mengaudit tugas yang dijalankan dan Anda dapat menggunakan CloudTrail untuk mengaudit siapa saja yang mengakses kontainer.

Arsitektur

ECS Exec menggunakan Pengelola SesiAWS Systems Manager (SSM) untuk membuat koneksi dengan kontainer yang berjalan dan menggunakan kebijakanAWS Identity and Access Management (IAM) untuk mengendalikan akses ke perintah yang sedang berjalan dalam kontainer yang berjalan. Hal ini dimungkinkan dengan mengikat pemasangan biner SSM agent yang diperlukan ke dalam kontainer. Amazon ECS atauAWS Fargate agen bertanggung jawab untuk memulai agen inti SSM di dalam kontainer bersama kode aplikasi Anda. Untuk informasi lebih lanjut, lihat Systems Manager Session Manager.

Anda dapat mengaudit siapa saja pengguna yang mengakses kontainer menggunakanAWS CloudTrail dan mencatat setiap perintah (dan output mereka) ke Amazon S3 atau Amazon CloudWatch Logs. Untuk mengenkripsi data antara klien lokal dan kontainer dengan kunci enkripsi Anda sendiri, Anda harus menyediakan kunci AWS Key Management Service (AWS KMS).

Pertimbangan untuk menggunakan ECS Exec

Untuk topik ini, Anda harus terbiasa dengan aspek berikut yang terlibat dengan penggunaan ECS Exec:

  • ECS Exec didukung untukAWS Fargate, instans eksternal (ECS Anywhere), kontainer Linux yang dihosting di Amazon EC2 dan AMI yang dioptimalkan Windows Amazon ECS berikut (dengan versi agen kontainer1.56 atau yang lebih baru):

    • AMI Windows Server 2022 Full AMI yang dioptimalkan untuk Amazon ECS

    • AMI Windows Server 2022 Core AMI yang dioptimalkan untuk Amazon ECS

    • AMI Windows Server 2019 Full AMI yang dioptimalkan untuk Amazon ECS

    • AMI Windows Server 2019 Core AMI yang dioptimalkan untuk Amazon ECS

    • AMI Windows Server 20H2 Core AMI yang dioptimalkan untuk Amazon ECS

  • ECS Exec saat ini tidak didukung menggunakanAWS Management Console.

  • ECS Exec saat ini tidak didukung untuk tugas yang diluncurkan menggunakan penyedia kapasitas grup Auto Scaling.

  • Jika Anda menggunakan antarmuka titik akhir Amazon VPC dengan Amazon ECS, Anda harus membuat antarmuka titik akhir Amazon VPC untuk Systems Manager Sesi Manager. Untuk informasi selengkapnya, lihat Buat titik akhir VPC Manajer Sesi Systems Manager saat menggunakan fitur ECS Exec.

  • Jika Anda menggunakan antarmuka Amazon VPC endpoint dengan Amazon ECS, dan Anda gunakanAWS KMS key untuk enkripsi, maka Anda harus membuat antarmuka Amazon VPC endpoint untuk harus membuat antarmuka Amazon VPC endpoint untukAWS KMS key. Untuk informasi selengkapnya, lihat Menghubungkan keAWS KMS key melalui titik akhir VPC di PanduanAWS Key Management Service Pengembang.

  • Anda tidak dapat mengaktifkan ECS Exec untuk tugas yang ada. ECS Exec hanya dapat dihidupkan untuk tugas baru.

  • Ketika pengguna menjalankan perintah pada kontainer dengan menggunakan ECS Exec, perintah ini dijalankan sebagairoot pengguna. Agen SSM dan proses turunannya berjalan sebagai root bahkan ketika Anda menentukan ID pengguna untuk kontainer.

  • Sesi ECS Exec memiliki waktu tunggu idle 20 menit. Nilai ini tidak dapat diubah.

  • Agen SSM mengharuskan bahwa sistem file kontainer dapat ditulis untuk membuat direktori dan file yang diperlukan. Oleh karena itu, membuat sistem file root hanya-baca menggunakan parameter ketentuan tugas readonlyRootFilesystem, atau metode lainnya, tidak didukung.

  • Pengguna dapat menjalankan semua perintah yang tersedia dalam konteks kontainer. Tindakan berikut mungkin mengakibatkan proses tanpa induk dan zombie: mengakhiri proses utama kontainer, mengakhiri agen perintah, dan menghapus dependensi. Untuk membersihkan proses zombie, sebaiknya tambahkan flag initProcessEnabled untuk ketentuan tugas Anda.

  • Sementara memulai sesi SSM di luarexecute-command tindakan dimungkinkan, hal ini mengakibatkan sesi tidak dicatat dan dihitung terhadap batas sesi. Kami merekomendasikan untuk membatasi akses ini dengan menolakssm:start-session tindakan tersebut menggunakan kebijakan IAM. Untuk informasi selengkapnya, lihat Membatasi akses ke tindakan Memulai Sesi.

  • ECS Exec akan menggunakan beberapa CPU dan memori. Anda akan ingin mengakomodasinya saat menentukan alokasi sumber daya CPU dan memori dalam ketentuan tugas Anda.

  • Anda harus menggunakanAWS CLI versi1.22.3 atau versi yang lebih baru atauAWS CLI versi2.3.6 atau yang lebih baru. Untuk informasi tentang cara memperbaruiAWS CLI, lihat Menginstal atau memperbarui versi terbaru dariAWS CLI dalam PanduanAWS Command Line Interface Pengguna Versi 2.

  • Anda tidak dapat menggunakan ECS Exec saat Anda menggunakanrun-task untuk meluncurkan tugas pada klaster yang menggunakan penskalaan terkelola dengan penempatan asinkron (meluncurkan tugas tanpa instance).

  • Anda tidak dapat menjalankan ECS Exec terhadap kontainer Microsoft Nano Server. Untuk informasi selengkapnya tentang kontainer Nano Server, lihat Nano Server di situs web Docker.

Prasyarat untuk menggunakan ECS Exec

Sebelum Anda mulai menggunakan ECS Exec, pastikan bahwa Anda telah menyelesaikan tindakan ini:

  • Instal dan konfigurasikan AWS CLI. Untuk informasi selengkapnya, lihat AWS CLI.

  • Instal plugin Pengelola Sesi untuk AWS CLI. Untuk informasi selengkapnya, lihat Instal plugin Pengelola Sesi untuk AWS CLI.

  • ECS Exec memiliki persyaratan versi berdasarkan pada apakah tugas Anda di-hosting di Amazon EC2 atauAWS Fargate:

    • Jika Anda menggunakan Amazon EC2, Anda harus menggunakan AMI yang dioptimalkan Amazon ECS yang dirilis setelah 20 Januari 2021, dengan versi agen 1.50.2 atau yang lebih besar. Untuk informasi selengkapnya, lihat AMI yang dioptimalkan Amazon ECS.

    • Jika Anda menggunakanAWS Fargate, Anda harus menggunakan versi platform1.4.0 atau yang lebih tinggi (Linux) atau1.0.0 (Windows). Untuk informasi selengkapnya, lihat Versi platform AWS Fargate.

Menggunakan ECS Exec

Izin IAM diperlukan untuk ECS Exec

Fitur ECS Exec mengharuskan peran IAM tugas untuk memberikan kontainer izin yang diperlukan untuk komunikasi antara agen SSM terkelola (execute-commandagen) SSM dan layanan SSM. Untuk informasi lebih lanjut, lihat peran IAM tugas Amazon ECS. Anda harus menambahkan izin berikut untuk peran IAM tugas dan termasuk peran IAM tugas dalam ketentuan tugas Anda. Untuk informasi selengkapnya, lihat Menambahkan dan Menghapus Kebijakan IAM.

Gunakan kebijakan berikut untuk peran IAM tugas Anda untuk menambahkan izin SSM yang diperlukan.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }

Perubahan ketentuan tugas opsional

Jika Anda menetapkan parameter ketentuan tugas initProcessEnabled ke true, tindakan ini memulai proses unit dalam kontainer, yang menghapus setiap proses anak SSM agent zombie yang ditemukan. Contoh disediakan seperti berikut.

{ "taskRoleArn": "ecsTaskRole", "networkMode": "awsvpc", "requiresCompatibilities": [ "EC2", "FARGATE" ], "executionRoleArn": "ecsTaskExecutionRole", "memory": ".5 gb", "cpu": ".25 vcpu", "containerDefinitions": [ { "name": "amazon-linux", "image": "amazonlinux:latest", "essential": true, "command": ["sleep","3600"], "linuxParameters": { "initProcessEnabled": true } } ], "family": "ecs-exec-task" }

Mengaktifkan ECS Exec untuk tugas dan layanan

Anda dapat mengaktifkan fitur ECS Exec untuk layanan Anda dan tugas mandiri dengan menentukan--enable-execute-command tanda saat menggunakan salah satuAWS CLI perintah berikut: create-service,, update-servicestart-task, atau run-task.

Misalnya, jika Anda menjalankan perintah berikut, fitur ECS Exec diaktifkan untuk layanan yang baru dibuat. Untuk informasi selengkapnya tentang membuat layanan, lihat buat-layanan.

aws ecs create-service \ --cluster cluster-name \ --task-definition task-definition-name \ --enable-execute-command \ --service-name service-name \ --desired-count 1

Setelah Anda mengaktifkan ECS Exec untuk tugas, Anda dapat menjalankan perintah berikut untuk mengonfirmasi tugas yang siap untuk digunakan. Jika properti lastStatus dari ExecuteCommandAgent terdaftar sebagai RUNNING dan properti enableExecuteCommand diatur ke true, maka tugas Anda sudah siap.

aws ecs describe-tasks \ --cluster cluster-name \ --tasks task-id

Potongan output berikut adalah contoh apa yang mungkin Anda lihat.

{ "tasks": [ { ... "containers": [ { ... "managedAgents": [ { "lastStartedAt": "2021-03-01T14:49:44.574000-06:00", "name": "ExecuteCommandAgent", "lastStatus": "RUNNING" } ] } ], ... "enableExecuteCommand": true, ... } ] }

Menjalankan perintah menggunakan ECS Exec

Setelah Anda telah mengonfirmasi bahwa ExecuteCommandAgent sedang berjalan, Anda dapat membuka shell interaktif pada kontainer Anda dengan menggunakan perintah berikut. Jika tugas Anda berisi beberapa kontainer, Anda harus menentukan nama kontainer menggunakan--container bendera. Amazon ECS hanya mendukung memulai sesi interaktif, jadi Anda harus menggunakan--interactive bendera.

Perintah berikut akan menjalankan/bin/sh perintah interaktif terhadap kontainer bernama container-nama kontainer untuk tugas dengan id tugas id tugas.

aws ecs execute-command --cluster cluster-name \ --task task-id \ --container container-name \ --interactive \ --command "/bin/sh"

Mencatat dan Mengaudit menggunakan ECS Exec

Mengaktifkan pencatatan dan audit dalam tugas dan layanan

Amazon ECS menyediakan konfigurasi default untuk perintah pencatatan yang berjalan menggunakan ECS Exec dengan mengirim log ke CloudWatch Log menggunakan driverawslogs log yang dikonfigurasikan dalam ketentuan tugas Anda. Jika Anda ingin menyediakan konfigurasi kustom, AWS CLI mendukung flag --configuration untuk kedua perintah create-cluster dan update-cluster. Penting untuk diketahui bahwa citra kontainer mengharuskanscript dan dipasang sehingga log perintah dapat diunggah dengan benarcat ke Amazon S3 atau Log perintah perintah dapat diunggah dengan benar ke Amazon S3 atau CloudWatch Log perintah. Untuk informasi selengkapnya tentang pembuatan klaster, lihat buat-klaster.

catatan

Konfigurasi ini hanya menangani pencatatan sesi execute-command. Konfigurasi tersebut tidak memengaruhi pencatatan aplikasi Anda.

Contoh berikut membuat layanan dan kemudian mencatat output ke CloudWatch Log Anda yang LogGroup diberi namacloudwatch-log-group-name dan bucket Amazon S3 Anda yang diberi namas3-bucket-name.

Anda harus menggunakan kunci yang dikelolaAWS KMS pelanggan untuk mengenkripsi grup log saat Anda menyetelCloudWatchEncryptionEnabled opsitrue. Untuk informasi tentang cara mengenkripsi grup log, lihat Mengenkripsi data log dalam CloudWatch Log menggunakanAWS Key Management Service, di PanduanAmazon CloudWatch Logs Pengguna.

aws ecs create-cluster \ --cluster-name cluster-name \ --configuration executeCommandConfiguration="{ \ kmsKeyId=string, \ logging=OVERRIDE, \ logConfiguration={ \ cloudWatchLogGroupName=cloudwatch-log-group-name, \ cloudWatchEncryptionEnabled=true, \ s3BucketName=s3-bucket-name, \ s3EncryptionEnabled=true, \ s3KeyPrefix=demo \ } \ }"

loggingProperti menentukan perilaku kemampuan pencatatan ECS Exec:

  • NONE: log dimatikan

  • DEFAULT: log dikirim ke driver awslogs yang dikonfigurasi (Jika driver tidak dikonfigurasi, maka log tidak disimpan.)

  • OVERRIDE: log dikirim ke Amazon CloudWatch Logs LogGroup, bucket Amazon S3, atau keduanya yang disediakan

Izin IAM diperlukan untuk Amazon CloudWatch Loggs atau Amazon S3 Logging

Untuk mengaktifkan pencatatan, peran tugas Amazon ECS yang direferensikan dalam ketentuan tugas Anda perlu memiliki izin tambahan. Izin tambahan ini dapat ditambahkan sebagai kebijakan untuk peran tugas. Catatan tersebut berbeda tergantung pada apakah Anda mengarahkan log Anda ke Amazon CloudWatch Logs atau Amazon S3.

Amazon CloudWatch Logs

Contoh kebijakan berikut menambahkan izin Amazon CloudWatch Logs yang diperlukan.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:region:account-id:log-group:/aws/ecs/cloudwatch-log-group-name:*" } ] }
Amazon S3

Contoh kebijakan berikut menambahkan izin Amazon S3 yang diperlukan.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetEncryptionConfiguration" ], "Resource": "arn:aws:s3:::s3-bucket-name" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::s3-bucket-name/*" } ] }

Izin IAM diperlukan untuk enkripsi menggunakan Anda sendiriAWS KMS key (kunci KMS)

Secara default, data yang ditransfer antara klien lokal Anda dan kontainer menggunakan enkripsi TLS 1.2 yang menyediakan AWS. Untuk mengenkripsi data lebih lanjut menggunakan kunci KMS Anda sendiri, Anda harus membuat kunci KMS dan menambahkankms:Decrypt izin ke peran IAM tugas Anda. Izin ini digunakan oleh kontainer Anda untuk mendekripsi data. Untuk informasi lebih lanjut tentang cara membuat kunci KMS, lihat Membuat kunci.

Anda akan menambahkan kebijakan inling berikut untuk tugas IAM role Anda yang memerlukan izin AWS KMS. Untuk informasi selengkapnya, lihat Izin IAM diperlukan untuk ECS Exec.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "kms-key-arn" } ] }

Untuk data yang akan dienkripsi menggunakan kunci KMS Anda sendiri, pengguna atau grup yang menggunakanexecute-command tindakan tersebut harus diberikankms:GenerateDataKey izin.

Kebijakan contoh berikut untuk pengguna atau grup berisi izin yang diperlukan untuk menggunakan kunci KMS Anda sendiri. Anda harus menentukan Amazon Resource Name (ARN) pada kunci KMS Anda.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:GenerateDataKey" ], "Resource": "kms-key-arn" } ] }

Menggunakan kebijakan IAM untuk membatasi akses ke ECS Exec

Anda dapat membatasi akses pengguna ke tindakan API perintah eksekusi dengan menggunakan satu atau beberapa langkah kunci ketentuan kebijakan IAM berikut:

  • aws:ResourceTag/clusterTagKey

  • ecs:ResourceTag/clusterTagKey

  • aws:ResourceTag/taskTagKey

  • ecs:ResourceTag/taskTagKey

  • ecs:container-name

  • ecs:cluster

  • ecs:task

  • ecs:enable-execute-command

Dengan kebijakan IAM contoh berikut, pengguna dapat menjalankan perintah dalam kontainer yang berjalan dalam tugas dengan tanda yang memilikienvironment kunci dandevelopment nilai kunci dan klaster yang bernama klaster yang bernamacluster-name.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:ExecuteCommand", "ecs:DescribeTasks" ], "Resource": "arn:aws:ecs:region:aws-account-id:task/cluster-name/*", "Condition": { "StringEquals": { "ecs:ResourceTag/environment": "development" } } } ] }

Dengan contoh kebijakan IAM berikut, pengguna tidak dapat menggunakanexecute-command API ketika nama kontainerproduction-app.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ecs:ExecuteCommand" ], "Resource": "*", "Condition": { "StringEquals": { "ecs:container-name": "production-app" } } } ] }

Dengan kebijakan IAM berikut, pengguna hanya dapat meluncurkan tugas ketika ECS Exec dimatikan.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunTask", "ecs:StartTask", "ecs:CreateService", "ecs:UpdateService" ], "Resource": "*", "Condition": { "StringEquals": { "ecs:enable-execute-command": "false" } } } ] }
catatan

Karena tindakan API execute-command hanya berisi sumber daya tugas dan klaster dalam sebuah permintaan, maka yang dievaluasi adalah tanda klaster dan tugas.

Untuk informasi selengkapnya tentang kunci ketentuan kebijakan IAM, lihat Tindakan sumber daya, dan kunci syarat untuk Amazon Elastic Container Service dalam Referensi Otorisasi Layanan.

Membatasi akses ke tindakan Memulai Sesi

Saat memulai sesi SSM pada kontainer Anda di luar ECS Exec memungkinkan, hal ini berpotensi mengakibatkan sesi menjadi tidak dicatat. Sesi yang dimulai di luar ECS Exec juga dihitung terhadap kuota sesi. Kami merekomendasikan untuk membatasi akses ini dengan menolakssm:start-session tindakan secara langsung untuk tugas Amazon ECS Anda menggunakan kebijakan IAM. Anda dapat menolak akses ke semua tugas Amazon ECS atau tugas tertentu berdasarkan tag yang digunakan.

Berikut ini adalah contoh kebijakan IAM yang menolak akses kessm:start-session tindakan untuk tugas-tugas di semua Wilayah dengan nama klaster tertentu. Anda dapat menyertakan wildcard dengan cluster-name secara opsional.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ssm:StartSession", "Resource": "arn:aws:ecs:*:111122223333:task/cluster-name/*" } ] }

Berikut ini adalah kebijakan IAM contoh yang menolak akses kessm:start-session tindakan sumber daya di semua Wilayah yang ditandai dengan kunci tanda tandaTask-Tag-Key dan nilai tanda tandaExec-Task.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ssm:StartSession", "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/Task-Tag-Key": "Exec-Task" } } } ] }

Pemecahan masalah dengan ECS Exec

Berikut ini adalah catatan pemecahan masalah untuk membantu mendiagnosis mengapa Anda mungkin mendapatkan kesalahan saat menggunakan ECS Exec.

Verifikasi menggunakan Amazon ECS Exec Checker

Skrip Pemeriksa Amazon ECS Exec menyediakan cara untuk memverifikasi dan memvalidasi bahwa klaster Amazon ECS Anda telah memenuhi prasyarat untuk menggunakan fitur ECS Exec. Skrip Exec Checker memverifikasiAWS CLI lingkungan dan klaster dan tugas Anda siap untuk ECS Exec, dengan memanggil berbagai API atas nama Anda. Alat ini memerlukan versi terbaru AWS CLI dan jq tersedia. Untuk informasi selengkapnya, lihat Amazon ECS Exec Checker aktif GitHub.

Terjadi kesalahan saat memanggil execute-command

Jika terjadi kesalahan The execute command failed, berikut ini kemungkinan penyebabnya.

  • Tugas tidak memiliki izin yang diperlukan. Verifikasi bahwa ketentuan tugas yang digunakan untuk meluncurkan tugas Anda memiliki peran IAM tugas yang ditentukan dan bahwa peran tersebut memiliki izin yang diperlukan. Untuk informasi selengkapnya, lihat Izin IAM diperlukan untuk ECS Exec.

  • Agen SSM tidak diinstal atau tidak berjalan

  • Ada antarmuka Amazon VPC endpoint untuk Amazon ECS, tetapi tidak ada satu untuk Manajer Sesi Systems Manager