Amazon ECS μ‘°κΈ λ μμ보기
Amazon ECS μ λν΄μ μ‘°κΈ λ μμ보λλ‘ νμ.
νμ€ν¬ awsvpc λ€νΈμν¬ λͺ¨λμ νλ ₯μ λ€νΈμν¬ μΈν°νμ΄μ€(ENI)
Fargateμ EC2 μΈμ€ν΄μ€ λͺ¨λ awsvpc λ€νΈμν¬ λͺ¨λμμλ νλΌμ΄λΉ IP μ£Όμκ° ENIλ‘ ν λΉλλ€. μΈμ€ν΄μ€ μ νμ λ°λΌ μ΅λ ENI ν λΉ κ°μκ° μ νλλ―λ‘ μ£Όμν΄μΌνλ€. μ΄λ, ECS μλΉμ€ κ³μ μ€μ μμ awsVpcTrunkingλ₯Ό νμ±ννλ κ²½μ° EC2 μΈμ€ν΄μ€μμ μ¬μ©ν μ μλ ENI κ°μ μ νμ΄ λμ΄λλ€.
aws ec2 describe-instance-types \
--filters "Name=instance-type,Values=c6g.*" \
--query "InstanceTypes[].{ \
Type: InstanceType, \
MaxENI: NetworkInfo.MaximumNetworkInterfaces, \
IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" \
--output table
----------------------------------------
| DescribeInstanceTypes |
+----------+----------+----------------+
| IPv4addr | MaxENI | Type |
+----------+----------+----------------+
| 50 | 15 | c6g.16xlarge |
| 10 | 3 | c6g.large |
| 15 | 4 | c6g.xlarge |
| 30 | 8 | c6g.12xlarge |
| 4 | 2 | c6g.medium |
| 50 | 15 | c6g.metal |
| 30 | 8 | c6g.8xlarge |
| 30 | 8 | c6g.4xlarge |
| 15 | 4 | c6g.2xlarge |
+----------+----------+----------------+
EC2 μΈμ€ν΄μ€μ λ€λ₯΄κ² Fargate μμλ ENI νμ₯μ μ§μνμ§ μμ΅λλ€.
νμ€ν¬ bridge λ€νΈμν¬ λͺ¨λμ λμ ν¬νΈ 맀ν
Amazon ECS 곡μ λ¬Έμμμλ EC2 μΈμ€ν΄μ€μμλ awsvpc λ€νΈμν¬ λͺ¨λλ₯Ό κΆμ₯ν©λλ€. EC2 μΈμ€ν΄μ€μ bridge λ€νΈμν¬ λͺ¨λμμλ νΈμ€νΈ ν¬νΈλ₯Ό μ§μ νμ§ μλλ‘ νμ¬ λμ ν¬νΈ 맀ν(Dynamic port mapping)μ΄ κ°λ₯νλ―λ‘ λμΌν ν¬νΈλ₯Ό μ¬μ©νλ μλ‘ λ€λ₯Έ μ ν리μΌμ΄μ μ μ΄μνλλ° λμμ΄ λ κ² κ°λ€.
λμ 맀νμ ꡬμ±νλ €λ κ²½μ° EC2 μΈμ€ν΄μ€κ° κ°μ§λ 보μ κ·Έλ£Ήμ΄ μμ ν¬νΈ λ²μ(49153-65535 μ 32768-61000)μ λν μΈλ°μ΄λ νΈλν½μ νμ©ν΄μΌ ν©λλ€.
μ ν¨μ€ νμ΄νλΌμΈκ³Ό AWS ECR νλ¬κ·ΈμΈ
Amazon ECR νλΌμ΄λΉ 리νμ§ν λ¦¬λ‘ μ΄λ―Έμ§λ₯Ό νΈμν μ μλ IAM κΆνμ λ§λ€κ±°λ EC2InstanceProfileForImageBuilderECRContainerBuilds μ μ± μ κ°μ§λ IAM μ¬μ©μλ₯Ό λ§λ€λ©΄ μ ν¨μ€μμ Amazon ECR 리νμ§ν λ¦¬λ‘ λΉλλ μ΄λ―Έμ§λ₯Ό νΈμν μ μλ€.
μ ν¨μ€ μλ²μ AWS CLIλ₯Ό μ€μΉν΄λ λμ§λ§ 컨ν μ΄λ κΈ°λ°μ inbound-agent λλ Cloud λ‘ docker-agent λ‘ λΉλ νμ΄νλΌμΈμ μννλ κ²½μ° aws-cli κ° μ€μΉλμ§ μμ μνμΌ μ μλ€. λ°λΌμ, AWS Credentails νλ¬κ·ΈμΈκ³Ό ν¨κ» Amazon ECR νλ¬κ·ΈμΈμ μ¬μ©νμ¬ ECR 리νμ§ν λ¦¬λ‘ μ΄λ―Έμ§λ₯Ό νΈμνλ νμ΄νλΌμΈμ μμ±νλ κ²μ κΆμ₯νλ€.
λ€μμ μ ν¨μ€ νμ΄νλΌμΈ μμ±μ λν μμμ΄λ€.
pipeline {
agent {
label 'docker-agent'
}
tools {
jdk "JDK17"
}
properties {
string(name: 'buildTag', defaultValue: 'latest', description: 'build version')
}
environment {
registry = 'xxxxx.dkr.ecr.ap-northeast-2.amazonaws.com'
repository = 'xxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/sample-app'
registryCredential = 'mambo-ecr-builder'
registryRegion = 'ap-northeast-2' // seoul
buildImage = ''
JAVA_HOME = "tool JDK17"
}
stages {
stage('Prepare') {
steps {
echo 'Cloning Repository'
git branch: 'main',
credentialsId: 'jenkins-git-token',
url: 'https://github.com/xxx/ecs-demo.git'
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Build Gradle') {
steps {
echo 'Build Gradle'
dir('./sample-app'){
sh '''
pwd
chmod +x ./gradlew
./gradlew build ecsbuild
'''
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Build image') {
steps {
dir('./sample-app') {
script {
buildImage = docker.build("sample-app:${buildTag}", "--build-arg BUILD_VERSION=${buildTag} .")
}
}
}
}
stage('Push image') {
steps {
script {
// sh 'docker images'
docker.withRegistry("https://${registry}", "ecr:${registryRegion}:${registryCredential}") {
buildImage.push()
}
}
}
}
stage('Cleanup docker image') {
steps {
script {
sh '''
docker rmi sample-app:latest
docker rmi $repository:$buildTag
'''
}
}
}
}
}
λ§μ½, μ ν¨μ€ νμ΄νλΌμΈμμ ERROR: could not find credentials matching ecr:ap-northeast2:aws_credential_id μ κ°μ μ€λ₯κ° λλ€λ©΄ μ ν¨μ€μ Amazon ECR νλ¬κ·ΈμΈμ μ€μΉνλμ§ νμΈνμκΈ° λ°λλλ€.
Amazon ECS μ μΈν°νμ΄μ€ VPC μλν¬μΈνΈ
μ€ννΈμ μμ§λμ΄μ AWS λΉμ© μ΅μ ν κ²½νκΈ°μ²λΌ λ°λΈμ΅μ€ μμ§λμ΄μκ²λ Amazon ECSμ λν μκΈ μ κ°μ μ€μν λΆλΆμ ν΄λΉλ μ μλ€. Amazon ECS 곡μ λ¬Έμμμλ Amazon ECS κ΄λ ¨ μΈν°νμ΄μ€ VPC μλν¬μΈνΈ(PrivateLink)λ₯Ό μ¬μ©νλ©΄ νΌλΈλ¦ μλν¬μΈνΈλ‘μ μμ²μ μν΄ μΈν°λ· κ²μ΄νΈμ¨μ΄ λλ NAT κ²μ΄νΈμ¨μ΄μ λν λΉμ©μ μ κ°ν μ μλ€κ³ μλ΄νλ€. κ·Έλ¬λ, μΈν°νμ΄μ€ VPC μλν¬μΈνΈλ μ€μν λΆλΆμ΄ μλλ° Private Linkλ μλΈλ·λ§λ€ ENIλ₯Ό ν λΉνλ―λ‘ μλΈλ· κ°μλ§νΌ μκ° μκΈμ΄ λΆκ°λλ€λ κ²μ΄λ€.
λ°λΌμ, ECSμ ECS Agent 컨ν μ΄λ λλ μλΉμ€ μ°κ²°μ μν Envoy μ¬μ΄λμΉ΄ 컨ν μ΄λ λ±μμ CloudWatch Logs VPC μλν¬μΈνΈλ‘μ μμ²μ΄λ μ¬λ¬κ°μ§ λͺ¨λν°λ§μ μν μ¬μ΄λμΉ΄ 컨ν μ΄λλ‘ μΈν΄ NAT κ²μ΄νΈμ¨μ΄μ λν μκΈμ΄ λ§μ΄ λ°μνλ νΈλν½ κ·λͺ¨κ° μλλΌλ©΄ Amazon ECSμ ν¨κ» NAT κ²μ΄νΈμ¨μ΄λ₯Ό μ¬μ©νλκ² λ μ ν©ν μ μλ€.