-
Notifications
You must be signed in to change notification settings - Fork 3.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[aws-codepipeline] Parameter overrides cannot use Fn::GetArtifactAtt #1588
Comments
The problem here seems to be that
What does the |
cc @skinny85 |
Yes, I think so. I guess I will encounter the same problem with
ParameterOverrides: !Sub |
{
"LambdaCodeZip" : { "Fn::GetArtifactAtt" : [ "BuildOutput", "ObjectKey" ] },
"LambdaCodeBucket": { "Fn::GetArtifactAtt" : [ "BuildOutput", "BucketName" ] },
"AssetsBucketName": "${AssetsBucket}",
"AssetsBucketDomainName": "${AssetsBucket.DomainName}",
"GitHubRepositoryName": "${GitHubRepositoryName}"
} For an example I provided in first post !Sub is not required to work, but you have to keep the YAML: ParameterOverrides: |
{
"LambdaCodeZip" : { "Fn::GetArtifactAtt" : [ "BuildOutput", "ObjectKey" ] },
"LambdaCodeBucket": { "Fn::GetArtifactAtt" : [ "BuildOutput", "BucketName" ] }
} JSON: {
"ParameterOverrides": "{\n \"LambdaCodeZip\" : { \"Fn::GetArtifactAtt\" : [ \"BuildOutput\", \"ObjectKey\" ] },\n \"LambdaCodeBucket\": { \"Fn::GetArtifactAtt\" : [ \"BuildOutput\", \"BucketName\" ] }\n}\n",
} |
Edit: It does not work.
parameterOverrides: {
'LambdaCodeZip': `{ "Fn::GetArtifactAtt" : [ "${buildArtifact.name}", "ObjectKey" ] }`,
'LambdaCodeBucket': `{ "Fn::GetArtifactAtt" : [ "${buildArtifact.name}", "BucketName" ] }`,
'GitHubRepositoryName': cdk.Fn.sub('${GitHubRepositoryName}'),
}, Output YAML: ParameterOverrides:
Fn::Join:
- ""
- - '{"LambdaCodeZip":"{ \"Fn::GetArtifactAtt\" : [
\"BuildOutput\", \"ObjectKey\" ]
}","LambdaCodeBucket":"{ \"Fn::GetArtifactAtt\" : [
\"BuildOutput\", \"BucketName\" ]
}","GitHubRepositoryName":"'
- Fn::Sub: ${GitHubRepositoryName}
- '"}' Output JSON: {
"ParameterOverrides": {
"Fn::Join": [
"",
[
"{\"LambdaCodeZip\":\"{ \\\"Fn::GetArtifactAtt\\\" : [ \\\"BuildOutput\\\", \\\"ObjectKey\\\" ] }\",\"LambdaCodeBucket\":\"{ \\\"Fn::GetArtifactAtt\\\" : [ \\\"BuildOutput\\\", \\\"BucketName\\\" ] }\",\"GitHubRepositoryName\":\"",
{
"Fn::Sub": "${GitHubRepositoryName}"
},
"\"}"
]
]
},
} |
@piotrkubisa thanks for reporting this one, I'm looking into it. Quick question: did your workaround from this comment work? I does deploy through CFN, however the Pipeline with those |
Sadly, no it does not work 😢 You are right it will provide |
…etParam) specially when stringifying JSON. Fn::GetArtifactAtt and Fn::GetParam are not really intrinsics, they're functions that can be used only in CodePipeline CFN Actions, in the `parameterOverride` property. More information: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-parameter-override-functions.html Fixes aws#1588
I figured out what the issue is. I submitted a PR with the fix here. |
…etParam) specially when stringifying JSON. (#1605) Fn::GetArtifactAtt and Fn::GetParam are not really intrinsics, they're functions that can be used only in CodePipeline CFN Actions, in the `parameterOverride` property. More information: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-parameter-override-functions.html Fixes #1588
Thanks! |
NP, thanks for reporting the issue! |
This seems to be still be happening when not used in the Cfn new PipelineProject(scope, `Project`, {
// ...
environmentVariables: {
WEB_API_LOC: {
type: BuildEnvironmentVariableType.PLAINTEXT,
value: JSON.stringify(props.webApiLambdaCode.assign(webApiOutput.s3Location))
}
}
// ...
}) You still get this output: ProjectD3596EDB:
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: CODEPIPELINE
Environment:
ComputeType: BUILD_GENERAL1_SMALL
EnvironmentVariables:
- Name: WEB_API_LOC
Type: PLAINTEXT
Value:
Fn::Join:
- ""
- - '{"ApiApiFuncLambdaSourceBucketNameParameterB6671E0E":"'
- Fn::GetArtifactAtt:
- WebApiOut
- BucketName
- '","ApiApiFuncLambdaSourceObjectKeyParameter1B2544EC":"'
- Fn::GetArtifactAtt:
- WebApiOut
- ObjectKey
- '"}' |
That could be a miss from our side, but I'm 99% sure this won't work anyway (the only place I believe what you're looking for is |
@skinny85 Thanks for the response. My end goal is to work around this issue about passing more than a few parameters via |
A couple of things about that:
lambda.Code.fromCfnParameters({
bucketNameParam: new CfnParameter(this, 'A'),
objectKeyParam: new CfnParameter(this, 'B'),
});
const sourceOutput = new codepipeline.Artifact('S'); Hope this helps! Adam |
I think specifying my own |
For anyone finding this in the future, I finally got a response from AWS Support regarding the issue:
So for now, it looks like the |
I don't think this issue is solved. I'm facing it just right now. This is how my code looks like: from aws_cdk import (
core,
aws_s3 as s3,
aws_ssm as ssm,
aws_codepipeline as codepipeline,
aws_codepipeline_actions as actions,
)
from typing import Dict
class PipelineTest(core.Stack):
def __init__(self, app: core.App, id: str, props: Dict, **kwargs) -> None:
super().__init__(app, id, **kwargs)
source_output = codepipeline.Artifact(artifact_name='source')
build_output = codepipeline.Artifact(artifact_name='build')
core.CfnOutput(
self, "Outpu1t",
value=build_output.s3_location.bucket_name
)
core.CfnOutput(
self, "Output2",
value=build_output.s3_location.object_key
) This is the output when I run failed: Error [ValidationError]: Template Error: Encountered unsupported function: Fn::GetArtifactAtt Supported functions are: [Fn::Base64, Fn::GetAtt, Fn::GetAZs, Fn::ImportValue, Fn::Join, Fn::Split, Fn::FindInMap, Fn::Select, Ref, Fn::Equals, Fn::If, Fn::Not, Condition, Fn::And, Fn::Or, Fn::Contains, Fn::EachMemberEquals, Fn::EachMemberIn, Fn::ValueOf, Fn::ValueOfAll, Fn::RefAll, Fn::Sub, Fn::Cidr]
at Request.extractError (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/protocol/query.js:50:29)
at Request.callListeners (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/request.js:688:14)
at Request.transition (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/request.js:690:12)
at Request.callListeners (/usr/local/lib/node_modules/aws-cdk/node_modules/aws-sdk/lib/sequential_executor.js:116:18) {
code: 'ValidationError',
time: 2021-04-09T11:13:12.367Z,
requestId: 'b26864df-a3de-4c2b-82b6-a2ac9bcf164b',
statusCode: 400,
retryable: false,
retryDelay: 577.931740145933
}
Template Error: Encountered unsupported function: Fn::GetArtifactAtt Supported functions are: [Fn::Base64, Fn::GetAtt, Fn::GetAZs, Fn::ImportValue, Fn::Join, Fn::Split, Fn::FindInMap, Fn::Select, Ref, Fn::Equals, Fn::If, Fn::Not, Condition, Fn::And, Fn::Or, Fn::Contains, Fn::EachMemberEquals, Fn::EachMemberIn, Fn::ValueOf, Fn::ValueOfAll, Fn::RefAll, Fn::Sub, Fn::Cidr] This is how the outputs from template looks like: "Outputs": {
"Output": {
"Value": {
"Fn::GetArtifactAtt": [
"build",
"BucketName"
]
}
},
"Output2": {
"Value": {
"Fn::GetArtifactAtt": [
"build",
"ObjectKey"
]
}
}
} CDK version: |
@matheushent As the error message states, It's a special marker token that can only be used in the |
Ok but, will simply do not change it? |
Sorry, I don't understand your question. Can you rephrase? |
I have been trying to create a deployment pipeline for Lambda function using CodePipeline. During development I noticed there is weird issue which does not allow me to use
Fn::GetArtifactAtt
in theparameterOverrides
(1), because default JSON serializer forces to useFn::Join
which does not acceptFn::GetArtifactAtt
.(1): https://github.com/awslabs/aws-cdk/blob/4af7c0d97b17820a41ef9d611ed6768f62d64a6c/packages/%40aws-cdk/aws-cloudformation/lib/pipeline-actions.ts#L189
I see it was noticed in #566, but for
0.22.0 (build 644ebf5)
version it does not work for me.Expected (one of the possible solution):
Actual:
Error:
The text was updated successfully, but these errors were encountered: