要解决“AWS Java SDK: 创建角色和Lambda,Lambda无法扮演角色”的问题,您可以使用以下代码示例:
import com.amazonaws.AmazonClientException;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.CreateRoleRequest;
import com.amazonaws.services.identitymanagement.model.CreateRoleResult;
import com.amazonaws.services.identitymanagement.model.EntityAlreadyExistsException;
import com.amazonaws.services.identitymanagement.model.GetRoleRequest;
import com.amazonaws.services.identitymanagement.model.GetRoleResult;
import com.amazonaws.services.identitymanagement.model.NoSuchEntityException;
import com.amazonaws.services.lambda.AWSLambda;
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
import com.amazonaws.services.lambda.model.AddPermissionRequest;
import com.amazonaws.services.lambda.model.AddPermissionResult;
import com.amazonaws.services.lambda.model.CreateFunctionRequest;
import com.amazonaws.services.lambda.model.CreateFunctionResult;
import com.amazonaws.services.lambda.model.FunctionCode;
import com.amazonaws.services.lambda.model.FunctionConfiguration;
import com.amazonaws.services.lambda.model.GetFunctionRequest;
import com.amazonaws.services.lambda.model.GetFunctionResult;
import com.amazonaws.services.lambda.model.ResourceConflictException;
import com.amazonaws.services.lambda.model.Role;
import com.amazonaws.services.lambda.model.UpdateFunctionConfigurationRequest;
import com.amazonaws.services.lambda.model.UpdateFunctionConfigurationResult;
public class LambdaRoleExample {
private static final String AWS_ACCESS_KEY = "your-access-key";
private static final String AWS_SECRET_KEY = "your-secret-key";
private static final String IAM_ROLE_NAME = "your-iam-role-name";
private static final String LAMBDA_FUNCTION_NAME = "your-lambda-function-name";
private static final String LAMBDA_FUNCTION_HANDLER = "your-lambda-function-handler";
private static final String LAMBDA_FUNCTION_RUNTIME = "your-lambda-function-runtime";
private static final String LAMBDA_FUNCTION_CODE = "your-lambda-function-code";
public static void main(String[] args) {
// 创建IAM角色
createIAMRole();
// 创建Lambda函数
createLambdaFunction();
// 更新Lambda函数配置
updateLambdaFunctionConfiguration();
}
private static void createIAMRole() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.withRegion(Regions.DEFAULT_REGION)
.build();
CreateRoleRequest createRoleRequest = new CreateRoleRequest()
.withRoleName(IAM_ROLE_NAME)
.withAssumeRolePolicyDocument("{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}");
try {
CreateRoleResult createRoleResult = iamClient.createRole(createRoleRequest);
System.out.println("IAM Role ARN: " + createRoleResult.getRole().getArn());
} catch (EntityAlreadyExistsException e) {
System.out.println("IAM Role already exists.");
} catch (AmazonClientException e) {
System.out.println("Failed to create IAM Role: " + e.getMessage());
}
}
private static void createLambdaFunction() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
AWSLambda lambdaClient = AWSLambdaClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.withRegion(Regions.DEFAULT_REGION)
.build();
CreateFunctionRequest createFunctionRequest = new CreateFunctionRequest()
.withFunctionName(LAMBDA_FUNCTION_NAME)
.withHandler(LAMBDA_FUNCTION_HANDLER)
.withRuntime(LAMBDA_FUNCTION_RUNTIME)
.withCode(new FunctionCode().withZipFile(LAMBDA_FUNCTION_CODE))
.withRole("arn:aws:iam::your-account-id:role/" + IAM_ROLE_NAME);
try {
CreateFunctionResult createFunctionResult = lambdaClient.createFunction(createFunctionRequest);
System.out.println("Lambda Function ARN: " + createFunctionResult.getFunctionArn());
} catch (ResourceConflictException e) {
System.out.println("Lambda Function already exists.");
} catch (AmazonClientException e) {
System.out.println("Failed to create Lambda Function: " + e.getMessage());
}
}
private static void updateLambdaFunctionConfiguration() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
AWSLambda lambdaClient = AWSLambdaClientBuilder.standard()