2018. október 29., hétfő

Jenkins, CloudFormation, ECS - Hogy jussunk az az aktuális Amazon Linux-hoz

Az utóbbi időben leginkább docker-t reszelek az Amazon AWS-ben. Amikor egy ECS clustert építesz és EC2 gépeket használsz alatta, a virtuális gép LaunchConfiguration-ben meg kell adnod, hogy mi legyen az Ami image amiből a cluster node gépek készüljenek.
Ehhez az Amazon gyárt előreemésztett image-eket. Ezeket érdemes használni.
És a bökkenő itt jön. Ezek az image-ek pár havonta változnak, sőt az azonosítójuk más és más régiónként.
Az, hogy melyik az épp aktuálisan használandó darab, itt található:
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html
Jó pár hónap után, meguntam, hogy amikor változtatok a CloudFormation scripteken, mindíg kézzel át kell írni ezt a legfrissebbre.
Jobban körülnézve ez automatizálható. Itt írnak róla, hogyan lehet hozzájutni a friss image azonosítójához:
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html
Ezt gyorsan ki is próbáltam:


Ez ugye két egymásba ágyazott JSON amiből nekünk ki kéne vakarni az "image_id" paramétert, hogy a CloudFormation scriptünk paramétereként fel tudjuk használni.
Ez a Jenkins pipeline scriptben valahogy így néz ki:

node
{
withAWS(credentials: awsCred, region: awsRegion)
{
sh "aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/recommended --region ${p.region} --output json > AWSResponse.json"
}
def AWSResponse = readJSON file:'AWSResponse.json'
def ECSamiText = AWSResponse.Parameters[0].Value
def ECSamiJson = readJSON text: ECSamiText
def ECSamiId = ECSamiJson.image_id
echo ECSamiId
}

Az awsCred és az awsRegion paraméterek a pipeline paraméterekből jönnek. Az Ami ID-je az ECSamiId-ból használható a CloudFormation scriptünk paramétereként

Ahhoz, hogy ez működni tudjon a Jenkins-en kell a két következő plug-in:

  • Pipeline: AWS Steps
  • Pipeline Utility Steps

Nincsenek megjegyzések:

Megjegyzés küldése

Megjegyzés: Megjegyzéseket csak a blog tagjai írhatnak a blogba.