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