나는 같은 기능을 찾고있었습니다. SpoonMeiser가 제안한대로 중첩 스택을 사용하면 마음에 들었지만 실제로 필요한 것은 사용자 정의 함수라는 것을 깨달았습니다. 운 좋게 CloudFormation을 사용하면 AWS :: CloudFormation :: CustomResource를 사용할 수 있습니다. 약간의 작업만으로도 를 사용할 수 있습니다. 이것은 변수에 대한 잔인한 느낌 (먼저 CloudFormation에 있어야한다고 주장하는 것)이지만 작업을 완료하고 모든 유연성을 허용합니다 (파이썬 / 노드 선택) /자바). 람다 함수는 비용이 많이 들지만 시간당 여러 번 스택을 만들거나 삭제하지 않는 한 여기에서 돈을 벌고 있습니다.
첫 번째 단계는 이 페이지 에서 입력 값을 가져 와서 출력에 복사하는 것 외에 다른 기능 을 수행하는 것입니다. 우리는 람다 함수가 모든 종류의 미친 것들을 수행하도록 할 수 있지만 일단 정체성 함수를 가지면 다른 것은 쉽습니다. 또는 스택 자체에서 람다 함수를 만들 수도 있습니다. 하나의 계정에서 많은 스택을 사용하기 때문에 남은 람다 함수와 역할이 많이 있습니다 (그리고 모든 스택은 역할이 필요하기 때문에로 만들어야 --capabilities=CAPABILITY_IAM
합니다.
람다 함수 생성
- 람다 홈페이지로 이동 하여 원하는 지역을 선택하십시오.
- 템플릿으로 "빈 기능"을 선택하십시오.
- "다음"을 클릭하십시오 (트리거를 구성하지 마십시오)
- 작성 :
- 이름 : CloudFormationIdentity
- 설명 : Cloud Formation에서 지원되는 내용, 변수 지원을 반환합니다.
- 런타임 : python2.7
- 코드 입력 유형 : 코드 인라인 편집
- 코드 : 아래 참조
- 매니저:
index.handler
- 역할 : 사용자 지정 역할을 만듭니다. 이 시점에서 새 역할을 만들 수있는 팝업이 열립니다. 이 페이지의 모든 내용을 승인하고 "허용"을 클릭하십시오. Cloudwatch 로그에 게시 할 권한이있는 역할을 생성합니다.
- 메모리 : 128 (최소값)
- 타임 아웃 : 3 초 (충분해야 함)
- VPC : VPC 없음
그런 다음 코드 필드에 아래 코드를 복사하여 붙여 넣습니다. 함수의 상단은 cfn-response python module 의 코드이며, 이상한 이유로 CloudFormation을 통해 람다 함수가 생성 된 경우에만 자동 설치됩니다. 이 handler
기능은 설명이 필요 없습니다.
from __future__ import print_function
import json
try:
from urllib2 import HTTPError, build_opener, HTTPHandler, Request
except ImportError:
from urllib.error import HTTPError
from urllib.request import build_opener, HTTPHandler, Request
SUCCESS = "SUCCESS"
FAILED = "FAILED"
def send(event, context, response_status, reason=None, response_data=None, physical_resource_id=None):
response_data = response_data or {}
response_body = json.dumps(
{
'Status': response_status,
'Reason': reason or "See the details in CloudWatch Log Stream: " + context.log_stream_name,
'PhysicalResourceId': physical_resource_id or context.log_stream_name,
'StackId': event['StackId'],
'RequestId': event['RequestId'],
'LogicalResourceId': event['LogicalResourceId'],
'Data': response_data
}
)
if event["ResponseURL"] == "http://pre-signed-S3-url-for-response":
print("Would send back the following values to Cloud Formation:")
print(response_data)
return
opener = build_opener(HTTPHandler)
request = Request(event['ResponseURL'], data=response_body)
request.add_header('Content-Type', '')
request.add_header('Content-Length', len(response_body))
request.get_method = lambda: 'PUT'
try:
response = opener.open(request)
print("Status code: {}".format(response.getcode()))
print("Status message: {}".format(response.msg))
return True
except HTTPError as exc:
print("Failed executing HTTP request: {}".format(exc.code))
return False
def handler(event, context):
responseData = event['ResourceProperties']
send(event, context, SUCCESS, None, responseData, "CustomResourcePhysicalID")
- "다음"을 클릭하십시오
- "기능 생성"을 클릭하십시오
"Test"버튼을 선택하여 람다 함수를 테스트하고 "CloudFormation Create Request"를 샘플 템플릿으로 선택할 수 있습니다. 로그에 공급 된 변수가 반환되는 것을 로그에서 확인해야합니다.
CloudFormation 템플릿에서 변수 사용
이제이 람다 함수가 있으므로 CloudFormation 템플릿에서 사용할 수 있습니다. 람다 함수 Arn을 먼저 기록하십시오 ( 람다 홈페이지 로 이동 하여 방금 생성 된 함수를 클릭하십시오. Arn은 오른쪽 상단에 있어야합니다 arn:aws:lambda:region:12345:function:CloudFormationIdentity
).
이제 템플릿의 리소스 섹션에서 다음과 같이 변수를 지정하십시오.
Identity:
Type: "Custom::Variable"
Properties:
ServiceToken: "arn:aws:lambda:region:12345:function:CloudFormationIdentity"
Arn: "arn:aws:lambda:region:12345:function:CloudFormationIdentity"
ClientBucketVar:
Type: "Custom::Variable"
Properties:
ServiceToken: !GetAtt [Identity, Arn]
Name: !Join ["-", [my-client-bucket, !Ref ClientName]]
Arn: !Join [":", [arn, aws, s3, "", "", !Join ["-", [my-client-bucket, !Ref ClientName]]]]
ClientBackupBucketVar:
Type: "Custom::Variable"
Properties:
ServiceToken: !GetAtt [Identity, Arn]
Name: !Join ["-", [my-client-bucket, !Ref ClientName, backup]]
Arn: !Join [":", [arn, aws, s3, "", "", !Join ["-", [my-client-bucket, !Ref ClientName, backup]]]]
먼저 Identity
람다 함수에 Arn을 포함 하는 변수를 지정합니다 . 이 변수를 여기에 넣으면 한 번만 지정하면됩니다. 모든 유형의 변수를 만듭니다 Custom::Variable
. CloudFormation을 사용하면 Custom::
사용자 지정 리소스로 시작하는 모든 유형 이름을 사용할 수 있습니다 .
점을 유의 Identity
변수 회 람다 기능에 대한 급성 망막 괴사를 포함한다. 사용할 람다 함수를 지정하십시오. 변수의 값으로 두 번째입니다.
이제 Identity
변수 가 있으므로 ServiceToken: !GetAtt [Identity, Arn]
(JSON 코드는와 같아야한다고 생각)을 사용하여 새 변수를 정의 할 수 있습니다 "ServiceToken": {"Fn::GetAtt": ["Identity", "Arn"]}
. 이름과 Arn이라는 두 개의 필드가있는 두 개의 새 변수를 만듭니다. 나머지 템플릿에서는 사용할 수 !GetAtt [ClientBucketVar, Name]
있거나 !GetAtt [ClientBucketVar, Arn]
필요할 때마다 사용할 수 있습니다 .
주의의 말씀
커스텀 리소스로 작업 할 때 람다 함수가 충돌하면 CloudFormation이 1 시간 동안 (크래쉬 된) 함수의 응답을 기다리기 때문에 1 시간에서 2 시간 사이에 멈춰 있습니다. 따라서 람다 함수를 개발하는 동안 스택에 짧은 시간 초과를 지정하는 것이 좋습니다.