AWS CLI


  • https://aws.amazon.com/cli
  • https://github.com/aws/aws-cli
  • AWS 서비스 관리를 위한 CLI 명령형 도구
  • AWS CLI는 Python 기반으로 작성되어 Boto 패키지를 이용

 

CLI(Command Line Interface)


명령 줄 인터페이스 또는 명령어 인터페이스는 가상 터미널 또는 터미널을 통해 사용자와 컴퓨터가 상호 작용하는 방식을 뜻한다. 즉, 작업 명령은 사용자가 컴퓨터 키보드 등을 통해 문자열의 형태로 입력하며, 컴퓨터로부터의 출력 역시 문자열의 형태로 주어진다. from 위키백과

 

AWS CLI 설치(macOS)

$ brew install awscli

Window 에서 설치

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

 

AWS CLI를 사용하기 위해서 자격 증명을 해야 한다. 

AWS 계정 혹은 IAM 사용자의 액세스 키 발급이 필요하다.

 

Access Key ID

 - 자격증명 주체를 가리킴

   인증 요청한 사람이 누구인가?

Secret Access Key

 - 자격증명 주체 본인임을 인증

   인증 요청한 사람이 정말 A가 맞는가?

 

엑세스 키 만드는 방법

 

AWS CLI 자격증명 설정: CLI 설정 파일

 - / .aws/config

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrsfhefuwefij/werewuihi/ewrhweiuhkey

 

AWS CLI 자격증명 설정: 환경변수

- AWS_ACCESS_KEY_ID 

- AWS_SECRET_ACCESS_KEY

- AWS_PROFILE

 

AWS CLI 자격증명 설정: EC2 인스턴스 프로파일

IAM 역할(Role)을 EC2 머신에 부여하기 위한 목적

EC2 내에서 AWS 서비스에 대한 권한을 수행할 수 있게 됨

 

fastcampus 강의에서는 바로 nvim ~/.aws/config 명령어부터 시작된다.

하지만 /.aws 파일은 존재하지 않았다.

해당 과정을 진행하기 위해서

aws cli를 설치한 후 aws configure 명령어를 실행하고 aws access key id 와

aws secret access key 를 입력하고 default region name과 output format을 입력하고 나서야

/.aws 파일이 생성 되었다.

 

AWS CLI 명령어는 일반적으로 아래와 같은 형식으로 사용된다.

aws <command> <subcommand> [options and parameters]

 

aws 매뉴얼 확인하기

aws help
aws <command> help 
aws <command> <subcommand> help

aws <command> help 명령어는 command에 대한 설명을 나타냅니다.

aws <command> <subcommand> help 명령어는 subcommand 명령어에 대한 설명을 나타냅니다.

 

aws 디버그 모드 활성화

$ aws sts get-caller-identity --debug

디버그 모드를 활성화하면, 특정 명령어를 수행할 때 aws cli의 동작을 디버그 할 수 있다.

 

aws 현재 자격증명 정보 확인하기

$ aws sts get-caller-identity

강의 요약

AWS CLI는 AWS 서비스를 관리할 수 있는 명령형 도구로, 자동화 목적에 활용 가능

AWS CLI를 설치하고 자격증명 및 기본 리전, 결과 출력 형식을 설정할 수 있음

AWS 액세스 키를 발급받고 자격증명으로 사용할 수 있음

 

 

'DevOps' 카테고리의 다른 글

ec2 서버 생성 후 꼭 해야되는 초기 설정  (0) 2022.07.31
mac에서 간단하게 ec2 서버 접근하기  (0) 2022.07.31
devops의 변천사  (0) 2022.01.18

https://www.acmicpc.net/problem/17224

 

17224번: APC는 왜 서브태스크 대회가 되었을까?

2019년 올해도 어김없이 아주대학교 프로그래밍 경시대회(Ajou Programming Contest, APC)가 열렸다! 올해 새롭게 APC의 총감독을 맡게 된 준표는 대회 출제 과정 중 큰 고민에 빠졌다. APC에 참가하는 참가

www.acmicpc.net

 

<해당 문제의 나의 풀이>

N, L, K = map(int, input().split())
subtask = []
score = 0
count = 0

for i in range(N):
    sub1, sub2 = map(int, input().split())
    subtask.append([sub1, sub2])
    
subtask.sort(key=lambda x:x[1])

for lst in subtask:
    if count >= K:
        break
    sub1, sub2 = lst[0], lst[1]
    if L >= sub1:
        score += 100
        count += 1
    if L >= sub2:
        score += 40
    
print(score)

 

<해설>

위 문제의 핵심은 2차원 배열을 정렬하여야 한다는 것입니다. 왜냐하면, 해당 문제의 최대 풀 수 있는 문제 수가 정해져 있습니다. 그런데, 역량이 부족하여 2번째 어려운 보너스 부분 점수를 못 받는 문제를 먼저 풀어버리면 문제 풀이 수가 증가하여 최대한 받을 수 있는 점수가 줄어들게 됩니다. 따라서 최대한 많은 점수를 얻기 위해서는 어려운 문제 기준으로 정렬을 수행하여야 합니다.

 

<람다식을 통해 2차원 배열의 2번째 요소로 정렬하는 방법>

subtask.sort(key=lambda x:x[1])

 

'알고리즘' 카테고리의 다른 글

백준 국영수  (0) 2022.02.22
[백준] 2차원 배열의 합  (0) 2022.01.24
백준 1920번 수 찾기  (0) 2022.01.12
[프로그래머스] 문자열 압축  (0) 2022.01.04
[이코테] 문자열 재정렬  (0) 2022.01.04

https://www.acmicpc.net/problem/1920

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

백준 문제를 풀면서 위 문제를 풀 수 있는 흥미로운 방법을 찾아내어 기록합니다.

 

위 문제를 처음 봤을 때 저의 풀이입니다.

N = input()
A = list(map(int, input().split()))
M = input()
lstM = list(map(int, input().split()))

for ele in lstM:
    if ele in A: 
        print(1)
    else:
        print(0)

해당 문제를 해결하기 위해서 in 을 활용하였습니다.

위 방식은 심플하고 좋아보이지만 python3으로 해결하려고 하면 시간초과가 발생합니다. (하지만 pypy3은 괜찮아요)

 

이번에는 패스트캠퍼스 강의를 통해서 알게된 풀이 방식입니다.

 

N, A = int(input()), {i:1 for i in map(int, input().split())}
M, B = int(input()), list(map(int, input().split()))

for i in range(M):
	print(A.get(B[i],0))

위 문제의 핵심은 딕셔너리를 활용하는 것입니다. 입력 받을 때 {} 안에 for 문을 활용하여 입력값들을 딕셔너리로 받습니다. 그리고, get함수를 통해서 첫번째 인자 값이 존재하지 않는다면 2번째 인자 값을 반환하도록 합니다.

위와 같은 방식으로 딕셔너리를 활용하여 코딩할 수 있습니다.

쿼리문을 호출하면

datetime 변수에 "2022-01-10T09:27:45.9510205+09:00" 와 같은 내용으로 들어가서 발생한 오류였다.

StDate.EditValue = dateNow();

따라서, 아래와 같은 형식으로 변환하여서 쿼리문을 호출하니 잘 되는 것을 확인하였다.

StDate.EditValue = dateNow.ToString("yyyy-MM-dd");

 

<발생한 오류>

The bucket does not allow ACLs (Service: Amazon S3; Status Code: 400; Error Code: AccessControlListNotSupported

 

<원인>

버킷의 ACL(Access Control List) 이 비활성화되어 있었다. 

 

<해결책>

ACL 활성화됨을 선택한다.

https://jojoldu.tistory.com/300

 

SpringBoot & AWS S3 연동하기

안녕하세요? 이번 시간엔 SpringBoot & AWS S3 연동하기 예제를 진행해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와

jojoldu.tistory.com

 

오늘 게시판에 이미지를 첨부하기 위해서 위와같은 예제를 학습하고 있었다.

하지만 오늘도 어김없이 오류를 만났다.

 

<오류의 종류>

Cannot resolve reference to bean 'amazonS3' while setting constructor argument

<오류가 난 원인>

There is no EC2 meta data available, because the application is not running in the EC2 environment

EC2 메타 데이터가 존재하지 않아서이다. 

 

<오류 해결책>

main/resources 경로에 application.properties 파일을 생성한다.

cloud.aws.stack.auto=false
cloud.aws.region.static=ap-northeast-2

위 명령어를 입력한다.

 

<참조 자료>

https://stackoverflow.com/questions/49143763/initializing-aws-with-springboot

 

initializing AWS with Springboot

I am trying to initialize and build a Springboot Application that uses AWS dependencies on Net Beans, however, I am having a problem building the project. After resolving the errors after creating ...

stackoverflow.com

 

이번에 이것이 코딩 테스트에서 문자열 압축 문제를 풀었고 해당 문제는 프로그래머스의 문제였다.

https://programmers.co.kr/learn/courses/30/lessons/60057 

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

해당 문제를 거의다 풀어갈 때, 나머지를 어떻게 더할 것인가에 대한 고민이 생겼다.

고민을 하던중 알게된 것이 아래의 코드이다.

s = 'abcdefg'
print(s[4:100])

결과

efg

해당 결과를 보기전까진 [:] 에서 오른쪽 숫자는 문자열 길이를 초과해서는 안될 것이라는 생각이 있었는데 넘어가도 최대 값 이상 안넘어가며 오류또한 나타나지 않는 결과를 얻었다. 

 

다시말해, 값이 초과하여도 상관이 없기 때문에 for문을 끝까지 돌려도 된다는 것이다.

아래 코드는 이코테 답안이다.

 

def solution(s):
	answer = len(s)
    # 1개 단위(step)부터 압축 단위를 늘려가며 확인
    for step in range(1, len(s) // 2 + 1):
    	compressed = ""
        prev = s[0:step] # 앞에서부터 step만큼의 문자열 추출
        count = 1
        # 단위(step) 크기만큼 증가시키며 이전 문자열과 비교
        for j in range(step, len(s), step):
        	# 이전 상태와 동일하다면 압축 횟수(count) 증가
            if prev == s[j:j + step]:
            	count += 1
            # 다른 문자열이 나왔다면(더 이상 압축하지 못하는 경우라면)
            else:
            	compressed += str(count) + prev if count >= 2 else prev
                prev = s[j:j + step] # 다시 상태 초기화
                count = 1
         # 남아 있는 문자열에 대해서 처리
         compressed += str(count) + prev if count >= 2 else prev
         # 만들어지는 압축 문자열이 가장 짧은 것이 정답
         answer = min(answer, len(compressed))
	return answer

 

알파벳 대문자와 숫자(0 ~ 9)로만 구성된 문자열이 입력으로 주어집니다. 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력합니다. 

 

<나의 풀이>

s = input()

charList = []
numList = []

for i in range(len(s)):
    if ord(s[i]) >= 65:
        charList.append(s[i])
    else:
        numList.append(s[i])

charList.sort()
numList.sort()

for i in range(len(charList)):
    print(charList[i], end='')
for i in range(len(numList)):
    print(numList[i], end='')

 

해당 문제는 문자의 크기를 비교하고 해당 문자가 숫자인지 알파벳인지 구별해야한다.

- 문자의 크기를 비교하여 정렬하는 것은 sort()함수를 호출하면된다.

- 해당 문자가 숫자인지 알파벳 인지는 ord(s[i]) >= 65를 이용하여 구할수 있다.

65이상 값이 알파벳으로 분류되는 것은 A의 아스키 코드 값이 65이기 때문이다.

앞으로도 종종 알파벳인지 숫자인지 구별할 필요가 있을 것으로 생각되므로 ord(s[i]) >= 65 조건을 기억해두자

오늘 데이터베이스를 복원하는 중 아래와같은 오류를 만났다.

'데이터베이스가 사용 중이여서 배타적으로 엑세스할 수 없습니다.'

데이터베이스를 복원하기 전에는 다중 사용을 허용해서는 안된다.

 

<해결책>

 

해당 오류를 해결하기 위해선 다른 모든 연결을 닫아야 한다. 

그럼 DB 테이블 옆에 (제한된 사용자)표식과 함깨 복원할 수 있게 된다.

볼링공 고르기

 

A, B 두 사람이 볼링을 치고 있습니다. 두 사람은 서로 무게가 다른 볼링공을 고르려고 합니다. 볼링공은 총 N개가 있으며 각 볼링공마다 무게가 적혀 있고 공의 번호는 1번부터 순서대로 부여됩니다. 또한 같은 무게의 공이 여러 개 있을 수 있지만, 서로 다른 공으로 간주합니다. 볼링공의 무게는 1부터 M까지의 자연수 형태로 존재합니다.

 

입력조건 

  - 첫째 줄에 볼링공의 개수 N, 공의 최대 무게 M이 공백으로 구분되어 각각 자연수 형태로 주어집니다.

(1 <= N <= 1000, I <= M <= 10)

  - 둘째 줄에 각 볼링공의 무게 K가 공백으로 구분되어 순서대로 자연수 형태로 주어집니다.

 

<나의 답안>  

# 볼링공 고르기 p.315
from itertools import combinations

if __name__ == '__main__':
    n, m = map(int, input().split())
    arr = list(map(int,input().split()))
    numArr = [0]*n
    for i in range(n):
        numArr[i] = i+1

    comArr = list(combinations(arr,2))
    result = 0
    for i in comArr:
        if i[0] != i[1]:
            result +=1
    print(result)

 

<나의 답안 해설>

 

위의 문제는 2사람이 볼링공을 고르는 경우의 수를 출력하면된다. 하지만, 한 가지 조건이 있다. 

2명의 사람은 서로 무게가 다른 볼링공을 골라야 한다. 

따라서 2명(2개의 수의조합)을 토대로 combination으로 순서 변경없는 조합의 수를 찾아냈다. 

그다음에 2개의 값이 같으면 for문에서 값을 더하지 않는 식으로 해결하였다. 

 

<정답>

# 볼링공 고르기 p.315
if __name__ == '__main__':
    n, m = map(int, input().split())
    data = list(map(int, input().split()))
    
    # 1부터 10까지의 무게를 담을 수 있는 리스트
    array = [0] * 11
    
    for x in data:
        # 각 무게에 해당하는 볼링공의 개수 카운트
        array[x] += 1
        
    result = 0
    # 1부터 m까지의 각 무게에 대하여 처리
    for i in range(1, m+1):
        n -= array[i] # 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
        result += array[i] * n # B가 선택하는 경우의 수와 곱하기
    
    print(result)

정답의 경우 정답을 보면 명쾌해 질 줄 알았는데 쉽지 않다고 느끼게 되는 것 같다. 

 

 

'알고리즘' 카테고리의 다른 글

[프로그래머스] 문자열 압축  (0) 2022.01.04
[이코테] 문자열 재정렬  (0) 2022.01.04
이것이 코딩 테스트이다 - 모험가 길드  (0) 2022.01.03
백준 피보나치의 수5  (0) 2021.12.29
백준 설탕 배달 dp  (0) 2021.12.26

+ Recent posts