use crate::{
core::{
convert::WillBe,
function::{HaveAtt, RefInner, Referenced},
LogicalId,
},
get_att,
iam::{resource::Role, AWSManagedPolicy, Principal, RoleArn, ServicePrincipal},
lambda::{
property::{architecture::Architectures, code::Code, handler::Handler, runtime::Runtime},
FunctionArn, FunctionName, MemorySize, MemorySizeError, Timeout, TimeoutError,
},
ManagedResource,
};
#[derive(ManagedResource, Clone)]
#[resource_type = "AWS::Lambda::Function"]
pub struct Function {
logical_id: LogicalId,
architectures: Option<Architectures>,
code: Code,
description: Option<String>,
function_name: Option<WillBe<FunctionName>>,
handler: Option<Handler>,
memory_size: Option<MemorySize>,
role: WillBe<RoleArn>,
runtime: Option<Runtime>,
timeout: Option<Timeout>,
}
impl Function {
pub fn zip(
logical_id: LogicalId,
bucket_name: &str,
key: &str,
role: WillBe<RoleArn>,
handler: Handler,
runtime: Runtime,
) -> Function {
let code = Code::new(bucket_name, key);
Function::new(logical_id, code, role)
.handler(handler)
.runtime(runtime)
}
pub fn zip_with_role(
function_id: LogicalId,
role_id: LogicalId,
bucket_name: &str,
key: &str,
handler: Handler,
runtime: Runtime,
) -> (Function, Role) {
let principal = Principal::from(ServicePrincipal::Lambda);
let execution_policy = AWSManagedPolicy::lambda_basic_execution_role();
let role =
Role::assume_role(role_id, principal).managed_policy_arns(vec![execution_policy]);
let role_arn = get_att::<RoleArn, _>(&role);
let function = Function::zip(function_id, bucket_name, key, role_arn, handler, runtime);
(function, role)
}
}
impl Referenced for Function {
type To = FunctionName;
fn referenced(&self) -> RefInner {
RefInner::Id(self.logical_id.clone())
}
}
impl HaveAtt<FunctionArn> for Function {
const KEY: &'static str = "Arn";
}