AWS Instance Creation Tip - yunkon-kim/test-on-github-actions GitHub Wiki
- AWS: Amazon Web Service
- SDK: Software Development Kit
λ³Έ κ°μ΄λλ AWS Go SDKλ₯Ό νμ©νμ¬ νλ‘κ·Έλλ°μ ν΅ν VM μμ± λ°©λ² λ° κ³Όμ μ μ€λͺ ν©λλ€. μ²μ μ νμλ λΆλ€κ» μ‘°κΈμ΄λλ§ λμμ΄ λκΈ°λ₯Ό λ°λλλ€.
[μ€λΉμ¬ν 1 - IAM μ¬μ©μ λ±λ‘]
AWS Go SDKλ₯Ό μ¬μ©νλ €λ©΄ "νλ‘κ·Έλλ° λ°©μ μ‘μΈμ€"κ° κ°λ₯ν μ¬μ©μλ₯Ό μΆκ°ν΄μΌ ν©λλ€. μΈμ¦λμ§ μμ μ¬μ©μκ° AWS SDKλ₯Ό μ¬μ©νμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ€λ©΄ λ¬Έμ κ° λκ² μ§μ? κ·Έλμ AWSμμ μ 곡νλ Identity and Access Management (IAM) μλΉμ€μμ μ¬μ©μλ₯Ό λ±λ‘νμ¬ μ‘μΈμ€ ν€ ID (Access key ID) μ λΉλ° μμΈμ€ ν€ (Secrect access key) λ₯Ό νμ±νν΄μΌ ν©λλ€.
νμ±ν νλ λ°©λ²μ μλλ₯Ό μ°Έκ³ νμκ³ , μμ±λ Credentialsμ μ μνμ νμν©λλ€. :)
- AWS Management Consoleμ μ μνμ¬ λ‘κ·ΈμΈ
- μλΉμ€ μ°ΎκΈ°μμ IAM (Identity and Access Management)μ κ²μνμ¬ μ μ
- [AWS] IAM μ¬μ©μ μΆκ°μ aws cli μ€μ μ μ°Έμ‘°νμ¬ μ¬μ©μ μμ±
- μμ±λ Credentials(e.g. new_user_credentials.csv)λ₯Ό λ€μ΄λ‘λ
[μ€λΉμ¬ν 2 - ν€ νμ΄ μμ±]
λν, AWS Go SDKλ₯Ό μ¬μ©ν΄μ μΈμ€ν΄μ€λ₯Ό μμ±ν ν SSHλ‘ μ μνκΈ° μν΄μ ν΄λΉ μΈμ€ν΄μ€μ λΆμ¬ν Key Pair λ₯Ό μμ±ν΄μΌν©λλ€.
KeyPair μμ± λ°©λ²μ μλλ₯Ό μ°Έκ³ νμΈμ :)
- AWS Management Consoleμ μ μνμ¬ λ‘κ·ΈμΈ
- μλΉμ€ μ°ΎκΈ°μμ EC2 (Elastic Compute Cloud)μ κ²μνμ¬ μ μ
- μ’μΈ‘ λ©λ΄μμ "λ€νΈμν¬ λ° λ³΄μ"νμ νλͺ©μΈ "ν€ νμ΄"λ₯Ό μ ν
- μ°μΈ‘ μλ¨μ "ν€ νμ΄ μμ±" ν΄λ¦
- ν€ νμ΄ μ΄λ¦μ μ λ ₯νκ³ , νμΌ νμμ μ νν ν "ν€ νμ΄ μμ±" ν΄λ¦ (μ λ PuTTYλ₯Ό μ¬μ©νκΈ° λλ¬Έμ ppk νμμ μ ν νμ΅λλ€. Linux μ¬μ©μλ pem νμμ μ ννμΈμ.)
μΈμ€ν΄μ€ μμ± μμ λ Cloud-Barista Go Testλ₯Ό κΈ°λ°μΌλ‘ μμ±λμμ΅λλ€. Go κ°λ° νκ²½ λ° Testμ Echo κΈ°λ° REST μλΉμ€ μνμ ν΅ν΄ Go νκ²½μ κ΅¬μ± λ° νμ ν¨ν€μ§ μΆκ° ν μνν μμ μ§νμ΄ κ°λ₯ν©λλ€.
$ go get github.com/aws/aws-sdk-go$ mkdir $HOME/.aws
$ vim $HOME/.aws/credentialsCredentials (from new_user_credentials.csv)
[default]
aws_access_key_id = <YOUR_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>
μμ λ€μ΄λ‘λ
$ 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")
}