Prerequisite
로컬환경에 사용할 수 있는 IAM User를 생성해주시기 바랍니다.
IAM User에는 특별한 권한을 넣어주시기 마시고, 최소한의 권한만을 가진 IAM Policy를 생성해주시기 바랍니다.
//permissions for SNS example
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"sns:ListTopics"
],
"Resource": [
"*"
]
},
{
"Sid": "Statement2",
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": [
"arn:aws:sns:us-east-1:<AwsAccoundId>:<SNS Topic Name>"
]
}
]
}application.yml 이나 application.properties를 실수로 github에 유출하더라도 최소한의 권한만을 가지도록 하여 유출로 인한 보안 사고를 최소화할 수 있습니다.
AWS Java SDK를 통해서 IAM Role을 사용하기 위해서는 위에서 생성한 IAM User의 AWS Accesskey를 발급받아 ~/.aws/credential에 등록해주시면 됩니다.
[default]
aws_access_key_id=
aws_secret_access_key=Process
SDK를 사용할때 필요한 IAM User와 IAM Role을 생성해두셨으니 AWS SDK를 사용하는데 필요한 java package를 받아오도록 하겠습니다.
build.gradle에 BOM(Bill of Materials)를 선언함으로써 이후 SDK service들을 버전 명시 없이 사용가능합니다.
https://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/setup-project-gradle.html
// https://mvnrepository.com/artifact/software.amazon.awssdk/bom
implementation platform ('software.amazon.awssdk:bom:2.33.2')
implementation 'software.amazon.awssdk:iam'
implementation 'software.amazon.awssdk:sts'
implementation 'software.amazon.awssdk:sns'
implementation 'software.amazon.awssdk:sqs'
implementation 'software.amazon.awssdk:s3'
AWS SDK를 사용하기 위해서는 Credential이 제공되어야 하는데 기본적으로 AWS SDK에서는 아래와 같은 순서대로 credential을 찾게 됩니다.
Java System Properties - aws.accessKeyId and aws.secretAccessKey
Environment Variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
Web Identity Token credentials from system properties or environment variables
Credential profiles file at the default location (~/.aws/credentials) shared by all AWS SDKs and the AWS CLI
Credentials delivered through the Amazon EC2 container service if AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" environment variable is set and security manager has permission to access the variable,
Instance profile credentials delivered through the Amazon EC2 metadata service
AWS SDK에서 Credential을 가져오도록 DefaultCredentialProvider를 선언해주셔야 합니다.
DefaultCredentialsProvider.builder().build();DefaultCredentialProvider를 선언해주면 Credential이 생성이 되며 생성된 Credential을 각 서비스별 Client를 통해서 AWS API를 호출해올수 있도록 설정해야합니다.
해서 코드를 합치면 아래와 같은 코드를 구성할 수 있습니다.
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
public class ExplicitDefaultCredentialsExample {
public static void main(String[] args) {
// Explicitly create the DefaultCredentialsProvider.
DefaultCredentialsProvider defaultCredentialsProvider = DefaultCredentialsProvider
.builder().build();
// Use it with any service client.
S3Client s3Client = S3Client.builder()
.region(Region.US_WEST_2)
.credentialsProvider(defaultCredentialsProvider)
.build();
// Now you can use the client with the default credentials chain.
s3Client.listBuckets();
}
}각 서비스 별 Credential 설정 방법은 아래 링크를 참고해주시기 바랍니다.
해당 예제에서는 S3Client를 사용하는 방법에 대해서 설명하고 있지만 SnsClient도 동일하게 설정하면 됩니다.
그리고 SNS로 메세지를 전송하는 방법은 아래와 같습니다.
https://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/java_sns_code_examples.html
위 링크에서 Publish 섹션을 확인해주시기 바랍니다.
Reference
https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java_sqs_code_examples.html
댓글
댓글 0개
댓글을 남기려면 로그인하세요.