課題解決
INSIGHT
情報・インサイト
【JAVA AWS IAM】IAM作成方法
今回は、AWSのIAMユーザをJavaを使用し、作成する際のいろいろを紹介しようと思います。
環境
Java 11
Spring Boot 2.1.0
Maven
前提
Springでの開発環境はすでに構築済みという前提ですので、あらかじめご了承ください。
IAMユーザとは?(簡単に)
AWSリソースへのアクセスを行う際に、権限や、使用できるサービスなどを制限し、安全に管理するために用意されているユーザです。
使用することで、例えば、S3の特定のバケットのみアクセスできるようにして、大事な情報が入っているバケットにはアクセスさせたくない!みたいなことが設定できます。
準備
ライブラリの依存関係を追加
では早速本題に。
まずは、AWSのライブラリを取得します。
今回はMavenを使用し、ライブラリの管理を行います。
pom.xmlに以下を追加してください。
<dependencies>
⋮
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-autoconfigure</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.163</version>
</dependency>
</dependencies>
バージョン等は、最新のものがある場合はそちらを利用するようにしてください。
認証情報を追加
SpringでAWSの操作を行う規定のユーザ(IAM)を作成する必要があります。
AWSの操作を行うためのIAMの作成
- AWSコンソールにログイン
- IAMサービスのダッシュボードに画面遷移
- 「ポリシー」をクリック
- 「ポリシーの作成」をクリック
- 「JSON」タブを選択肢、以下のコードを張り付け
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:DeleteAccessKey", "iam:UpdateUser", "iam:PutUserPolicy", "iam:DeleteUserPolicy", "iam:DeleteUser", "iam:GetUser", "iam:CreateUser", "iam:CreateAccessKey", "iam:CreateLoginProfile" ], "Resource": "*" } ] }※IAMユーザの登録に関する権限を与えます
- 「ポリシーの確認」をクリック
- 名前と説明を入力し、「ポリシーの作成」をクリック
- 「ユーザ」をクリック
- 「ユーザーを追加」をクリック
- ユーザ名を入力し、「プログラムによるアクセス」にチェックを行い、次のステップへ
- 「既存のポリシーを直接アタッチ」をクリック
- 手順7で入力した名前を検索し、チェックを行い、「次ステップ:タグ」をクリック
- 「次ステップ:確認」をクリック
- 「ユーザーの作成」をクリック
これで作成は完了です。
作成後に表示される、アクセスキー、シークレットキーこの後使用しますので大切に保管してください。
Springに認証情報を追加
application.ymlまたは、application.propertiesに先ほど作成を行った、認証情報を下記のように設定します。
ymlファイルの場合
cloud:
aws:
credentials:
accessKey: ★★★アクセスキー★★★
secretKey: ★★★シークレットキー★★★
region:
static: ap-northeast-1 // 東京リージョンの場合
auto: false // こいつの説明は今回は割愛
propertiesの場合
cloud.aws.credentials.accessKey=★★★アクセスキー★★★ cloud.aws.credentials.secretKey=★★★シークレットキー★★★ cloud.aws.region.static=ap-northeast-1 // 東京リージョンの場合 cloud.aws.region.auto=false // こいつの説明は今回は割愛
認証情報をオブジェクトで取得
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class AWSConfigReader {
/** AWSアクセスキー */
@Value("${cloud.aws.credentials.accessKey}")
private String awsAccessKey;
/** AWSシークレットキー */
@Value("${cloud.aws.credentials.secretKey}")
private String awsSecretKey;
}
コピペで使用できます!
@Dataはlombokを使用しておりますので、使用方法がわからない場合は、getter、setterを用意してください。
これで、認証情報の設定は完了です!
また、ここまでで、準備は完了です!
IAM作成
大きく分けて
- ユーザの作成
- policyの付与
- アクセスキー、シークレットキーの発行
の3つの処理が必要になります。
以下のソースが全文になります。
コメントで何をやっているかを記載していますので、ご参考下さい。
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.policy.Policy;
import com.amazonaws.auth.policy.Resource;
import com.amazonaws.auth.policy.Statement;
import com.amazonaws.auth.policy.Statement.Effect;
import com.amazonaws.auth.policy.actions.S3Actions;
import com.amazonaws.auth.policy.conditions.S3ConditionFactory;
import com.amazonaws.auth.policy.conditions.StringCondition;
import com.amazonaws.auth.policy.conditions.StringCondition.StringComparisonType;
import com.amazonaws.auth.policy.resources.S3ObjectResource;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.CreateAccessKeyRequest;
import com.amazonaws.services.identitymanagement.model.CreateAccessKeyResult;
import com.amazonaws.services.identitymanagement.model.CreateUserRequest;
import com.amazonaws.services.identitymanagement.model.PutUserPolicyRequest;
/**
* AWSに関するサービスクラス
*
*/
@Service
public class AwsService {
/**
* IANユーザを作成します。
*
* @param dto AWS設定オブジェクト
* @return アクセスキー、シークレットキー登録結果
*/
public CreateAccessKeyResult createIanUser(AWSConfigReader dto) {
final AmazonIdentityManagement iam = getIamClient(dto);
String userName = "sampleIamUser";
// ユーザの作成
CreateUserRequest createUserRequest = new CreateUserRequest(userName);
iam.createUser(createUserRequest);
// policyの付与
Policy policy = getPolicy("SampleBucket");
PutUserPolicyRequest putUserPolicyRequest = new PutUserPolicyRequest(userName, userName + "_POLICY",
policy.toJson());
iam.putUserPolicy(putUserPolicyRequest);
// アクセスキー,シークレットキーの発行
CreateAccessKeyRequest createAccessKeyRequest = new CreateAccessKeyRequest().withUserName(userName);
return iam.createAccessKey(createAccessKeyRequest);
}
/**
* IAM操作を行う際のクライアント情報を取得
*
* @param dto AWS設定オブジェクト
* @return AWSクライアント情報
*/
private AmazonIdentityManagement getIamClient(AWSConfigReader dto) {
return AmazonIdentityManagementClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(getCredentials(dto)))
.withRegion(Regions.AP_NORTHEAST_1).build();
}
/**
* 認証情報を取得
*
* @param dto AWS設定オブジェクト
* @return 認証情報
*/
private AWSCredentials getCredentials(AWSConfigReader dto) {
return new BasicAWSCredentials(dto.getAwsAccessKey(), dto.getAwsSecretKey());
}
/**
* S3にアクセスを行うためのpolicyの設定項目を作成します
*
* @param bucketName バケット名
* @return Policy
*/
public Policy getPolicy(String bucketName) {
// ポリシーに記載する設定の作成
Statement stmt1 = new Statement(Effect.Allow).withActions(S3Actions.AllS3Actions)
.withResources(new S3ObjectResource(bucketName, "/*"));
Statement stmt2 = new Statement(Effect.Allow).withActions(S3Actions.ListObjects, S3Actions.GetBucketLocation)
.withResources(new Resource("arn:aws:s3:::" + bucketName))
.withConditions(
new StringCondition(
StringComparisonType.StringLike,
S3ConditionFactory.PREFIX_CONDITION_KEY,
"*"
)
);
//Policyの作成
return new Policy().withStatements().withStatements(stmt1, stmt2);
}
}
これで後は、 createIanUserメソッドを呼びだせばIAMの作成ができます!
コピペで使用できるようにしていますが、ConfigReaderクラスのインポートを忘れずに行ってください。
まとめ
いかがでしたでしょうか。
IAMの作成はできましたか?
Policyの設定をいろいろ修正すれば、S3のアクセスだけでなく、他のサービスの権限も与えることができるので、アレンジして使ってみてください!
弊社ではお客様の課題を解決や業務の効率化に全力で取り組んでいます。
コストを抑えた最適な方法をご提案致しますので、ご興味がありましたら
お気軽にお問合せください。
