boto3 ไม่ทำงานในขั้นตอนการสร้าง TeamCity เมื่อทำงานในขั้นตอนการสร้างคอนเทนเนอร์บนเอเจนต์การสร้างคอนเทนเนอร์

ระบบการสร้างของเราใช้เอเจนต์การสร้าง TeamCity แบบคอนเทนเนอร์ ขั้นตอนการสร้างบางขั้นตอนใช้ boto3 และเพื่อหลีกเลี่ยงการปรับแต่งอิมเมจเอเจนต์การสร้าง TeamCity ฐานให้มี boto3 เราจะใช้ฟีเจอร์ "เรียกใช้ขั้นตอนภายในคอนเทนเนอร์ Docker" ของ TeamCity แทนเพื่อระบุอิมเมจ Python ซึ่งมี boto3 และโมดูล Python อื่นๆ มากมาย ติดตั้งแล้ว

เมื่อรันขั้นตอนการสร้าง boto3 เกิดข้อผิดพลาดเนื่องจากขาดสิทธิ์ โดยมีข้อผิดพลาดดังนี้:

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

build agent ทำงานใน AWS โดยมี "บทบาทงาน" ซึ่งมีสิทธิ์เพียงพอ แล้วเหตุใดจึงไม่ทำงาน


person tul    schedule 11.05.2018    source แหล่งที่มา


คำตอบ (1)


Boto3 จะพยายามตรวจสอบสิทธิ์โดยอัตโนมัติโดยใช้บทบาท IAM ที่ตั้งค่าบนคอนเทนเนอร์ผ่านคำจำกัดความงาน ECS และหากล้มเหลวก็จะกลับไปใช้บทบาท IAM ที่เชื่อมโยงกับโฮสต์ EC2 ซึ่งใช้งานคอนเทนเนอร์อยู่

คุณสามารถดูว่าบทบาท IAM ใดที่ใช้งานอยู่ในแต่ละบทบาทได้โดยการเพิ่มคำสั่งต่อไปนี้ในขั้นตอนการสร้าง:

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

คำสั่ง curl เหล่านี้จะดึงบทบาท IAM ปัจจุบันจากข้อมูลเมตา EC2 แล้วดึงจากข้อมูลเมตาของคอนเทนเนอร์ env var AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ได้รับการตั้งค่าโดยอัตโนมัติสำหรับคอนเทนเนอร์ที่ทำงานภายใต้ ECS

หากคุณรันคำสั่งเหล่านี้ในขั้นตอนการ build ที่ไม่มีคอนเทนเนอร์ คำสั่งจะส่งออกบทบาททั้งสอง หากคุณต้องเรียกใช้ boto3 ในลักษณะเดียวกัน ระบบจะเลือกใช้บทบาทของคอนเทนเนอร์หากพบ จากนั้นจึงเลือกใช้บทบาท EC2 แทน

ตอนนี้ทำเครื่องหมายที่ "เรียกใช้ขั้นตอนภายในคอนเทนเนอร์ Docker" และระบุอิมเมจพื้นฐานที่กำหนดเอง เช่น library/python:2.7.15-stretch

ในครั้งนี้ คุณจะเห็นว่าบทบาท EC2 IAM เดียวกันถูกส่งออก แต่ไม่ได้ตั้งค่า AWS_CONTAINER_CREDENTIALS_RELATIVE_URI env var ดังนั้นจึงไม่พบบทบาท IAM ของคอนเทนเนอร์ เราต้องการบทบาท IAM ที่กำหนดไว้ในเอเจนต์การสร้าง TeamCity

ในกรณีของเรา เนื่องจาก boto3 ไม่พบบทบาท ECS IAM จึงกลับไปเป็นบทบาท EC2 IAM และบทบาทนั้นไม่มีสิทธิ์เพียงพอที่จะดำเนินการ Boto ดังนั้นจึงล้มเหลว

การแก้ไข

การแก้ไขคือการใช้ "อาร์กิวเมนต์การเรียกใช้นักเทียบท่าเพิ่มเติม:" เพื่อส่งต่อ env var จากคอนเทนเนอร์นักเทียบท่า TeamCity ไปยังคอนเทนเนอร์นักเทียบท่าที่รันเพื่อดำเนินการขั้นตอนการสร้าง แก้ไขขั้นตอนการ build ที่มีคำสั่ง test เพื่อให้มี:

-e AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

ตอนนี้คอนเทนเนอร์ขั้นตอนการ build จะสืบทอดบทบาท IAM ของคอนเทนเนอร์ของคอนเทนเนอร์ build agent อย่างถูกต้อง และ boto3 จะทำงานตามที่คาดไว้

person tul    schedule 11.05.2018