-
Notifications
You must be signed in to change notification settings - Fork 1
/
userApiGatewayStack.ts
88 lines (81 loc) · 3.24 KB
/
userApiGatewayStack.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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { Construct } from "constructs";
import {
aws_iam as iam,
aws_apigateway as apigw,
aws_route53 as route53,
aws_certificatemanager as certificateManager,
Stack,
StackProps,
Fn,
} from "aws-cdk-lib";
import { UserLambdaTask } from "./tasks/userLambdaTask";
type Props = StackProps & {
userApiDefinition: any;
};
export class UserApiGatewayStack extends Stack {
constructor(scope: Construct, id: string, props: Props) {
super(scope, id, props);
/// Stackが実行されるリージョン
const REGION = Stack.of(this).region;
/// Stackが実行されるAWSAccountId
const ACCOUNT = Stack.of(this).account;
///------------------------------------------------------------
/// Lambda
///------------------------------------------------------------
/// ユーザーAPI呼び出し用Lambda
const userLambdaTask = new UserLambdaTask(this, "userLambdaTask");
///------------------------------------------------------------
/// APIGW - userApi
///------------------------------------------------------------
/// OpenApiの定義からAPIGatewayのAPI定義生成
const userApiDefinition = apigw.AssetApiDefinition.fromInline(
props.userApiDefinition
);
/// APIGatewayのエンドポイント生成
const userApi = new apigw.SpecRestApi(this, "userApi", {
restApiName: "aws-cdk-articles-user-api",
apiDefinition: userApiDefinition,
deployOptions: {
stageName: "development",
},
deploy: true,
});
/// APIGW Lambda Permission
userLambdaTask.lambda.addPermission("userListLambdaPermission", {
principal: new iam.ServicePrincipal("apigateway.amazonaws.com"),
action: "lambda:InvokeFunction",
sourceArn: `arn:aws:execute-api:${REGION}:${ACCOUNT}:${userApi.restApiId}/*/*/users`,
});
userLambdaTask.lambda.addPermission("userDetailLambdaPermission", {
principal: new iam.ServicePrincipal("apigateway.amazonaws.com"),
action: "lambda:InvokeFunction",
sourceArn: `arn:aws:execute-api:${REGION}:${ACCOUNT}:${userApi.restApiId}/*/*/users/*`,
});
///------------------------------------------------------------
/// APIGW Lambda Integration
///------------------------------------------------------------
/// /userにLambdaを結合
props.userApiDefinition.paths["/users"]["get"][
"x-amazon-apigateway-integration"
] = {
type: "aws_proxy",
passthroughBehavior: "when_no_match",
httpMethod: "post",
contentHandling: "CONVERT_TO_TEXT",
uri: `arn:aws:apigateway:${REGION}:lambda:path/2015-03-31/functions/arn:aws:lambda:${REGION}:${ACCOUNT}:function:${userLambdaTask.lambda.functionName}/invocations`,
};
/// /user/{id}にLambdaを結合
props.userApiDefinition.paths["/users/{id}"]["get"][
"x-amazon-apigateway-integration"
] = {
type: "aws_proxy",
passthroughBehavior: "when_no_match",
httpMethod: "post",
contentHandling: "CONVERT_TO_TEXT",
requestTempalte: {
"application/json": "{ \"userId\": $input.params('id')",
},
uri: `arn:aws:apigateway:${REGION}:lambda:path/2015-03-31/functions/arn:aws:lambda:${REGION}:${ACCOUNT}:function:${userLambdaTask.lambda.functionName}/invocations`,
};
}
}