kashinoki38 blog

something like tech blog

ECS Fargate で strace してみる

ECS Fargate で strace してみた記事。

Fargate PV 1.4.0 から strace できます

Fargate では PV 1.4.0 から strace が実行できるように、 CAP_SYS_PTRACE のサポートが入っている。

aws.amazon.com

Fargate タスクが CAP_SYS_PTRACE Linux 機能のサポートを開始
...
たとえば、お客様の一部は、strace などのツールを実行する必要があると表明しています。

CAP_SYS_PTRACE をタスク定義で追加する

タスク定義のJSONで追加できるオプション linuxParameters として capabilities として SYS_PTRACE を追加する。
https://docs.aws.amazon.com/AmazonECS/latest/userguide/task_definition_parameters.html#container_definition_linuxparameters

            "linuxParameters": {
                "capabilities": {
                    "add": [
                        "SYS_PTRACE"
                    ],
                    "drop": null
                }
            },

やってみる

Nginx のタスク追加してみて、ECS Execで入ってstraceしてみた。

SYS_PTRACEなし

❯❯❯ aws ecs execute-command --cluster test --task xxxxxxxxxxxxxxxxx --interactive --command /bin/bash
root@ip-172-31-24-236:/# strace nginx
strace: test_ptrace_get_syscall_info: PTRACE_TRACEME: Operation not permitted
strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted
+++ exited with 1 +++

SYS_PTRACEあり

❯❯❯ aws ecs execute-command --cluster test --task xxxxxxxxxxxxxxxxx --interactive --command /bin/bash
root@ip-172-31-2-221:/# strace nginx
execve("/usr/sbin/nginx", ["nginx"], 0x7fff4092db70 /* 18 vars */) = 0
brk(NULL)                               = 0x559407f87000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=16186, ...}) = 0
mmap(NULL, 16186, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9c1b26e000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\21\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14592, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9c1b26c000
mmap(NULL, 16656, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9c1b267000
mmap(0x7f9c1b268000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7f9c1b268000
mmap(0x7f9c1b269000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f9c1b269000
mmap(0x7f9c1b26a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f9c1b26a000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@l\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=146968, ...}) = 0
mmap(NULL, 132288, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9c1b246000
mmap(0x7f9c1b24c000, 61440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f9c1b24c000
mmap(0x7f9c1b25b000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7f9c1b25b000
mmap(0x7f9c1b261000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a000) = 0x7f9c1b261000
mmap(0x7f9c1b263000, 13504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f9c1b263000
close(3)

でけた。