boto3 tidak berfungsi pada langkah pembangunan TeamCity saat berjalan dalam langkah pembangunan kontainer pada agen pembangunan kontainer

Sistem pembangunan kami menggunakan agen pembangunan TeamCity dalam container. Beberapa langkah pembangunan menggunakan boto3 dan untuk menghindari penyesuaian gambar agen pembangunan TeamCity dasar agar memiliki boto3, kami menggunakan fitur "Jalankan langkah dalam wadah Docker" TeamCity untuk menentukan gambar python yang memiliki boto3 dan banyak modul python lainnya dipasang.

Saat menjalankan langkah build, boto3 error karena kurangnya izin, dengan error seperti:

botocore.exceptions.ClientError: An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

Agen pembangunan berjalan di AWS dengan "Peran Tugas" yang memiliki izin yang memadai, jadi mengapa tidak berfungsi?


person tul    schedule 11.05.2018    source sumber


Jawaban (1)


Boto3 akan mencoba mengautentikasi secara otomatis menggunakan IAM role yang ditetapkan pada kontainer melalui ketentuan tugas ECS, dan jika gagal, Boto3 akan kembali menggunakan IAM role yang terkait dengan host EC2 yang menjalankan kontainer.

Anda dapat melihat IAM role mana yang aktif pada masing-masing peran dengan menambahkan perintah berikut ke langkah pembangunan:

echo "EC2 IAM role"
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
echo

echo "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI = $AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
curl http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

Perintah curl ini mengambil IAM role saat ini dari meta data EC2, lalu dari meta data container. Env var AWS_CONTAINER_CREDENTIALS_RELATIVE_URI disetel secara otomatis untuk container yang berjalan di bawah ECS.

Jika Anda menjalankan perintah ini dalam langkah build non-kontainer, kedua peran tersebut akan ditampilkan. Jika Anda menjalankan boto3 dengan cara yang sama, ia akan memilih peran container jika ditemukan, dan kemudian kembali ke peran EC2.

Sekarang centang "Jalankan langkah dalam wadah Docker" dan tentukan gambar dasar arbitrer seperti library/python:2.7.15-stretch.

Kali ini, Anda akan melihat bahwa IAM role EC2 yang sama dikeluarkan, tetapi AWS_CONTAINER_CREDENTIALS_RELATIVE_URI env var tidak disetel, sehingga tidak ada IAM role kontainer yang ditemukan. Kami menginginkan peran IAM yang telah ditetapkan pada agen pembangunan TeamCity.

Dalam kasus kami, karena boto3 tidak menemukan peran IAM ECS, peran tersebut kembali ke peran IAM EC2, dan peran tersebut tidak memiliki hak istimewa yang cukup untuk melakukan operasi boto, sehingga gagal.

Perbaikannya

Cara mengatasinya adalah dengan menggunakan "Argumen pengoperasian buruh pelabuhan tambahan:" untuk meneruskan env var dari kontainer buruh pelabuhan TeamCity ke dalam kontainer buruh pelabuhan yang dijalankannya untuk menjalankan langkah pembangunan. Edit langkah build yang berisi perintah pengujian untuk dimiliki:

-e AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

Sekarang kontainer langkah pembangunan akan dengan benar mewarisi peran IAM kontainer dari kontainer agen pembangunan dan boto3 akan berfungsi seperti yang diharapkan.

person tul    schedule 11.05.2018