====== Jenkins AWS Plugins ====== * [[https://plugins.jenkins.io/pipeline-aws|Pipeline AWS]] * [[https://plugins.jenkins.io/s3|S3 Publisher]] ===== AWS Credentials Plugin ===== * [[https://www.youtube.com/watch?v=iiF2iQV-3eM&list=WL&index=4| How to Integrate Jenkins With AWS - YouTube]] * [[https://plugins.jenkins.io/aws-secrets-manager-credentials-provider/|AWS Secrets Manager Credentials Provider | Jenkins plugin]] * https://github.com/jenkinsci/aws-credentials-plugin * AWS Credential 환경변수 자동 주입. ===== EC2 Fleet ===== * [[https://plugins.jenkins.io/ec2-fleet/|EC2 Fleet | Jenkins plugin]] : 제일 나은 방법같음. * [[ci:jenkins:agent|Jenkins Agent ( slave )]] 자동 확장. * [[https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html|AWS Spot Fleet]] 혹은 [[https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/AutoScalingGroup.html|Auto Scaling Group]] 사용 가능. * **Autoscaling Group이나, Spot Request 자체에 EC2 인스턴스의 각종 설정을 미리 넣어둘 수 있어서 Jenkins 쪽에서 불필요한 Role을 가질 필요가 없음.** * **Spot Instance를 사용하지 말 것** : Job 실행중에 갑자기 종료될 수 있음. * [[https://aws.amazon.com/ko/blogs/compute/cost-optimize-your-jenkins-ci-cd-pipelines-using-ec2-spot-instances/|Cost Optimize your Jenkins CI/CD pipelines using EC2 Spot Instances | AWS Compute Blog]] * [[https://www.youtube.com/watch?v=8gGItacZjps|Did You Know That There Is an Amazon EC2 Spot Fleet Plugin for Jenkins? - YouTube]] * **Required Role** : ''AmazonEC2SpotFleetTaggingRole''(Spot Request 사용시에만), ''AmazonEC2ReadOnlyAccess'' ===== ECS/Fargate ===== * [[ci:jenkins:agent|Jenkins Agent ( slave )]]에서 더 자세히 정리. * [[https://plugins.jenkins.io/amazon-ecs/|Amazon Elastic Container Service (ECS) / Fargate | Jenkins plugin]] * [[https://www.jenkins.io/doc/pipeline/steps/amazon-ecs/|Amazon Elastic Container Service (ECS) / Fargate plugin]] * [[https://www.youtube.com/watch?v=UU4-TB7vR8s|Using Jenkins and Docker Compose to Deploy to Amazon ECS - YouTube]] * [[https://www.youtube.com/watch?v=K2CBHLwPL50|Run Jenkins Pipeline With AWS ECS Fargate & AWS EC2 Based ECS Cluster | Learn DevOps Tools Ep4 - YouTube]] : Fargate를 Slave Agent 로 사용하기 * [[https://aws.amazon.com/ko/blogs/devops/building-a-serverless-jenkins-environment-on-aws-fargate/|Building a serverless Jenkins environment on AWS Fargate | AWS DevOps Blog]] * [[https://github.com/aws-samples/serverless-jenkins-on-aws-fargate/tree/main/docs|aws-samples/serverless-jenkins-on-aws-fargate]] * [[https://hub.docker.com/r/jenkins/inbound-agent/|Docker jenkins/inbound-agent]] : java 버전별로 찾을 수 있다. docker & fargate 용. 이 이미지를 기준으로 fargate task 생성. 이 이미지를 확장하여 자신만의 slave agent docker image 를 만들것. * Fargate docker 이미지를 private repo 에서 가져올 수 있는 권한 설정 필요. * [[https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/private-auth.html|태스크에 대한 프라이빗 레지스트리 인증 - Amazon Elastic Container Service]] * [[https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_on_ECS.html|Using Amazon ECR images with Amazon ECS - Amazon ECR]] * Fargate 태스크에 AWS Role 을 지정할 수 있는 Role 필요. * [[https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html|IAM Roles for Tasks - Amazon ECS]] * Fargate 가 생각보다 빠르지 못한듯 하다. (TODO: 혹시 docker image를 외부에서 끌어올 경우? 내부로 변경하면?) * [[https://tomgregory.com/jenkins-jobs-in-aws-ecs-with-slave-agents/|Running Jenkins jobs in AWS ECS with slave agents – Tom Gregory]] ===== ec2 plugin ===== * [[https://plugins.jenkins.io/ec2/|Amazon EC2 | Jenkins plugin]] * [[ci:jenkins:agent|Jenkins Agent ( slave )]] 자동 확장 * **Jenkins Master** 에대한 IAM Role : ''EC2FullAccess'' 가 있어야 Slave Agent EC2를 생성할 수 있다. 또한, ''iam:PassRole''도 필요한데, 아래부분 참조. * **Security Group, Subnet** : Slave EC2에 지정할 SG, Subnet. 이름이 아니라 **ID**로 입력해야한다. 쉼표로 구분. 당연히 Master 에서 SSH 접근 가능한 SG와 Subnet 이어야 한다. * **EC2 Key Pair's Private Key(Agent EC2 접속 SSH Private Key)**: AWS 에 등록된 pem private Key 를 Jenkins Credential 로 등록하면, master 가 agent EC2 생성시 자동으로 private key 에 맞는 키로 등록해준다. * Agent 용 AMI 는 JDK 가 깔려있고 PATH가 걸려있는게 좋다. 안그러면 JDK 설치까지도 EC2 Plugin 이 수행한다. * **Remote FS root** : Amazon Linux 는 ''/home/ec2-user''. 배포판마다 적절히 지정 * **Remote user** : Amazon linux 는 ''ec2-user''. 배포판마다 적절히 지정. * **Minimum number of instances** : 최소 유지 agent 갯수 * **Minimum number of spare instances** : 사용중인 agent 들에 더해서 추가로 상시 유지할 인스턴스. 즉 최소유지가 1개이고 최소 spare가 2개이면 첫번째 agent 노드에 job 이돌면 spare 2개가 더 뜨게된다. * **Instance Cap** : 최대 Agent 인스턴스 갯수. 무한정 agent 가 늘어나는 것을 방지. 지정 AMI에만 해당하는 설정임. * **Launch Timeout in seconds** : SSH 접속 최대 대기시간(초), 빈값,0 이면 무한정 대기 * **Host Key Verification Strategy** : ''off''면 ''no''. 신규 AMI들은 ''check-new-hard''로 하는게 좋음(신규 AMI는 콘솔에 host key를 출력함). 단, ''check-new-hard'', ''check-new-soft''는 EC2 인스턴스의 콘솔이 뜨면 콘솔에 뜬 값과 SSH키 값을 대조한다고 함. 그래서 콘솔 뜨기까지 launch timeout 을 길게 잡아야 한다. 뜨는데 오래걸림. * **IAM Instance Profile** : Slave Agent EC2 인스턴스에 IAM Role을 지정하려면 IAM instance profile ARN을 지정해줘야한다. * Slave EC2에 지정되길 원하는 IAM Role 의 Summary 화면에서 **Instance Profile ARNs**에 있는 ''arn:aws:iam::**instance-profile**/'' 형태의 값을 해당 설정에 넣어주면된다. {{:ci:jenkins:iam-role-instance-profile.png|}} * 또한 Master 자체에 ''iam:PassRole'' 이 있어야 한다. Jenkins Master IAM Role 에 다음 정책추가필요. { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam:::role/원하는Role" # 여기는 Role }] } # 혹시 필요하면, "iam:ListInstanceProfilesForRole"도 함께. ==== EC2 Plugin 참조 ==== * [[https://www.iseatz.com/blog/ec2-plugin-jenkins-automatically-provision|Using the EC2 plugin for Jenkins to automatically provision for Amazon Web Services]] * [[https://www.youtube.com/watch?v=dAa3u39RYpM|[ AWS 23 ] Launch AWS EC2 instances as Jenkins Slaves using EC2 plugin - YouTube]] * [[https://www.youtube.com/watch?v=1XI9_4umWVk|Jenkins Master to Launch AWS EC2 instances as Slaves using EC2 plugin - YouTube]] ===== ElasticBeansTalk Deployment ===== * [[aws:elasticbeanstalk|AWS ElasticBeansTalk]] * [[https://plugins.jenkins.io/aws-beanstalk-publisher-plugin|AWS BeansTalk Publisher Plugin]] : 이미 배포됐던 것을 다른 환경에 재배포하거나, Workspace에 있는 압축 파일을 S3 에 업로드하고 ElasticBeansTalk 배포를 자동으로 호출함. 이게 더 나은 듯. * [[https://plugins.jenkins.io/awseb-deployment-plugin|AWS Elastic Beanstalk Deployment]] : Workspace에 있는 파일을 압축하여 (혹은 압축된 파일을) S3 에 버전 붙여 업로드하고 ElasticBeansTalk 배포를 자동으로 호출하는 것까지 됨. ===== 참조 ===== * [[https://www.youtube.com/watch?v=iiF2iQV-3eM|How to Integrate Jenkins With AWS - YouTube]]