...

μμ μ격 μ¦λͺ μμ± (AssumeRole)
μμ μ격 μ¦λͺ μ μ¬μ©μμκ² νΉμ μν (Role)μ Assume(λ»: μ κ²μΌλ‘ μΌλ€)νμ¬ μν μ λΆμ¬λ κΆνμ νμ¬ κ°λ₯νκ² νλ λ¨κΈ°λ‘ μ¬μ©ν μ μλ μ격 μ¦λͺ μ΄λ€.
μ¬μ©μκ° Roleμ Assumeνλ€λΌλκ² λ¬΄μ¨λ§μ΄λλ©΄, μλ μ¬μ§κ³Ό κ°μ΄ κΆνμ΄ μλ IAM μ μ κ° μ΄λλ―Ό λͺ¨μ(Role)λ₯Ό μ°λ©΄(assume) λ§μΉ μ¬μ©μκ° μ΄λλ―Ό μ²λΌ λμ μ΄λλ―Ό κΆνμ νμ ν μ μλ€λ κ²μ λ»νλ€κ³ 보면 λλ€.
κ·Έλμ μ΄λ¬ν λͺ¨μλ₯Ό μ°λ νμλ₯Ό AssumeRole μ΄λΌκ³ νλ€.

λͺλΆμμ λͺμκ° κΉμ§ μ§μμκ°μ΄ μ ν΄μ Έ μμ΄μ 'μμ' λΌλ λ§μ΄ λ€μ΄κ° κ²μ΄λ€.
λ§μΌ μ격 μ¦λͺ μ΄ λ§λ£λ μ΄νμλ μ΄λ€ μ’ λ₯μ μ‘μΈμ€λ νμ©λμ§ μλλ€.
νμν μμ μμ λ°λ‘λ°λ‘ μμ±ν΄μ νμ©νκ³ μ΄ν νμμ λ°λΌ μ¬ λ°κΈλ κ°λ₯νκΈ° λλ¬Έμ μμ μ격 μ¦λͺ μ 보μμ΄ λ§€μ° λ°μ΄λλ€.
λ°λΌμ μ€λ¬΄μμλ μ΅λν μ₯κΈ° μ격 μ¦λͺ (Access Key Id / Secret Access Key)보λ€λ μμ μ격 μ¦λͺ μ μ΅λν νμ©νλκ² μ’μ λ°©λ²μ΄λ€.
μ΄ ν¬μ€ν μμ , Node νλ‘μ νΈμμ AssumeRoleμ ν΅ν΄ μμ μ격μ¦λͺ (ν ν°)μ λ°κΈλ°μλ€ AWS S3 μλΉμ€μ μΌμ κΈ°κ° λμλ§ μμΈμ€νλ μ€λ¬΄ μμ λ₯Ό λ€μ΄λ³Ό μμ μ΄λ€.
ν° νμ μ 리νμλ©΄ λ€μκ³Ό κ°λ€.
- μ무 κΆνμ΄ μλ IAM μ μ μμ±νκ³ μΈλΌμΈμΌλ‘ AssumeRole μ μ± λΆμ¬
- IAM λ©λ΄μμ AmazonS3FullAccess ν μμλ μν μμ±
- Node νλ‘μ νΈμ μ무 κΆνμ΄ μλ IAM μ μ μ μ₯κΈ° μ격 μ¦λͺ (Access Key Id / Secret Access Key)μ λ±λ‘ (μ무 κΆνμ΄ μλ μ격μ¦λͺ μ΄λ S3μ μμΈμ€ λΆκ°)
- AWS SDK STS λ₯Ό ν΅ν΄ μ½λλ‘ AssumeRoleμ νκ³ μμ μ격 μ¦λͺ μ λ°κΈ
- Node νλ‘μ νΈμ μ격 μ¦λͺ μ λ°κΈν μμ μ격 μ¦λͺ μΌλ‘ μ λ°μ΄νΈνκ³ S3μ μμΈμ€ μλ
λ³Έ κ°μλ λ°λ‘ Node.js νλ‘μ νΈμμ STS ν΄λμ€λ₯Ό μ΄μ©ν΄ AssumeRole νλ μ½λλ‘ λ°λ‘ μ§νν μμ μ΄λ€.
λ°λΌμ 1λ²κ³Ό 2λ² κ³Όμ μΈ IAM μ μ λ₯Ό μμ±νκ³ AssumeRole μΈλΌμΈ μ μ± λΆμ¬ / IAM λ©λ΄μμ S3μμΈμ€ μν μμ±νλ λ°©λ²μ λ€μ ν¬μ€ν μ μ°Έκ³ νκΈΈ λ°λλ€.
[AWS] π μ₯κΈ° μ격 μ¦λͺ (Access Key) & μμ μ격 μ¦λͺ (AssumeRole) μ¬μ©λ²
AWS μ격 μ¦λͺ AWS μ‘μΈμ€ λ°©μμ λ°λΌ λ€μν μ νμ 보μ μ격 μ¦λͺ μ νμλ‘ νλ€. AWSμ λ‘κ·ΈμΈ νμ¬ μλΉμ€λ₯Ό μ΄μ©νλ λ°©λ²μ ν¬κ² λκ°μ§λ‘ λλλ€. μ½μ μ‘μΈμ€ μ격 μ¦λͺ AWS μ½μ μΉ λ§€λ
inpa.tistory.com
AWS STS AssumeRule μ¬μ©λ²
λ¨Όμ μμ μ λ Έλ νλ‘μ νΈμ .env νμΌμ μ무 κΆνμ΄ μλ IAM μ μ μ μ₯κΈ° μ격 μ¦λͺ (Access Key Id / Secret Access Key)μ λ±λ‘ν΄μ€λ€.

κ·Έλ¦¬κ³ AWS S3 λ²ν· λͺ©λ‘μ κ°μ Έμ€λ μ½λλ₯Ό μ€ννμ¬ λ³΄μ.
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();
//* aws region λ° μ격μ¦λͺ
μ€μ
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
const s3 = new AWS.S3();
//* λ²ν· λͺ©λ‘ κ°μ Έμ€κΈ°
s3.listBuckets()
.promise()
.then((data) => {
console.log('S3 : ', JSON.stringify(data, null, 2));
});

AccessDenied: Access Denied κ° λ¬λ€.
μ무 κΆνμ΄ μλ μ격 μ¦λͺ μΌλ‘ μμ²μ νμΌλ μ κ·Ό μ ν λ°λ κ²μ λΉμ°ν μμμ΄λ€.
μμ μ격 μ¦λͺ μ λ°κΈν΄μ S3μ μ κ·Όνκ² νλ μμΌλ‘ ν΄λ³΄μ.
μμ μ격 μ¦λͺ μ λ°κΈνκΈ° μν΄μλ IAM Roleμ ARN κ°μ΄ νμνλ€.
IAM μ½μ λ©λ΄λ‘ λ€μ΄κ° μν νλͺ©μμ, μ λ§ν¬μμ λ§λ€μλ s3-assume-role μν μ λ€μ΄κ°λ©΄ νμΈ κ°λ₯νλ€.

μ΄ arn κ°μ μ΄μ©ν΄ assumeRoleμ ν κ²μ΄λ€.
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();
//* μ무 κΆν μλ μ μ λ±λ‘
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
const roleToAssume = {
RoleArn: 'arn:aws:iam::123123123123:role/s3-assume-role', // iam μν μ arn κ°μ λ£λλ€.
RoleSessionName: `s3-assume-role_${new Date().getTime().toString()}`,
DurationSeconds: 900, // 900μ΄ ~ 129,600μ΄(36μκ°) λ²μ
};
//* Assume Role
async function assumeRole() {
const sts = new AWS.STS();
try {
const data = await sts.assumeRole(roleToAssume).promise();
console.log('Credentials : ', data);
console.log('ν ν° λ§λ£ κΈ°κ° : ', new Date(data.Credentials.Expiration).toTimeString());
return ({
accessKeyId: data.Credentials.AccessKeyId,
secretAccessKey: data.Credentials.SecretAccessKey,
sessionToken: data.Credentials.SessionToken,
});
} catch (error) {
console.log(error);
}
}
let roleCreds = await assumeRole();
const s3 = new AWS.S3(roleCreds); // μμ μ격 μ¦λͺ
μ S3 ν΄λμ€ μΈμλ‘ λ£λλ€.
//* λ²ν· λͺ©λ‘ κ°μ Έμ€κΈ°
await s3
.listBuckets()
.promise()
.then((data) => {
console.log('S3 : ', JSON.stringify(data, null, 2));
})
.catch((error) => {
console.log(error, error.stack);
});

AWS ChainableTemporaryCredentials μ¬μ©λ²
AWS SDK κ° μ λ°μ΄νΈλλ©΄μ μ’λ assumeroleμ νκΈ° μ½κ² 2018λ νλ°μ 'ChainableTemporaryCredentials'λ‘ μλ €μ§ μλ‘μ΄ μ격 μ¦λͺ 곡κΈμκ° μΆκ°λμλ€.
μ λ§ κ°λ¨ν μ½λλ‘ assumroleμ ν μ μκ² λμλ€.
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();
//* μ무 κΆν μλ μ μ
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
const roleToAssume = {
RoleArn: 'arn:aws:iam::123123123123:role/s3-assume-role',
RoleSessionName: `s3-assume-role_${new Date().getTime().toString()}`,
DurationSeconds: 900, // 900μ΄ ~ 129,600μ΄(36μκ°) λ²μ
};
const credentials = new AWS.ChainableTemporaryCredentials({
params: roleToAssume,
});
const s3 = new AWS.S3({ credentials }); // μμ μ격 μ¦λͺ
μ S3 ν΄λμ€ μΈμλ‘ λ£λλ€.
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.