URL을 기반으로 uri
다음과 같은 것을 찾아 Test123.elb.us-east-1.amazonaws.com
에서 로 변경 해야 합니다.connectionId
hkl876
xed763
예: 에서 까지 찾아 Test999.elb.us-east-1.amazonaws.com
업데이트connectionId
hkl876
klm812
파일의 샘플 내용입니다.
"x-amazon-apigateway-integration": {
"uri": "http://Test123.elb.us-east-1.amazonaws.com:8765/emote",
"responses": {
"200": {
"statusCode": "200",
......
......
"connectionType": "VPC_LINK",
"connectionId": "hkl876",
"httpMethod": "POST",
"type": "http"
}
},
"x-amazon-apigateway-integration": {
"uri": "http://Test999.elb.us-east-1.amazonaws.com:4567/authcode/v1/remote",
"responses": {
"200": {
"statusCode": "200",
......
......
"connectionType": "VPC_LINK",
"connectionId": "hkl876",
"httpMethod": "PUT",
"type": "http"
}
제안해 주셔서 감사합니다.
전체 json 파일에서 이 솔루션을 시도하면 다음 오류 메시지가 나타납니다.
Traceback (most recent call last):
File "sample.py", line 16, in <module>
if data[key]['uri'].find("test123.elb.us-east-1.amazonaws.com") > 0:
TypeError: string indices must be integers
이것은 하나의 레코드에 대한 완전한 Swagger 파일입니다.
{
"swagger": "2.0",
"info": {
"version": "2019-02-19T19:13:11Z"
},
"host": "abc.com",
"schemes": [
"http"
],
"paths": {
"/code123": {
"post": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "x-correlationid",
"in": "header",
"required": true,
"type": "string"
},
{
"name": "content-type",
"in": "header",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Access-Control-Allow-Origin": {
"type": "string"
}
}
},
"security": [
{
"RequestTokenAuthorizer": []
},
{
"api_key": []
}
],
"x-amazon-apigateway-integration": {
"uri": "http://test123.elb.us-east-1.amazonaws.com:2768/sample/code",
"responses": {
"200": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Access-Control-Allow-Origin": "'*'"
}
},
"requestParameters": {
"integration.request.header.x-correlationid": "method.request.header.x-correlationid",
"integration.request.header.x-brand": "method.request.header.x-brand"
},
"passthroughBehavior": "when_no_templates",
"connectionType": "VPC_LINK",
"connectionId": "xyz879",
"httpMethod": "POST",
"type": "http"
}
}
}
}
}
}
}
답변1
비슷한 것으로 이 작업을 수행하는 더 좋은 방법이 있을 수 있지만 jq
저는 이 도구를 마스터한 적이 없습니다. 저는 이를 달성하기 위해 Python을 사용하겠습니다. 업데이트된 JSON 문서를 보면 다음과 같습니다.
{
"swagger": "2.0",
"info": {
"version": "2019-02-19T19:13:11Z"
},
"host": "abc.com",
"schemes": [
"http"
],
"paths": {
"/code123": {
"post": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "x-correlationid",
"in": "header",
"required": true,
"type": "string"
},
{
"name": "content-type",
"in": "header",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Access-Control-Allow-Origin": {
"type": "string"
}
}
},
"security": [
{
"RequestTokenAuthorizer": []
},
{
"api_key": []
}
],
"x-amazon-apigateway-integration": {
"uri": "http://test123.elb.us-east-1.amazonaws.com:2768/sample/code",
"responses": {
"200": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Access-Control-Allow-Origin": "'*'"
}
},
"requestParameters": {
"integration.request.header.x-correlationid": "method.request.header.x-correlationid",
"integration.request.header.x-brand": "method.request.header.x-brand"
},
"passthroughBehavior": "when_no_templates",
"connectionType": "VPC_LINK",
"connectionId": "xyz879",
"httpMethod": "POST",
"type": "http"
}
}
}
}
}
}
}
다음 Python 스크립트를 실행합니다(위 예에서 이름 지정 ex.json
).
#!/usr/bin/env python3
import json
with open('ex.json') as json_file:
data = json.load(json_file)
for path in data['paths']:
for method in data['paths'][path]:
if data['paths'][path][method]['responses']['x-amazon-apigateway-integration']['uri'].find("test123.elb.us-east-1.amazonaws.com") > 0:
data['paths'][path][method]['responses']['x-amazon-apigateway-integration']['responses']['connectionId'] = 'xed763'
print(json.dumps(data, indent=4))
connectionId
첫 번째 항목의 필드가 변경된 다음 출력을 얻습니다 .
{
"swagger": "2.0",
"info": {
"version": "2019-02-19T19:13:11Z"
},
"host": "abc.com",
"schemes": [
"http"
],
"paths": {
"/code123": {
"post": {
"produces": [
"application/json"
],
"parameters": [
{
"name": "x-correlationid",
"in": "header",
"required": true,
"type": "string"
},
{
"name": "content-type",
"in": "header",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "200 response",
"schema": {
"$ref": "#/definitions/Empty"
},
"headers": {
"Access-Control-Allow-Origin": {
"type": "string"
}
}
},
"security": [
{
"RequestTokenAuthorizer": []
},
{
"api_key": []
}
],
"x-amazon-apigateway-integration": {
"uri": "http://test123.elb.us-east-1.amazonaws.com:2768/sample/code",
"responses": {
"200": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Access-Control-Allow-Origin": "'*'"
}
},
"requestParameters": {
"integration.request.header.x-correlationid": "method.request.header.x-correlationid",
"integration.request.header.x-brand": "method.request.header.x-brand"
},
"passthroughBehavior": "when_no_templates",
"connectionType": "VPC_LINK",
"connectionId": "xed763",
"httpMethod": "POST",
"type": "http"
}
}
}
}
}
}
}
파이썬 스크립트:
- 파일을 열고
ex.json
열린 파일을 호출합니다.json_file
- JSON을 Python 사전으로 읽어 들입니다.
data
- 문서의 경로를 반복합니다(예:
/code123
). - 각 경로를 반복하는 방법(예:
post
) uri
이 요소의 필드에 대상 문자열이 포함되어 있는지 확인합니다 .find()
문자열이 없으면 -1을 반환합니다.uri
주어진 at에key
찾고 있는 문자열이 포함되어 있으면connectionId
원하는 값으로 필드를 덮어 씁니다.- 루프가 완료된 후 (수정될 수 있음) JSON을 표준 출력으로 인쇄합니다.