aws credentials 여러개

  • 여러개의 자격 증명 프로필을 가질 수 있다
  • 이 경우에 aws cli, aws sam cli 등 커맨드라인을 사용할 때
  • 프로필을 지정해 줘야한다

프로필 추가

terminal
1
2
# aws configure --profile {profile name}
aws configure --profile newprofile

AWS Access Key ID [None]: new
AWS Secret Access Key [None]: newkey
Default region name [None]:
Default output format [None]:

  • aws configure --profile {profile name} 명령을 치면 위 처럼 나오는데
  • 여기에 키아이디와 키를 입력한다
%USERPROFILE%/.aws/credentials
1
2
3
4
5
6
7
[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[newprofile]
aws_access_key_id = new
aws_secret_access_key = newkey
  • %USERPROFILE%/.aws/credentials 파일을 열어보면 위처럼 [default] 프로필 아래에
  • 새로운 프로필이 등록되었을 것이다

프로필 스위치

  • 나는 두 가지 방법을 써봤다

방법 1; AWS_PROFILE 환경 변수 설정

  • 환경 변수 AWS_PROFILE을 원하는 프로필명으로 설정한다
  • set AWS_PROFILE {profilename}
  • setx AWS_PROFILE {profilename}
  • 이렇게 2가지를 사용할 수 있다
  • set은 해당 터미널에서만 적용된다. 해당 터미널이 닫히면 같이 날라간다
  • setx는 모든 터미널에서 적용된다
  • setx의 경우 모든 터미널을 닫았다가 열어야 적용된다. vscode 전부 닫았다가 켜야 적용된다
1
2
3
4
5
# bash
echo $AWS_PROFILE

# cmd (windows)
echo %AWS_PROFILE%
  • 환경 변수 적용 확인을 꼭하자
  • 방법 1은 가장 자주 쓰는 프로필을 지정할 때 좋을 것 같다

방법 2; 옵션 사용

  • 환경변수 세팅 말고,
  • aws cli를 사용할 때 --profile옵션을 줄 수 있다
  • aws cli를 사용하다 보면 옵션을 주지 않아도 프로필이 한 개가 아니면 명령을 실행하다가도 어떤 프로필을 사용할지 물어본다
  • 근데 실수로 다른 계정에 배포를 할 수 있으니까.. --profile 옵션을 쓰는 게 좋을 것 같다
  • sam cli의 경우 deploy 할 때 sam deploy --profile newprofile 이런 식으로 할 수 있겠다

방법 3 (번외?); config file 사용 (aws-sdk)

  • cli에 적용되는 것은 아닌데, nodejs app에서 aws sdk 자격 증명하는데 json 파일을 쓸 수 있다
  • 로컬에서 개발하고 클라우드 환경으로 올릴 때, 그 환경마다 aws configure 하는 게 귀찮다
config.json
1
2
3
4
5
{
"accessKeyId": "xxxxxxxxxxxxxxxxxxxx",
"secretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"region": "ap-northeast-2"
}
example.js
1
2
3
import AWS from 'aws-sdk';
import path from 'path';
AWS.config.loadFromPath(path.join(__dirname, './config.json'));
  • json 파일로 자격 증명할 수 있다

참고

nodejs __dirname

index.js
1
2
log(`__dirname`, __dirname);
log(`process.cwd()`, process.cwd());

C:\git>node tmp\app-root\index.js
__dirname C:\git\tmp\app-root
process.cwd() C:\git

  • __dirname은 현재 실행하는 파일의 절대경로이다
  • process.cwd()는 node명령을 호출한 작업디렉터리의 절대경로이다

app-root-path

index.js
1
2
3
4
5
6
const log = console.log;
const app_root_path = require('app-root-path').path;

log(`__dirname`, __dirname);
log(`process.cwd()`, process.cwd());
log(`app_root_path`, app_root_path);
  • 프로젝트 루트를 찾아주는 패키지도 있다

참고

정규식 : 특정 문자열을 포함하는 줄, 라인 판단

상황

log
1
2
3
4
5
6
7
"GET / HTTP/1.1" 200 hello world 1
"GET / HTTP/1.1" 200 hello world 2
"GET /a HTTP/1.1" 404 hello world 1
"POST / HTTP/1.1" 404 hello world 1
"GET / HTTP/1.1" 200 hello world 2
"GET / HTTP/1.1" 200 hello world 1
"POST /asd HTTP/1.1" 404 hello world 2
  • 이런 웹 로그가 있다고 하자
  • 중간에 보이는 200, 404 는 status code 이다
  • 404 에러인 라인만 뽑아서 보고싶을 때..

로그파일을 한줄씩 읽으며 정규식으로 확인하기

app.ts 전체코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import * as fs from 'fs';
import * as path from 'path';
import * as readline from 'readline';

const input_log_file_name = 'nohup20201107.out';

const input_file_path = path.join(
__dirname,
`../input files/${input_log_file_name}`
);
const output_file_path = path.join(
__dirname,
`../output files/${input_log_file_name}`
);
console.log(input_file_path);

async function processLineByLine() {
const fileStream = fs.createReadStream(input_file_path);

const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity,
});

// 정규식
const reg404 = /^.*(404).*/;
let result_string = '';

for await (const line of rl) {
// console.log(`Line from file: ${line}`);

if (reg404.test(line)) {
// console.log(`hello : ${line}`);
result_string += line + '\r\n';
}
}

fs.writeFile(output_file_path, result_string, 'utf8', function (err) {
if (err) throw err;
console.log('file write complete');
});
}

processLineByLine();
readline으로 한줄한줄 읽기
1
2
3
4
5
6
const fileStream = fs.createReadStream(input_file_path);

const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity,
});
  • 우선, 파일을 한줄씩 읽기위해 readline을 사용했다
정규식으로 404 문자열 포함 여부 확인
1
2
3
4
5
6
7
8
9
10
11
12
// 정규식
const reg404 = /^.*(404).*/;
let result_string = '';

for await (const line of rl) {
// console.log(`Line from file: ${line}`);

if (reg404.test(line)) {
// console.log(`hello : ${line}`);
result_string += line + '\r\n';
}
}
  • ^.*(404).* 로 정규식을 새웠다
  • ^.* ; 아무 문자로 시작하는 0개 이상의 문자열로 시작하고
  • (404) ; 404 문자열을 중간에 포함하며
  • .* ; 아무 문자열로 끝나는가
  • reg404.test(line)로 한줄한줄 확인하고
  • 참인 경우에 result_string 에 더하기
result_string 결과 새파일로 쓰기
1
2
3
4
fs.writeFile(output_file_path, result_string, 'utf8', function (err) {
if (err) throw err;
console.log('file write complete');
});
  • result_string에는 404 문자열을 포함한느 라인만 추출되었고
  • output_file_path에 해당 내용을 쓴다