AWS Instance Creation Tip - yunkon-kim/test-on-github-actions GitHub Wiki

AWS Go SDKλ₯Ό ν™œμš©ν•œ μΈμŠ€ν„΄μŠ€(VM) 생성 팁

  • AWS: Amazon Web Service
  • SDK: Software Development Kit

λ³Έ κ°€μ΄λ“œλŠ” AWS Go SDKλ₯Ό ν™œμš©ν•˜μ—¬ ν”„λ‘œκ·Έλž˜λ°μ„ ν†΅ν•œ VM 생성 방법 및 과정을 μ„€λͺ…ν•©λ‹ˆλ‹€. 처음 μ ‘ν•˜μ‹œλŠ” λΆ„λ“€κ»˜ μ‘°κΈˆμ΄λ‚˜λ§ˆ 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.

AWS Management Console 쀀비사항

[쀀비사항 1 - IAM μ‚¬μš©μž 등둝]

AWS Go SDKλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ "ν”„λ‘œκ·Έλž˜λ° 방식 μ•‘μ„ΈμŠ€"κ°€ κ°€λŠ₯ν•œ μ‚¬μš©μžλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. μΈμ¦λ˜μ§€ μ•Šμ€ μ‚¬μš©μžκ°€ AWS SDKλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€λ©΄ λ¬Έμ œκ°€ λ˜κ² μ§€μš”? κ·Έλž˜μ„œ AWSμ—μ„œ μ œκ³΅ν•˜λŠ” Identity and Access Management (IAM) μ„œλΉ„μŠ€μ—μ„œ μ‚¬μš©μžλ₯Ό λ“±λ‘ν•˜μ—¬ μ•‘μ„ΈμŠ€ ν‚€ ID (Access key ID) 와 λΉ„λ°€ μ—‘μ„ΈμŠ€ ν‚€ (Secrect access key) λ₯Ό ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν™œμ„±ν™” ν•˜λŠ” 방법은 μ•„λž˜λ₯Ό μ°Έκ³ ν•˜μ‹œκ³ , μƒμ„±λœ Credentials은 μž μ‹œν›„μ— ν•„μš”ν•©λ‹ˆλ‹€. :)

  1. AWS Management Console에 μ ‘μ†ν•˜μ—¬ 둜그인
  2. μ„œλΉ„μŠ€ μ°ΎκΈ°μ—μ„œ IAM (Identity and Access Management)을 κ²€μƒ‰ν•˜μ—¬ 접속
  3. [AWS] IAM μ‚¬μš©μž 좔가와 aws cli 섀정을 μ°Έμ‘°ν•˜μ—¬ μ‚¬μš©μž 생성
  4. μƒμ„±λœ Credentials(e.g. new_user_credentials.csv)λ₯Ό λ‹€μš΄λ‘œλ“œ

[쀀비사항 2 - ν‚€ νŽ˜μ–΄ 생성]

λ˜ν•œ, AWS Go SDKλ₯Ό μ‚¬μš©ν•΄μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ ν›„ SSH둜 μ ‘μ†ν•˜κΈ° μœ„ν•΄μ„œ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ— λΆ€μ—¬ν•  Key Pair λ₯Ό μƒμ„±ν•΄μ•Όν•©λ‹ˆλ‹€.

KeyPair 생성 방법은 μ•„λž˜λ₯Ό μ°Έκ³ ν•˜μ„Έμš” :)

  1. AWS Management Console에 μ ‘μ†ν•˜μ—¬ 둜그인
  2. μ„œλΉ„μŠ€ μ°ΎκΈ°μ—μ„œ EC2 (Elastic Compute Cloud)을 κ²€μƒ‰ν•˜μ—¬ 접속
  3. 쒌츑 λ©”λ‰΄μ—μ„œ "λ„€νŠΈμ›Œν¬ 및 λ³΄μ•ˆ"ν•˜μœ„ ν•­λͺ©μΈ "ν‚€ νŽ˜μ–΄"λ₯Ό 선택
  4. 우츑 상단에 "ν‚€ νŽ˜μ–΄ 생성" 클릭
  5. ν‚€ νŽ˜μ–΄ 이름을 μž…λ ₯ν•˜κ³ , 파일 ν˜•μ‹μ„ μ„ νƒν•œ ν›„ "ν‚€ νŽ˜μ–΄ 생성" 클릭 (μ €λŠ” PuTTYλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— ppk ν˜•μ‹μ„ 선택 ν–ˆμŠ΅λ‹ˆλ‹€. Linux μ‚¬μš©μžλŠ” pem ν˜•μ‹μ„ μ„ νƒν•˜μ„Έμš”.)

AWS Go SDKλ₯Ό ν™œμš©ν•œ μΈμŠ€ν„΄μŠ€ 생성 예제

μΈμŠ€ν„΄μŠ€ 생성 μ˜ˆμ œλŠ” Cloud-Barista Go Testλ₯Ό 기반으둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. Go 개발 ν™˜κ²½ 및 Test와 Echo 기반 REST μ„œλΉ„μŠ€ μ‹œν—˜μ„ 톡해 Go ν™˜κ²½μ„ ꡬ성 및 ν•„μš” νŒ¨ν‚€μ§€ μΆ”κ°€ ν›„ μ›ν™œν•œ 예제 진행이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

1. AWS SDK for Go μ„€μΉ˜

$ go get github.com/aws/aws-sdk-go

2. Create credentials file, [쀀비사항 1]의 μ‚¬μš©μž Credential ν•„μš”

$ mkdir $HOME/.aws
$ vim $HOME/.aws/credentials

Credentials (from new_user_credentials.csv)

[default]
aws_access_key_id = <YOUR_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>

3. Create an instance by programming, [쀀비사항 2]의 ν‚€ νŽ˜μ–΄ ν•„μš”

예제 λ‹€μš΄λ‘œλ“œ

$ go get github.com/powerkimhub/go-test
$ cd $GOPATH/src/github.com/powerkimhub/go-test/ec2_test

[μ€‘μš”??!!!] μ•„λž˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 AWSμ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μ•„λž˜μ—μ„œ μ‚¬μš©ν•˜λŠ” Region, ImageId, InstanceType, KeyName, SecurityGroupId, SubnetIdλ₯Ό μ°Έκ³ ν•˜λ©΄ 보닀 μ‰½κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œμ˜ <YOUR_KEY_NAME> 뢀뢄에 ν‚€ 이름을 μž…λ ₯ν•˜μ„Έμš” :)

package main

import (
    // import aws go sdk
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/ec2"
    // import logger
    "github.com/sirupsen/logrus"
    "github.com/cloud-barista/cb-log"

    // import formatted I/O (e.g., fmt.Println(xxx))
    "fmt"
)

var logger *logrus.Logger
func init(){
        // cblog is a global variable.
        logger = cblog.GetLogger("CB-Contribution")
}

func main() {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-2")}, // ohio region
        // Region: aws.String("ap-northeast-2")}, // seoul region.
    )

    // Create EC2 service client
    svc := ec2.New(sess)

    // Specify the details of the instance that you want to create.
    runResult, err := svc.RunInstances(&ec2.RunInstancesInput{
        // An Amazon Linux AMI ID for t2.micro instances in the us-west-2 region
        // ImageId:      aws.String("ami-e7527ed7"),
        ImageId:      aws.String("ami-0bbe28eb2173f6167"),
        InstanceType: aws.String("t2.micro"),
        MinCount:     aws.Int64(1),
        MaxCount:     aws.Int64(1),
        KeyName:      aws.String("<YOUR_KEY_NAME>"),  // add keypair.
        SecurityGroupIds:      []*string{
                        aws.String("sg-00d75d1ab4f3fd997"),
                                        },                 // add security group.
        SubnetId: aws.String("subnet-969e9fec"),           // add subnet.
    })

    if err != nil {
        logger.Error("Could not create instance", err)
        return
    }

    fmt.Println("Created instance", *runResult.Instances[0].InstanceId)

    // Add tags to the created instance
    _, errtag := svc.CreateTags(&ec2.CreateTagsInput{
        Resources: []*string{runResult.Instances[0].InstanceId},
        Tags: []*ec2.Tag{
            {
                Key:   aws.String("Name"),
                Value: aws.String("VM-Alvin"),
            },
        },
    })
    if errtag != nil {
        logger.Error("Could not create tags for instance", runResult.Instances[0].InstanceId, errtag)
        return
    }

    logger.Info("Successfully tagged instance")
}
⚠️ **GitHub.com Fallback** ⚠️